Getopts: как правильно управлять необязательными аргументами? - PullRequest
0 голосов
/ 07 декабря 2018

Я борюсь со следующим кодом.

#!/bin/bash

test-one () {
  if [[ ! -z $1 ]] ; then
    echo "You are in function test-one with arg $1"
  else
    echo "You are in function test-one with no args"
  fi
}

while getopts ":a:b:" opt; do
   case $opt in
      a) test-one ${OPTARG}
      exit;;
      b) FOO=${OPTARG}
      exit;;
   esac
done

Я просто вызываю функцию test-one независимо от того, передан ли необязательный аргумент или нет.То, что я ищу, это:

./script.sh -a argument1

приведет к:

You are in function test-one with arg argument1

В то время как:

./script.sh -a

приведет к:

You are in function test-one with no args

К настоящему времени пример "./script.sh -a" просто пропускает вызов функции ... Что я делаю не так?Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Что касается сообщений об ошибках, есть два режима, в которых может работать getopts:

подробный режим и режим без вывода сообщений

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

Подробный режим

недопустимая опция VARNAME - это? (знак вопроса) и OPTARG не установлено

обязательный аргумент не найден VARNAME установлен в? (Знак вопроса) , OPTARG не установлен, и выводится сообщение об ошибке

Тихий режим

недопустимая опция VARNAME установлена ​​на ? (знак вопроса) , а OPTARG установлена ​​на (недопустимый) символ опции

обязательный аргумент не найден VARNAME имеет значение : (двоеточие), а OPTARG содержит соответствующий символ опции

Попробуйте это:

#!/bin/bash
while getopts ":a:" opt; do
 case $opt in
   a)
       echo "-a was triggered, Parameter: $OPTARG" >&2
   ;;
  \?)
       echo "Invalid option: -$OPTARG" >&2
       exit 1
   ;;
    :) echo "Option -$OPTARG requires an argument." >&2
       exit 1
   ;;
 esac
done
0 голосов
/ 07 декабря 2018

Когда передается -a, вы передаете значение в командной строке, которое задано в качестве аргумента для -a, хранящееся в OPTARG.Во втором примере у вас такого аргумента нет, поэтому значение получает пустую строку, которая должным образом передается функции.

К сожалению, здесь строка 0 длины не сохраняется в качестве аргумента, и прина самом деле наименьшей будет строка длиной 0, которая «пройдет» тест -z.

Так что для «того, что вы делаете неправильно», кажется, что вы ожидаете, что пустой аргумент будет рассматриваться какнепустой аргумент.Вы можете проверить OPTARG перед использованием его в качестве аргумента, если хотите убедиться, что -a действительно имеет значение, переданное вместе с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...