В этом руководстве мы рассмотрим основы конструкции 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 $*»;
}