Команда getopts

Команда getopts является встроенной командой командной оболочки bash, предназначенной для разбора параметров сценариев. Она обрабатывает исключительно однобуквенные параметры как с аргументами, так и без них и этого вполне достаточно для передачи сценариям любых входных данных.

Базовый синтаксис команды выглядит следующим образом:

$ getopts строка-параметров переменная [набор-параметров]

Строка параметров формируется из принимаемых сценарием однобуквенных параметров с символами двоеточия после тех из них, которые должны использоваться совместно с аргументами (символ двоеточия в начале строки активирует режим сокрытия сообщений об ошибках). Переменная используется для хранения текущего параметра. Набор параметров позволяет осуществлять разбор пользовательского списка параметров вместо параметров сценария (используется достаточно редко). В ходе обработки параметров сценария могут использоваться такие переменные, как переменная $OPTARG, содержащая аргумент текущего параметра, переменная $OPTIND, содержащая номер следующего за текущим параметра и переменная $OPTERR, содержащая значение 0 или 1, указывающее на необходимость вывода сообщений об ошибках при обработке каждого из параметров (перед обработкой каждого из параметров устанавливается значение 1, поэтому вам придется самостоятельно устанавливать значение 0 для сокрытия сообщений об ошибках). Чаще всего обработка параметров осуществляется в рамках цикла while с вложенной конструкцией switch-case, причем в случае необходимости обработки дополнительных аргументов сценариев (например, в случае передачи списка файлов) после цикла используется конструкция shift "$(($OPTIND -1))". Команда корректно обрабатывает как отдельно переданные параметры (например, -a -b -c), так и объединенные параметры (например, -abc).

Примеры использования

Разбор параметров сценария

Для разбора параметров сценария достаточно использовать команду getopts в рамках цикла while.

  1. #!/bin/bash
  2.  
  3. #Переменные состояния
  4. showdate=false
  5. filename=''
  6.  
  7. #Обработка параметров сценария
  8. while getopts ':df:h' OPTION; do
  9.  case "$OPTION" in
  10.     d)
  11.       showdate=true ;;
  12.    
  13.     f)
  14.       filename="$OPTARG" ;;
  15.    
  16.     h)
  17.       echo "Использование: $(basename $0) [-d] [-f имя-файла] [-h]"
  18.       exit 1
  19.       ;;
  20.    
  21.     ?)
  22.       echo "Неизвестный параметр" >&2
  23.       exit 1
  24.       ;;
  25.   esac
  26. done
  27.  
  28. #Сдвиг параметров сценария
  29. shift "$(($OPTIND -1))"
  30.  
  31. #Вывод текущей даты при наличии флага showdate
  32. if [ ${showdate} = true ]; then
  33.   echo "Текущая дата: " `date`
  34. fi
  35.  
  36. #Вывод содержимого файла при наличии пути в переменной filename
  37. if [ ! -z ${filename} ]; then
  38.   echo "Содержимое файла '$filename':"
  39.   cat $filename
  40. fi

Данный сценарий будет принимать параметры -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
Неизвестный параметр

Сценарий сообщает о наличии неизвестного параметра и завершает работу.