Введение
В этом уроке мы рассмотрим основы конструкции select
в Bash.
Конструкция select
позволяет создавать меню.
Конструкция Select в Bash
Конструкция select
создает меню из списка элементов. У него почти такой же синтаксис, как for
цикла 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
используется в сочетании с операторами 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
, который поддерживает числа с плавающей запятой для выполнения математических вычислений. Кроме того, повторяющийся код группируется внутри функции.
Установите инструмент bc
на Debian, Ubuntu, Linux Mint и производные:
sudo apt install bc
Установите инструмент bc
на CentOS, Red Hat и Fedora:
sudo yum install 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
позволяет легко создавать меню. Это особенно полезно при написании сценариев оболочки, требующих ввода данных пользователем.