Получить подстановочное значение из оператора case bash

Мне интересно, как получить значение из подстановочного знака случая? У меня есть массив, который генерирует для меня меню. Затем у меня есть случай, который определяет, какой вариант выбран. Последняя часть оператора case — это подстановочное значение. Я ищу, чтобы получить значение, используемое для подстановочного знака.

Вот код, который я использую:

menu=()
menu+=('Option 1')
menu+=('Option 2')
menu+=('Option 3')
menu+=('Option 4')
menu+=('Quit')

echo "What would you like to install?"
echo " "
select opt in "${menu[@]}"
do
    case $opt in
        'Option 1' )
            echo "Doing Option 1"
            ;;
        'Option 2' )
            echo "Doing Option 2"
            ;;
        'Option 3' )
            echo "Doing Option 3"
            ;;
        'Option 4' )
            echo "Doing Option 4"
            ;;
        'Quit' )
            echo "Quitting installations"
            exit;
            ;;
        * )
            echo "Invalid input: ${opt}"
            ;;
    esac
done

В приведенном выше примере значение «Неверный ввод» всегда пустое. Я могу ввести «foobar» как вариант, и он не отображается. Я также изменил переменную только на $opt, но она все еще не распечатывается.


person Ascalonian    schedule 30.01.2016    source источник


Ответы (1)


Из man bash:

select name [ in word ] ; do list ; done

Список слов, следующих за in, расширяется, создавая список элементов. Набор расширенных слов печатается на стандартной ошибке, каждому предшествует число. Если слово in опущено, распечатываются позиционные параметры (см. ПАРАМЕТРЫ ниже). Затем отображается приглашение PS3 и считывается строка из стандартного ввода. Если строка состоит из числа, соответствующего одному из отображаемых слов, то значение name устанавливается на это слово. Если строка пуста, снова отображаются слова и подсказка. Если EOF прочитан, команда завершается. При чтении любого другого значения для имени name устанавливается значение null. Прочитанная строка сохраняется в переменной REPLY. Список выполняется после каждого выбора, пока не будет выполнена команда прерывания. Статус выхода select — это статус выхода последней команды, выполненной в списке, или ноль, если никакие команды не выполнялись.

Так что просто измени свой

    * )
        echo "Invalid input: ${opt}"
        ;;

to

    * )
        echo "Invalid input: ${REPLY}"
        ;;
person e0k    schedule 30.01.2016
comment
Идеальный! Большое спасибо! - person Ascalonian; 30.01.2016