Почему моя bash функция не может разобрать необязательный аргумент? - PullRequest
1 голос
/ 10 февраля 2020

Каждое длинное имя опции в longopts может сопровождаться одним двоеточием, чтобы указать, что у него есть обязательный аргумент, и двумя двоеточиями, чтобы указать, что у него есть необязательный аргумент.

в man bash.

Я написал bash функцию optionarg:

optionarg (){
    opts=$(getopt -o , --long name:,pass:: -- "$@")
    eval set -- "$opts"
    while true; do
        case "$1" in
            --name)
                name=$2
                echo  "name is " $name
                shift 2;;
            --pass)
                case "$2" in 
                    '')
                        echo "no pass argument"
                        shift 2;; 
                    *)
                        pass=$2
                        echo  "pass" $pass
                        shift 2;;
                esac;;               
            --)
                shift 1;;
            *)  break;;
        esac
    done }

Давайте проверим здесь мой optionarg.
1.Назначаем аргумент без pass.

optionarg --name tom --pass
name is  tom
no pass argument

2. Назначьте аргумент xxxx с помощью pass.

optionarg --name tom --pass xxxx
name is  tom
no pass argument

Как исправить мою функцию optionarg, чтобы получить такой вывод?

optionarg --name tom --pass xxxx
name is  tom
pass xxxx

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Длинные опции используют = для присвоения необязательного значения:

$ optionarg --name tom --pass=xxxx
name is  tom
pass xxxx

Это задокументировано в man getopt:

Если опция имеет необязательный аргумент, она должен быть записан непосредственно после длинного имени опции, разделенного =, если он присутствует (если вы добавили =, но ничего за ним не было, это интерпретировалось, как если бы не было аргумента; это небольшая ошибка, см. BUGS ).

1 голос
/ 10 февраля 2020

Лично я бы сделал это только с case

optionarg () {
    while [[ $@ ]]; do
        case "$1" in
            --name|-n) name=$2;;
            --pass|-p) pass=$2;;
        esac               
        shift
    done
    echo "name=$name"
    echo "pass=$pass"
}

Использование

$ optionarg --name user --pass dfgd
name=user
pass=dfgd

$ optionarg -n user -p dfgd
name=user
pass=dfgd
...