Получить значение подстановочного знака из оператора bash case
Мне интересно, как получить значение из подстановочного знака? У меня есть массив, который генерирует меню для меня. Затем у меня есть случай, который определяет, какой вариант выбран. Последняя часть оператора 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
но это все еще не распечатывает.
1 ответ
От man bash
:
select name [ in word ] ; do list ; done
Список следующих за ним слов расширяется, генерируя список элементов. Набор расширенных слов напечатан на стандартной ошибке, каждому из которых предшествует число. Если слово in опущено, позиционные параметры печатаются (см. ПАРАМЕТРЫ ниже). Затем отобразится приглашение PS3 и строка будет считана со стандартного входа. Если строка состоит из числа, соответствующего одному из отображаемых слов, этому значению присваивается значение имени. Если строка пуста, слова и подсказка отображаются снова. Если EOF читается, команда завершается.Любое другое прочитанное значение приводит к тому, что name устанавливается в null.Считанная строка сохраняется в переменной REPLY. Список выполняется после каждого выбора, пока не будет выполнена команда прерывания. Статусом завершения выбора является статус выхода последней команды, выполненной в списке, или ноль, если команды не были выполнены.
Так что просто поменяйте
* )
echo "Invalid input: ${opt}"
;;
в
* )
echo "Invalid input: ${REPLY}"
;;