Назад | Перейти на главную страницу

Оператор case некорректно работает в сценарии оболочки

Оператор case в сценарии bash не работает. Ниже приведен фрагмент моего сценария оболочки.

usage="Usage: \n servicer [ service argument ] {-h}\n"
invalid="\n not a valid option\n"
argument="\n Please use -h option for help\n"

while getopts ":h:s" option
        do
                case "${option}" in
                        s ) service=$OPTARG;;
                        h ) echo -e $usage
                           exit 0
                        ;;
                        * ) echo -e $invalid
                           exit 1
                        ;;
                esac
        done

Поэтому всякий раз, когда я запускаю свой скрипт с опцией -h или -s, поток переходит к последней опции *.

В man getops страница не самое легкое чтение. Я уверен, что хочешь getopts "hs:" . Двоеточие представляет собой параметр-аргумент (значение параметра) для предыдущей опции (буква).

  • В h не требует параметра, поэтому двоеточие (:).

  • В s требует параметра, следовательно s:. s без параметра также недопустимо, поскольку аргумент требуется двоеточием.

  • Все остальное неверно.

Я бы также поместил ваши статические строки (usage=, invalid=, argument=) в одинарных кавычках и заключите выходные данные в двойные кавычки.

usage='Usage: \n servicer [ service argument ] {-h}\n'
invalid='\n not a valid option\n'
argument='\n Please use -h option for help\n'
while getopts "hs:" option; do
    case "${option}" in
        s) service="$OPTARG"
            ;;
        h) echo -e "$usage"
            exit 0
            ;;
        *) echo -e "$invalid"
            exit 1
            ;;
    esac
done