Гайд: синтаксичний аналіз параметрів у Bash
Скрипт або сценарій оболонки Bash — це текстовий файл з набором команд, що потрібно виконати в певному порядку і/або за певними умовами. Він потрібен для того, щоб користувачі Linux не вводили багато команд. Розгляньмо способи синтаксичного аналізу параметрів в Bash.
* Bash — найпопулярніший командний інтерпретатор в Unix-подібних системах, зокрема GNU/Linux.
Парсинг опцій в Bash
Стратегія синтаксичного аналізу опцій в Bash полягає в тому, щоб:
- перебрати всі аргументи, які передали вашим сценарієм оболонки,
- визначити, є вони опцією чи ні,
- перейти до наступного аргументу.
Повторюйте цей процес, поки не залишиться варіантів.
Почніть з простої логічної опції (перемикач або прапор, як вам зручно):
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
У цьому коді створюємо while цикл. Він служить до тих пір, поки не зникнуть додаткові аргументи для обробки. if намагається зіставити будь-який аргумент, знайдений в першій позиції ($1) чи –alpha або -a.(Це довільні імена параметрів, вони не мають особливого значення. У реальному сценарії ви можете використовувати –verbose і -v для запуску докладного виведення).
Ключове слово shift змушує всі аргументи зміщатися на 1, таким чином, що аргумент в положенні 2($2) переміщається в положення 1($1). Оператор else запускається, коли більше немає аргументів для обробки, що переривають while цикл.
В кінці скрипту на термінал виводиться значення $ALPHA.
Протестуйте скрипт:
$ bash ./test.sh --alpha
1
$ bash ./test.sh
$ bash ./test.sh -a
1
Виявлення аргументів в Bash
Існує проблема: зайві аргументи ігноруються.
$ bash ./test.sh --alpha foo
1
$
Щоб зловити аргументи, які не призначені для використання як опції, завантажте аргументи, що залишилися в масиві Bash. Для цього введіть:
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
Протестуйте нову версію скрипту:
$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo
foo
$ bash ./test.sh --alpha foo bar
1
foo
bar
Параметри з аргументами
Деякі параметри вимагають окремого аргументу. Наприклад, ви можете дозволити користувачеві встановлювати атрибут (колір, дозвіл зображення) або щось інше.
Щоб реалізувати це в Bash, ви можете використовувати shift, як і у випадку з логічними перемикачами, але аргументи слід зрушити на 2 замість 1.
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done
echo $ALPHA
echo $CONFIG
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
В цей код можна додати elif пропозицію для порівняння аргументів –config і -c.У разі збігу значення змінної з ім’ям, CONFIG встановлюється рівним значенню другого аргументу (це означає, що для –config потрібен аргумент). Всі аргументи зсуваються на 2: 1 — щоб зрушити –config або -c, і 1 — щоб перемістити свій аргумент. Зазвичай, цикл повторюється до тих пір, поки не залишиться аргументів, що збігаються.
Ось тест нової версії скрипту:
$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz
Підсумок
Є й інші способи синтаксичного аналізу параметрів в Bash. Ви можете по черзі використовувати case або getopt. Що б ви не вибрали, параметри для користувачів є важливими функціями будь-якої програми, і Bash спрощує їх використання.