Каков синтаксис удара для извлечения значений от нескольких экземпляров того же аргумента?

Нет никакого "рецепта" для получения значений статуса выхода данной терминальной команды.

Моя первая попытка была бы страницей справочника:

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 для команды не исполняемый файл. Для получения дополнительной информации см. коды выхода удара.

2
01.03.2014, 04:56
2 ответа

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 вы всегда можете сделать что-то вроде этого.

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

Я обычно не использую 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

Ссылки

3
27.01.2020, 21:57

Вам придется вызывать getopts несколько раз. Вы должны позаботиться о том, что делать с аргументами опций. Вы можете использовать индекс, записать все аргументы в -d в option_d[index_d++], чтобы получился массив. Но это не имеет ничего общего с getopts.

2
27.01.2020, 21:57

Теги

Похожие вопросы