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