Гайд: синтаксичний аналіз параметрів у 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 спрощує їх використання.

Залишити відповідь

Дякуємо, що поділились