У меня есть этот код -
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Когда я запускаю bash getoptDemos.sh
(без опции) он печатает hi
вместо вызова функции usage
. Он вызывает использование, когда заданы параметры, отличные от w, h и l. Тогда это не может работать, когда не указаны параметры.
Я попытался с помощью ?
, \?
, :
вместо , *
но я не могу добиться того, чего я хотел. Я имею в виду все docs
на getopt
говорит , что это использовать ?
.
Что я делаю неправильно?
/bin/bash
Ответы:
Когда вы запускаете этот скрипт без каких-либо опций, getopt возвращает false, поэтому он вообще не входит в цикл. Это просто выпадет на печать - это ksh / zsh?
Если у вас должна быть опция, лучше всего проверить $ name после цикла.
Но
$name
перед вызовом убедитесь, что он пустgetopts
(так как$name
в окружении, полученном при запуске, могла быть оболочка) с(до
getopts
цикла)источник
no argument
условие с помощью bash.getopts
, что такого положения нет. Что хуже, чем это, не может отказать вам.getopts
обрабатывает варианты по очереди. Это его работа. Если пользователь не передает никакой опции, первый вызовgetopts
завершает цикл while.Если ни один из параметров не принимает аргумент, значение
OPTIND
указывает, сколько параметров было передано. В общем,OPTIND
это число аргументов, которые являются опциями или аргументами опций, в отличие от не опциональных аргументов (операндов).В любом случае вы не пытаетесь определить, не было ли никаких опций, но были ли
name
пропущены ни одна из опций -setting. Так что проверьте,name
не сброшено ли (и позаботьтесь о том, чтобы сбросить его первым) .источник
bash sample.sh -abc file.txt
это дает -1 non-option arguments
. как узнать сколько вариантов было дано. (здесь 3)Если ваш сценарий должен получать аргументы параметров в любом случае, поместите этот блок в начале (перед getops).
Блок проверяет, что строка параметра не начинается с
-
символа, что указывает на то, что первый параметр не является аргументом опции.источник
Я бы проверил это с помощью переменной. Если getopts никогда не проходит цикл в случае отсутствия аргумента, вы можете использовать это, например, так:
источник
Непосредственно перед вашим
getopts
блоком проверьте,$1
равен ли (первый аргумент / параметр, который вы передали в командной строке) пустой строке. Если это так, распечатайте сообщение об использовании и выйдите (или выполните некоторую функцию «без параметров», если вы анархист), в противном случае разрешитеgetopts
анализировать параметры как обычно.Причина, по которой эта функция не включена в getopts, заключается в том, что вы уже можете выполнить ее в bash с помощью if-else. Пример:
Есть смысл?
источник