Команда getopts является встроенной командой командной оболочки bash, предназначенной для разбора параметров сценариев. Она обрабатывает исключительно однобуквенные параметры как с аргументами, так и без них и этого вполне достаточно для передачи сценариям любых входных данных.
Базовый синтаксис команды выглядит следующим образом:
$ getopts строка-параметров переменная [набор-параметров]
Строка параметров формируется из принимаемых сценарием однобуквенных параметров с символами двоеточия после тех из них, которые должны использоваться совместно с аргументами (символ двоеточия в начале строки активирует режим сокрытия сообщений об ошибках). Переменная используется для хранения текущего параметра. Набор параметров позволяет осуществлять разбор пользовательского списка параметров вместо параметров сценария (используется достаточно редко). В ходе обработки параметров сценария могут использоваться такие переменные, как переменная $OPTARG, содержащая аргумент текущего параметра, переменная $OPTIND, содержащая номер следующего за текущим параметра и переменная $OPTERR, содержащая значение 0 или 1, указывающее на необходимость вывода сообщений об ошибках при обработке каждого из параметров (перед обработкой каждого из параметров устанавливается значение 1, поэтому вам придется самостоятельно устанавливать значение 0 для сокрытия сообщений об ошибках). Чаще всего обработка параметров осуществляется в рамках цикла while с вложенной конструкцией switch-case, причем в случае необходимости обработки дополнительных аргументов сценариев (например, в случае передачи списка файлов) после цикла используется конструкция shift "$(($OPTIND -1))". Команда корректно обрабатывает как отдельно переданные параметры (например, -a -b -c), так и объединенные параметры (например, -abc).
Для разбора параметров сценария достаточно использовать команду getopts в рамках цикла while.
Данный сценарий будет принимать параметры -d, -f и -h. Параметр -d активирует вывод текущей даты и не позволяет использовать каких-либо аргументов. Параметр -f выводит содержимое текстового файла и предусматривает передачу пути к этому файлу. Параметр -h предназначен для вывода информации о поддерживаемых параметрах и завершения работы сценария.
Пример использования параметров -d и -f:
$ sh test.sh -d -f /home/alexf/test.txt
Текущая дата: Вт апр 24 18:38:08 MSK 2018
Содержимое файла '/home/alexf/test.txt':
test file
Очевидно, что сценарий вывел текущую дату и содержимое текстового файла, размещенного по указанному пути.
Пример использования параметра -h:
$ sh test.sh -d -f /home/alexf/test.txt -h
Использование: test.sh [-d] [-f имя-файла] [-h]
Несмотря на наличие других параметров, выводится информация об использовании сценария, как и должно быть.
Пример использования неподдерживаемого параметра:
$ sh test.sh -d -f /home/alexf/test.txt -l
Неизвестный параметр
Сценарий сообщает о наличии неизвестного параметра и завершает работу.