Каждое длинное имя опции в 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
:
Если параметр имеет необязательный аргумент, он должен быть записан непосредственно после длинного имени параметра, разделенного символом
=
, если он присутствует (если вы добавляете символ=
но ничего не ставите за ним, он интерпретируется как отсутствие аргумента; это незначительный аргумент ошибка, см. ошибки).