Почему моя функция bash не может разобрать необязательный аргумент?

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

у man bash .

Я написал optionarg 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 }

Давай проверим мой вариант здесь.
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 ответа


Лично я бы сделал это только в 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

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

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

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

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


Есть идеи?

10000