Linux. Команда getopts
Команды Linux предполагают, что некоторые из переданных аргументов будут опциями. Исторически сложилось так, что это были переключатели в виде одиночных символов, отличающиеся от других параметров стоящей перед ними дефисом. Для удобства некоторые опции могут быть скомбинированы, как в команде ls -lrt
.
Чтобы использовать те же методы в скриптах shell, можно использовать команду getopts
, которая облегчает задачу. Чтобы увидеть, как она работает, рассмотрим пример:
#!/bin/bash
echo "Начальное значение OPTIND равно $OPTIND"
while getopts ":pq:" option ; do
case "$option" in
"p") echo "Найдена опция $option";;
"q") echo "Опция $option имеет значение $OPTARG";;
"?") echo "Неизвестная опция $OPTARG";;
":") echo "Не передано значение для опции $OPTARG";;
* ) echo "Произошла неизвестная ошибка";;
esac
echo "OPTIND имеет значение $OPTIND"
done
Команда getopts
возвращает нулевой код завершения, если опция найдена. Если в командной строке больше не остается аргументов или же текущий аргумент не начинается с дефиса, getopts
возвращает ненулевой код завершения.
Первый аргумент, передаваемый команде getopts
— список букв, обозначающих опции, которые будут распознаваться, в данном случае p
и q
. Двоеточие после буквы показывает, что опция требует значения. Первое двоеточие дает указание не показывать обычные сообщения об ошибках, поскольку этот скрипт имеет собственную обработку ошибок.
Второй аргумент, передаваемый команде getopts
— имя переменной, которая получит имя найденной опции (в нашем примере option
). Если ожидается, что опция будет иметь значение, это значение будет помещено в переменной OPTARG
.
Кроме OPTARG
, есть еще одна предустановленная переменная OPTIND
, которая изначально установлена в 1
. Затем она содержит индекс следующего подлежащего обработке параметра.
Если найдена неопознанная опция, переменная option
будет содержать ?
и OPTARG
будет содержать эту неизвестную опцию.
Если найдена опция, которая требует значения, но значения нет, optname
будет содержать :
и OPTARG
будет содержать имя опции, чей аргумент отсутствует.
Результат работы скрипта:
$ ./testopt.sh -p -q Начальное значение OPTIND равно 1 Найдена опция p OPTIND имеет значение 2 Не передано значение для опции q OPTIND имеет значение 3
$ ./testopt.sh -p -q -r -s tuv Начальное значение OPTIND равно 1 Найдена опция p OPTIND имеет значение 2 Опция q имеет значение -r OPTIND имеет значение 4 Неизвестная опция s OPTIND имеет значение 5