Порядок getopts, когда аргумент не передан в option - PullRequest
0 голосов
/ 28 сентября 2018

Моя проблема в том, что, когда я использую фрагменты ниже, скрипт забивает порядок, когда я не даю аргумент опции.Если я включаю аргументы, все хорошо, и я могу вводить опции в любом порядке.

Как я могу убедиться, что различные опции (-s и -f) правильно сопоставлены с их переменными, используя getopts?

Пожалуйста, смотрите пример ниже.

./script.bash -ftestfile -s0

search flag: 0
file: testfile

./script.bash -s0 -ftestfile

search flag: 0
file: testfile

Пока все хорошо ..

Проблема возникает, когда опция f не содержит аргумента (testfile в примерах).Кажется, getopts больше не может распознать, что -s должен быть inputsearch, а -f по-прежнему является inputfile.

./script.bash -f -s0

search flag: 
file: -s0

Волшебство ниже

s=0
while getopts :s:f:ih option
do
case "${option}" in
        s) inputsearch=${OPTARG};;
        f) inputfile=${OPTARG};;
        h) display_help; exit 1;;
        ?) display_help; exit 1;;
esac
done

# crap validation (must contain some option and option cant simply be "-" or "--"
if [ -z "$1" ] || [ "$1" = "-" ] || [ "$1" = "--" ]
then
        display_help
        exit 1
fi

#this fails
if [[ $inputsearch -gt 1 ]] || [[ -z $inputfile ]]
then
        display_help
        exit 1
else
        echo "search flag: $inputsearch"
        echo "file: $inputfile"
fi

Спасибо за ваш вклад!

1 Ответ

0 голосов
/ 28 сентября 2018

Сожалею, что так обстоит дело с простыми getopts.Если он ожидает аргумент, он просто принимает следующее слово в качестве аргумента.Вы получаете сообщение об ошибке только в том случае, если аргументов больше нет.

Вы могли бы проверить аргумент в ошибке перед оператором case?Примерно так, как показано ниже, но вы рискуете пропустить действительный аргумент, например, отрицательное число.

do
  if [ "${OPTARG:0:1}" == "-" ] 
  then 
    echo ERROR: argument ${OPTARG} to -${option} looks like an option
    exit 1
  fi

  case "${option}" in

Вы можете легко добавить дополнительную проверку ошибок, что $ {OPTARG: 1: 1} действительно находится в строке параметров,и, возможно, $ {option} ожидает аргумент.

...