bash - использование getops для разбора второго аргумента в переменную - PullRequest
0 голосов
/ 03 апреля 2019

Как мне разобрать второй аргумент в переменную, используя bash и getopt в следующем скрипте.

Я могу сделать sh test.sh -u и получить «userENT» для отображения.Но если я выполняю sh test.sh -u testuser в этом сценарии, я получаю сообщение об ошибке.

#!/bin/sh

# Now check for arguments
OPTS=`getopt -o upbdhrstv: --long username,password,docker-build,help,version,\
  release,remote-registry,stage,develop,target: -n 'parse-options' -- "$@"`



while true; do
  case "$1" in
    -u | --username) 
            case "$2" in
               *) API_KEY_ART_USER="$2"; echo "userENT" ;shift ;;
            esac ;;
    -- ) shift; break ;;
    * ) if [ _$1 != "_" ]; then ERROR=true; echo; echo "Invalid option $1"; fi; break ;;

   esac
done
echo "user" $API_KEY_ART_USER

как мне пройти тест -uu -u и не иметь тестового пользователя Invalid option?

output:

>sh test3.sh -u testuser
userENT

Invalid option testuser
user testuser

1 Ответ

1 голос
/ 03 апреля 2019

man getopt скажет вам, что двоеточие после опции указывает на наличие аргумента. У вас есть только двоеточие после v. Вы также не были shift в вашем цикле, так что вы не сможете проанализировать какие-либо параметры после первого. И я не уверен, почему вы почувствовали необходимость иметь второй оператор case, который имел только одну опцию по умолчанию. Кроме того, в вашем коде был ряд плохих практик, включая использование всех имен переменных и обратных кавычек вместо $() для выполнения команд. И вы отметили свой вопрос , но ваш шебанг /bin/sh. Попробуйте, но вы не должны использовать код, не понимая, что он делает.

#!/bin/sh

# Now check for arguments
opts=$(getopt -o u:pbdhrstv: --long username:,password,docker-build,help,version,\
    release,remote-registry,stage,develop,target: -n 'parse-options' -- "$@")

while true; do
    case "$1" in
    -u|--username)
        shift
        api_key_art_user="$1"
        echo "userENT"
    ;;
    --)
        shift;
        break
    ;;
    *)
        if [ -n "$1" ]; then 
            err=true
            echo "Invalid option $1"
        fi
        break
    ;;
    esac
    shift
done
echo "user $api_key_art_user"
...