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, так что я могу запустить его дважды для двух опций или количества параметров..........

$# позволит вам узнать, сколько опций/аргументов было.