Bash case case
Я пытаюсь изучить случай, поскольку я должен был написать полностью функциональный script.
Я начинаю с ниже
#!/bin/sh
case [email protected] in
-h|--help)
echo "You have selected Help"
;;
-B|-b)
echo "You have selected B"
;;
-C|-c)
echo "You have selected C"
;;
*)
echo "Valid Choices are A,B,C"
exit 1
;;
esac
Я хочу использовать две из этих опций:
./getopts.sh -h -c
Но я получаю этот результат Возможные варианты: A, B, C
Пожалуйста, помогите мне узнать, что я делаю неправильно?
Я хочу создать script, который сделает что-то, если вы введете один параметр, но делаете несколько вещей, если вы вводите несколько.
Также как бы разобрать $1 на этот script как surley, который когда-либо выбирал я, первый (-h) будет $1??
Спасибо!
Ответы
Ответ 1
Попробуйте это
#!/bin/sh
usage() {
echo `basename $0`: ERROR: $* 1>&2
echo usage: `basename $0` '[-a] [-b] [-c]
[file ...]' 1>&2
exit 1
}
while :
do
case "$1" in
-a|-A) echo you picked A;;
-b|-B) echo you picked B;;
-c|-C) echo you picked C;;
-*) usage "bad argument $1";;
*) break;;
esac
shift
done
Ответ 2
Использование getopt
или getopts
- лучшее решение. Но чтобы ответить на ваш непосредственный вопрос, [email protected]
- это все ваши аргументы, поэтому -h -c
, который не соответствует ни одному шаблону с одним аргументом в вашем случае. Вам все равно нужно перебирать аргументы так:
for arg in "[email protected]"; do
case $arg in
....
esac
done
Ответ 3
чтобы проанализировать позиционные аргументы, такие как... $1, просто используйте $1 в случае stmt, а затем в конце... используйте shift, чтобы погрузить второй arg в $1 и аналогично.
также я бы поставил case stmt в цикл while или лучше fxn, так что я могу запустить его дважды для двух опций или количества параметров..........
$# позволит вам узнать, сколько опций/аргументов было.