Search code examples
bashscriptingflagsgetopts

Bash with getopts/flags and multiple functions


I have problem with getopts. When i write ./nameofscript.sh -n name - it should make a new repository but it says to me : -- n is unknown option and in new line: Adding user with name: blank.

Why does it happen ?

    #!/bin/bash


    #what2do=${0##*/}
    #what2do=${what2do%.sh}


    what2do="addProject"
    what2do="addRepository"
    what2do="addUser"


    doAddRepository ()  {
     local repoName="$1"
    echo "Adding repo with name: $repoName"
     # Adding new repository with the name $repoName...
    }
    doAddProject ()  {
     local projName="$1"
    echo "Adding project with name: $projName"
     # Adding new project with the name $projName...
    }
    doAddUser ()  {
     local userName="$1"
    echo "Adding user with name: $userName"
     # Some code to add user "$userName"...
    }

case $what2do in
addRepository)
      while getopts 'n:' key; do
        case $key in
          n) REPO_NAME=$OPTARG ;;
        esac
      done
      doAddRepository "$REPO_NAME"
      exit $?
    ;;
addProject)
      while getopts 'm:' key; do
        case $key in
          m) PROJ_NAME=$OPTARG ;;
        esac
      done
      doAddProject "$PROJ_NAME"
      exit $?
    ;;
addUser)
      while getopts 'u:' key; do
        case $key in
          u) USER_NAME=$OPTARG ;;
        esac
      done
      doAddUser "$USER_NAME"
      exit $?
    ;;
    *)
      echo "I don't know how to $what2do. Maybe, it is NIY" >&2
    #  doShowUsage
      exit 1
    ;;
esac

Solution

  • The problem is you define what2do variable 3 times at the beginning of your code:

    what2do="addProject"
    what2do="addRepository"
    what2do="addUser
    

    And final value of what2do variable is addUser. And following code is executed in case block. Which expects -u option.

    enteraddUser)
      while getopts 'u:' key; do
        case $key in
          u) USER_NAME=$OPTARG ;;
        esac
      done
      doAddUser "$USER_NAME"
      exit $?
    

    Following is code sample:

        #!/bin/bash
    
        what2do="addProject"
        what2do="addRepository"
        what2do="addUser"
    
    
        doAddRepository ()  {
         local repoName="$1"
        echo "Adding repo with name: $repoName"
         # Adding new repository with the name $repoName...
        }
        doAddProject ()  {
         local projName="$1"
        echo "Adding project with name: $projName"
         # Adding new project with the name $projName...
        }
        doAddUser ()  {
         local userName="$1"
        echo "Adding user with name: $userName"
         # Some code to add user "$userName"...
        }
    
    getopts 'm:' mode
    modeValue=$OPTARG
    
    getopts 'p:' paremter
    parameterValue=$OPTARG
    
    case $modeValue in
    addRepository)
          doAddRepository "$parameterValue"
          exit $?
        ;;
    addProject)
          doAddProject "$parameterValue"
          exit $?
        ;;
    addUser)
          doAddUser "$parameterValue"
          exit $?
        ;;
        *)
          echo "I don't know how to $modeValue. Maybe, it is NIY" >&2
        #  doShowUsage
          exit 1
        ;;
    esac
    

    And following is usage:

    ./script.sh -m addProject -p ProjectName
    ./script.sh -m addUser -p UserName
    ./script.sh -m addRepository -p RepositoryName