Нет никакого "рецепта" для получения значений статуса выхода данной терминальной команды.
Моя первая попытка была бы страницей справочника:
user@host:~# man ls
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
Во-вторых: Google. См. wget как пример.
В-третьих: статусы выхода оболочки, например, колотите. Bash и это являются builtins, может использовать значения выше 125 особенно. 127 для команды, не найденной, 126 для команды не исполняемый файл. Для получения дополнительной информации см. коды выхода удара.
Bash обычно не заботится о значениях аргументов, его больше волнует их порядок и то, как они разделены в командной строке, по умолчанию разбирая их на основе пробела между каждым аргументом.
Вы можете увидеть это на примере простой конструкции цикла for
в сценарии оболочки, например, так:
#!/bin/bash
echo ""
echo "ARGS: $@"
echo ""
echo "parsed args:"
for i in "$@"; do
echo "$i"
done
$ ./parse.bash -f aPHPscript.php -d memory_limit=120M -d apc=1 \
-d max_execution_time=120
ARGS: -f aPHPscript.php -d memory_limit=120M -d apc=1 -d max_execution_time=120
parsed args:
-f
aPHPscript.php
-d
memory_limit=120M
-d
apc=1
-d
max_execution_time=120
В приведенном выше примере каждая итерация цикла "отслаивает" следующий аргумент, переданный в сценарий parse.bash
. Поэтому вместо использования getopts
вы всегда можете сделать что-то вроде этого.
Я обычно не использую getopts
и делаю все так, как вы спрашиваете, например, с помощью цикла while
, используя оператор case
для разбора аргументов по мере необходимости.
$ more parse2.bash
#!/bin/bash
while [[ $# > 1 ]]
do
key="$1"
shift
# -f aPHPscript.php -d memory_limit=120M -d apc=1
#+ -d max_execution_time=120
case $key in
-f)
f_ARG="$1"
shift
;;
-d)
d_ARGS=( "${d_ARGS[@]}" "$1" )
shift
;;
*)
# unknown option
;;
esac
done
echo "$f_ARG"
echo "${d_ARGS[@]}"
Когда мы запускаем его с вашими аргументами, мы видим, что он смог разобрать ваши -d
аргументы в массив, $d_ARGS
.
$ ./parse2.bash -f aPHPscript.php -d memory_limit=120M -d apc=1 \
-d max_execution_time=120
aPHPscript.php
memory_limit=120M apc=1 max_execution_time=120
Вам придется вызывать getopts
несколько раз. Вы должны позаботиться о том, что делать с аргументами опций. Вы можете использовать индекс, записать все аргументы в -d
в option_d[index_d++]
, чтобы получился массив. Но это не имеет ничего общего с getopts
.