
В этом уроке мы рассмотрим основы конструкции 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:
Пример select Bash
Обычно select используется в сочетании с операторами case of 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 позволяет легко генерировать меню. Она особенно полезна при написании скриптов оболочки, требующих пользовательского ввода.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства