В этом руководстве мы рассмотрим основы конструкции select
в Bash.
Конструкция select
позволяет вам создавать меню.
Содержание
Bash select
Construct
Конструкция select
создает меню из списка элементов. Он имеет почти тот же синтаксис, что и цикл for
:
select ITEM in [LIST]
do
[COMMANDS]
done
[LIST]
может быть серией строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. Д. Пользовательское приглашение для конструкции select
может быть установлено с помощью переменной среды PS3
.
Когда вызывается конструкция select
, каждый элемент из списка печатается на экране (стандартная ошибка), ему предшествует номер.
Если пользователь вводит число, соответствующее номеру одного из отображаемых элементов, то значение [ITEM]
устанавливается на этот элемент. Значение выбранного элемента сохраняется в переменной REPLY
. В противном случае, если пользовательский ввод пуст, подсказка и список меню отображаются снова.
Цикл select
будет продолжать работать и запрашивать ввод данных пользователем, пока не будет выполнена команда break
.
Чтобы продемонстрировать, как работает конструкция select
, давайте взглянем на следующий простой пример:
PS3="Enter a number: "
select character in Sheldon Leonard Penny Howard Raj
do
echo "Selected character: $character"
echo "Selected number: $REPLY"
done
Скрипт отобразит меню, состоящее из элементов списка с соответствующим номером и подсказкой PS3
. Когда пользователь вводит число, скрипт печатает выбранный символ и число:
1) Sheldon
2) Leonard
3) Penny
4) Howard
5) Raj
Enter a number: 3
Selected character: Penny
Selected number: 3
Enter a number:
Bash select
Пример
Обычно select
используется в сочетании с операторами case
if
.
Давайте посмотрим на более практичный пример. Это простой калькулятор, который предлагает пользователю ввести данные и выполняет основные арифметические операции, такие как сложение, вычитание, умножение и деление.
PS3="Select the operation: "
select opt in add subtract multiply divide quit; do
case $opt in
add)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 + $n2 = $(($n1+$n2))"
;;
subtract)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 - $n2 = $(($n1-$n2))"
;;
multiply)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 * $n2 = $(($n1*$n2))"
;;
divide)
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 / $n2 = $(($n1/$n2))"
;;
quit)
break
;;
*)
echo "Invalid option $REPLY"
;;
esac
done
Когда сценарий выполняется, он отображает меню и подсказку PS3
. Пользователю предлагается выбрать операцию, а затем ввести два числа. В зависимости от ввода пользователя скрипт распечатает результат. Пользователю будет предложено выполнить новую операцию после каждого выбора, пока не будет выполнена команда break
.
1) add
2) subtract
3) multiply
4) divide
5) quit
Select the operation: 1
Enter the first number: 4
Enter the second number: 5
4 + 5 = 9
Select the operation: 2
Enter the first number: 4
Enter the second number: 5
4 - 5 = -1
Select the operation: 9
Invalid option 9
Select the operation: 5
Недостатком этого сценария является то, что он может работать только с целыми числами.
Вот немного более продвинутая версия. Мы используем инструмент bc
, который поддерживает числа с плавающей запятой для выполнения математических вычислений. Кроме того, повторяющийся код сгруппирован внутри функции .
calculate () {
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2
echo "$n1 $1 $n2 = " $(bc -l <<< "$n1$1$n2")
}
PS3="Select the operation: "
select opt in add subtract multiply divide quit; do
case $opt in
add)
calculate "+";;
subtract)
calculate "-";;
multiply)
calculate "*";;
divide)
calculate "/";;
quit)
break;;
*)
echo "Invalid option $REPLY";;
esac
done
1) add
2) subtract
3) multiply
4) divide
5) quit
Select the operation: 4
Enter the first number: 8
Enter the second number: 9
8 / 9 = .88888888888888888888
Select the operation: 5
Выводы
Конструкция select
позволяет легко создавать меню. Это особенно полезно при написании сценариев оболочки, требующих ввода данных пользователем.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
app(){
open -a «$*» && echo » run $*»;
}