Basic
Цикл for
по умолчанию будет циклически перебирать аргументы командной строки, если вы не укажете предложение in
:
for arg; do
echo "$arg"
done
Если вы хотитебудьте явными, вы можете получить все аргументы как "$@"
.Вышеприведенный цикл эквивалентен:
for arg in "$@"; do
echo "$arg"
done
со страницы руководства bash:
Специальные параметры
$@
- Расширение до позиционных параметров, начинаяот одного.Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово.То есть "$@"
эквивалентно "$1" "$2" ...
.Если расширение в двойных кавычках происходит внутри слова, расширение первого параметра объединяется с начальной частью исходного слова, а расширение последнего параметра объединяется с последней частью исходного слова.Если позиционные параметры отсутствуют, "$@"
и $@
расширяются до нуля (т. Е. Они удаляются).
Advanced
Для обработки аргументов в тяжелых условиях, getopt
+ shift
это путь.getopt
предварительно обработает командную строку, чтобы дать пользователю некоторую гибкость в определении аргументов.Например, он расширится -xzf
в -x -z -f
.После всех флагов добавляется аргумент --
, который отделяет флаги от имен файлов;это позволяет вам запустить cat -- -my-file
, чтобы отобразить содержимое -my-file
без перестановок на начальном тире.
Попробуйте этот шаблонный код для размера:
#!/bin/bash
eval set -- "$(getopt -o a:bch -l alpha:,bravo,charlie,help -n "$0" -- "$@")"
while [[ $1 != -- ]]; do
case "$1" in
-a|--alpha)
echo "--alpha $2"
shift 2
;;
-b|--bravo)
echo "--bravo"
shift
;;
-c|--charlie)
echo "--charlie"
shift
;;
-h|--help)
echo "Usage: $0 [-a ARG] [-b] [-c]" >&2
exit 1
;;
esac
done
shift
Обратите внимание, что каждый параметримеет короткий длинный эквивалент, например, -a
и --alpha
.Флаг -a
принимает аргумент, поэтому он указан как a:
и alpha:
в вызове getopt
, и имеет shift 2
в конце своего регистра.