Bash длинные опции/флаги - как это сделать?

Я пытаюсь изменить свой рабочий script с помощью getopts на getopt (длинные флаги). Ниже я представляю свой код, который работает.

getopts 'm:' mode
modeValue=$OPTARG

getopts 'p:' parameter
parameterValue=$OPTARG

getopts 'u:' parameter
parameterValue2=$OPTARG

getopts 'l:' parameter 
parameterValue3=$OPTARG

getopts 'n:' parameter 
parameterValue4=$OPTARG

getopts 'e:' parameter 
parameterValue5=$OPTARG

getopts 'w:' parameter 
parameterValue6=$OPTARG

getopts 'r:' parameter 
parameterValue7=$OPTARG

case $modeValue in
    addRepository)
          doAddRepository "$parameterValue" "$parameterValue7"
          exit $?
        ;;
    addProject)
          doAddProject "$parameterValue"
          exit $?
        ;;
    addUser)
          doAddUser "$parameterValue2" "$parameterValue4" "$parameterValue5" "$parameterValue6"
          exit $?
        ;;
    assignProject)
          doAssignProject "$parameterValue" "$parameterValue2" "$parameterValue3"
          exit $?
        ;;
    *)
          #echo "$doShowUsage"    
          exit 1
        ;;
esac

Теперь мой script работает следующим образом:

For add repository: ./script.sh -m addRepository -p NameOfTheProject -r NameOfTheRepository

Я хочу отредактировать это для чего-то вроде этого:

./script.sh --mode addRepository --project NameOfTheProject --repo NameOfTheRepository

Я начал изменять код и добавил то, что я ниже:

 TEMP=`getopt -o m:p:u:l:n:e:c:r: --long mode:,project:,username:,level:,name:,email:,pass:,repo: -n 'test.sh'
    -- "[email protected]"` eval set -- "$TEMP"

while true ; do
    case "$1" in
        -m|--mode)
            case "$2" in
                addRepository)
                        doAddRepository=$2 ; shift 2 ;;
                addProject)
                        doAddProject=$2 ; shift 2 ;;
                addUser)
                        doAddUser=$2 ; shift 2 ;;
                assignProject)
                        doAssignProject=$2 ; shift 2 ;;
                esac ;;
        -h|--help)
            case "$2" in
                *) echo "$doShowUsage"
                   exit 1
                esac ;;
        esac done

Мой вопрос: правильно ли я делаю это? Как добавить параметры в функции doAddProject/Repository/User...? Может кто-нибудь дать мне несколько советов? Выше функции получили разное количество параметров, поэтому взгляните на него.

Спасибо!

Ответ 1

Стефан Chazelas написал очень хороший getops-long shell script, который я использую в bash отладчик. Вы можете скопировать этот script и использовать его.

Если вы запустите эту переменную настройки программы test_getopts_long, например

test_getopts_long=1 bash getopts_long.sh

вы увидите обширные примеры того, как использовать, и он проверяет себя.