Как я могу обнаружить, что никакие опции не были переданы с getopts?

Преобразуйте число для преобразовывания в шестнадцатеричную систему (в этом случае A) и затем сделайте:

echo -en '\xA' > file
19
12.10.2012, 01:58
5 ответов

Когда Вы запустите этот скрипт без любых опций, getopt возвратит false, таким образом, он не введет цикл вообще. Это будет просто выпадающий к печати - этот ksh/zsh?

Если у Вас должна быть опция, Вы - лучший выбор, должен протестировать $name после цикла.

if [ -z "$name" ]
then
   usage
   exit
fi

Но удостоверьтесь $name было пусто перед вызовом getopts (как, возможно, был a $name в среде оболочка, полученная на запуске) с

unset name

(прежде чем getopts цикл)

16
27.01.2020, 19:44
  • 1
    нет. его удар. Таким образом, как делают я достигаю того, что я хочу - обрабатывают no argument условие с помощью удара. –  Hussain Tamboli 11.10.2012, 11:59
  • 2
    Если Вы хотите обязательную опцию, я не думаю, что это возможно - вероятно, почему их называют, опции :) You могут протестировать $name, хотя, после цикла для проверки он был установлен. если [-z "$name"]; затем использование; выход; fi –  Julian 11.10.2012, 12:08
  • 3
    спасибо. вышеупомянутому коду действительно помогают. Его слишком плохое getopts не имеет такого условия. То, что хуже, чем это, не может upvote Вы. –  Hussain Tamboli 11.10.2012, 12:14
  • 4
    , что, если я выполнял другую оболочку? zsh, sh. кто-либо окружает кроме удара, заботятся об этом условии? –  Hussain Tamboli 11.10.2012, 13:30

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

Если ни одна из опций не берет аргумент, значение OPTIND указывает, сколько опций было передано. В целом, OPTIND количество аргументов, которые являются опциями или аргументами опциям, в противоположность аргументам неопции (операнды).

while getopts …; do …; done
if [ $OPTIND -eq 1 ]; then echo "No options were passed"; fi
shift $((OPTIND-1))
echo "$# non-option arguments"

В любом случае Вы не пытаетесь определить, не было ли никаких опций, но ли ни один из name- были переданы устанавливающие опции. Так проверяют если name сброшен (и заботьтесь для сбрасывания его сначала).

20
27.01.2020, 19:44
  • 1
    спасибо. +1 для Вас. когда я поместил последние 3 строки из Вашего кода в sample.sh и работал bash sample.sh -abc file.txt это дает - 1 non-option arguments. как я узнаю, сколько опций было дано. (здесь 3) –  Hussain Tamboli 12.10.2012, 08:14
  • 2
    Странный никто не прокомментировал эту небольшую ошибку - если никакие опции не будут даны, то OPTIND будет 1 после этого 'в то время как getopts...' цикл. Таким образом, если проверка должна проверить равенство с 1, не нуль. использование –  Daniel 22.05.2015, 01:07

Если ваш сценарий должен получать аргументы опций в любом случае, поместите этот блок в начало (перед getops).

if [[ ! $@ =~ ^\-.+ ]]
then
  #display_help;
fi

Блок проверяет, что строка параметров не начинается с символа - , что указывает на то, что первый параметр не является аргументом опции.

4
27.01.2020, 19:44

Непосредственно перед блоком getopts проверьте, равен ли $ 1 (первый аргумент / параметр, который вы передали в командной строке) пустой строке. Если это так, распечатайте сообщение об использовании и выйдите (или выполните некоторую функцию «без параметров», если вы анархист), в противном случае позвольте getopts проанализировать параметры, как обычно.

Причина, по которой эта функция не включена в getopts, заключается в том, что вы уже можете выполнить это в bash с помощью «if-else». Пример:

if [[ $1 == "" ]]; then
    Your_Usage_Function;
    exit;
else
   #parse options with getopts code block here;
fi

Имеет смысл?

0
27.01.2020, 19:44

Вы всегда должны инициализировать свои переменные перед их использованием! Это препятствует тому, чтобы уже -заданные переменные испортили ваш скрипт, и, кроме того, позволяет позже проверить статус, чтобы убедиться, что они были установлены правильно.

#getoptDemo.sh
usage()
{
    echo "usage: <command> options:<w|l|h>"
}

name=false

while getopts wlh: option
do
    case $option in
            (w)
                    name='1';;
            (l)
                    name='2';;
            (h)
                    name='3';;
            (*)
                    usage
                    exit;;
    esac
done

if [[ $name == false ]]; then
    usage();
    exit 1;
fi

print 'hi'$name
0
21.04.2020, 18:12

Теги

Похожие вопросы