RHEL6 getopts не работает

У меня есть новая машина RHEL6, и я пытаюсь запустить скрипт для генерации некоторого вывода. Скрипт использует getopts, которые я никогда не использовал в прошлом. Это должно было работать на других машинах, но я впервые пробую это. Ниже начало сценария. Что-то не так с синтаксисом? Когда я пытаюсь вывести переменные, он ничего не отображает:

#! /bin/sh

while getopts "h:u:g:o:e:y:bf" c
 do
     case "$c" in
       u)         USER=$OPTARG;;
       g)         GROUP=$OPTARG;;
       o)         OUT=$OPTARG;;
       b)         BATCH=1;;
       f)         FORCE=1;;
       h)         FQDN=$OPTARG;;
       e)         ENTITYID=$OPTARG;;
       y)         YEARS=$OPTARG;;
       \?)        echo "keygen [-o output directory (default .)] [-u username to own keypair] [-g owning groupname] [-h hostname for cert] [-y years to issue cert] [-e entityID to embed in cert]"
                  exit 1;;
     esac
 done
echo $FQDN

Эхо отображает пустую строку.

1 ответ

Решение

Вы не можете использовать знак вопроса с bash getopts (вы также не можете использовать двоеточие). В случае знака вопроса, getopts устанавливает значение аргумента ($c в вашем случае) до вопросительного знака, когда встречается конец опций. Он также использует вопросительный знак и двоеточие в качестве значения имени аргумента при возникновении ошибки (в частности,? Используется, когда встречается недопустимая опция или когда используется режим без вывода сообщений и обязательная опция не указана; двоеточие используется в режиме без вывода сообщений). режим, когда обязательная опция не указана). В этих случаях ошибки OPTARG содержит ошибочный аргумент. Так работает POSIX getopts.

Getopts KSH ведет себя по-разному, но это также исключает ? : (так же как - [ ] и только позволяя # как первый вариант). Тем не менее, он показывает сообщение об использовании, когда вы предоставляете -?, В основном, не используйте -? с оболочкой гетопц.:)

Обычно я пишу небольшую функцию под названием "использование" и вызываю ее как из *) и проверяя $? сразу после оператора case для ненулевого значения.

Другие вопросы по тегам