getopts
Тема дорожной карты · Bash
Разбор флагов с помощью getopts в Bash предполагает определение строки параметров, где буквы обозначают флаги, а двоеточие в конце указывает на то, что флаг требует аргумента — например, getopts "vho:" разбирает -v (подробный режим), -h (справка) и -o output, где значение вывода попадает в $OPTARG. Полный шаблон разбора флагов через getopts в shell-скриптах использует структуру while/case, устанавливая булевые переменные вроде verbose=0 для флагов-переключателей и строковые переменные для параметров с аргументами, которые затем проверяются по всему скрипту автоматизации. Ветка ? в блоке case $opt in перехватывает неизвестные флаги и должна выводить сообщение об использовании в stderr и завершаться с кодом 1, следуя стандартному соглашению командной строки Linux. Объединение разбора флагов getopts с функцией usage(), выводящей в >&2, создаёт shell-скрипты, ведущие себя как профессиональные Linux-инструменты командной строки с понятными интерфейсами. Понимание обработки флагов getopts необходимо для написания скриптов автоматизации Bash, удобных для пользователей, тестируемых и совместимых с соглашениями POSIX, принятыми в средах Linux.
Как это работает
getopts: встроенный getopts парсит короткие опции (-a -b value -c). Для длинных (--verbose) + сложного парсинга — внешний getopt (GNU) или ручной while-цикл над "$@" с case. Конвенция: -- разделяет опции от позиционных аргументов; -h / --help показывает usage. Инструмент argbash генерирует парсеры из декларативной спеки.
Когда применять
getopts — для простых скриптов с парой single-letter опций. Ручной парсер — когда нужны long-options + несколько позиционных аргументов. Всегда печатайте usage на -h или плохой input — будущий вы спасибо скажет. Валидируйте required-args рано; падайте с понятной ошибкой.
Типичные ошибки
Ловушки getopts: путаница getopts (встроенный, только short opts) и getopt (внешний, long opts только в GNU); неверная обработка -- (позиционные args с - парсятся как опции); нет usage на ошибке (юзеру читать ваш код, чтобы понять args).