Конструкция Select в Bash (Создание меню)
В этом руководстве мы рассмотрим основы конструкции 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 k">$(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 позволяет легко создавать меню. Это особенно полезно при написании сценариев оболочки, требующих ввода данных пользователем.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Команда выбора Bash
Команда ‘ Select ‘ — очень полезная команда bash для создания меню bash. Различные типы задач генерации меню, создание списка директоров на основе меню, создание меню из содержимого файла и т. Д. Могут быть выполнены с помощью команды bash select. В этом руководстве показано, как реализовать эти типы задач с помощью команды bash select.
Здесь пункт меню будет создан из data_list, который может быть массивом или другим источником данных. Каждый пункт меню извлекается из data_list и сохраняется в переменной для создания меню. Команду «Выбрать» можно также использовать с командой «case» для создания меню. Здесь на очень простых примерах показаны различные типы задач создания меню.
Пример-1: Создание простого меню
Create файл bash с именем select1.sh со следующим сценарием bash. Здесь команда ‘select’ извлечет все данные из списка и распечатает их в виде меню. Следующий скрипт содержит названия брендов мобильных телефонов, и после выполнения скрипта он создаст меню мобильных брендов и попросит пользователя выбрать любой бренд. Будет напечатано название выбранной марки. Пользователь должен нажать Ctrl + c для выхода из скрипта.
#!/Bin/bash
# Определить список меню здесь
выберите бренд в Samsung Sony iphone symphony Walton
сделать
echo «Вы выбрали $ brand»
готово
Следующий вывод появится после запуска скрипта и выбора пункта меню номер 1 и 4.
Пример-2: Выберите команду с помощью оператора case
Показано, как вы можете создать меню bash с помощью оператора case. в этом примере. Создайте файл bash с именем select2.sh с помощью следующего сценария bash. После запуска скрипта пользователь выберет любой пункт меню, и оператор case сопоставит выбранное значение со значением case. Здесь несколько значений case используются для сопоставления с выбранным пунктом меню. Если ни одно из значений case не совпадает с выбранным пунктом меню, будет напечатано «Invalid entry».
# Здесь в качестве источника данных используются имена операционных систем
выберите ОС в Ubuntu LinuxMint Windows8 Windows7 WindowsXP
do
case $ os in
# Здесь объявлены два значения case для сопоставления
«Ubuntu» | «LinuxMint»)
echo «Я также использую $ os. «
;;
# Здесь объявлены три значения регистра для сопоставления
» Windows8 «|» Windows10 «|» WindowsXP «)
echo» Почему бы и нет вы пробуете Linux? «
;;
# Сопоставление с недопустимыми данными
*)
echo» Неверная запись. «
break
;;
esac
done
Вывод:
Запустите сценарий.
Для другого выбора будет отображаться другой вывод. Здесь 1 выбирается в первый раз, то есть Ubuntu . оно соответствует первому регистру, напечатайте сообщение «Я также использую Ubuntu» . В следующий раз будет выбрано 4, а пункт меню — Windows7 , но нет case с этим именем. Итак, на этот раз он напечатал «Недопустимая запись» и завершил работу скрипта.
Пример 3: Создание вложенного меню bash
Когда какое-либо меню создается под другим меню, оно вызывается вложенное меню. Вложенное меню можно создать добавлен в базу с помощью двух или более операторов select и case. Создайте файл bash с именем select3.sh с помощью следующего сценария bash. Здесь два оператора select и case используются для реализации вложенного меню. Родительское меню содержит 4 элемента, а подменю — 3 элемента.
#!/Bin/bash
, а true
do
# Здесь объявлены элементы родительского меню
выберите элемент в Mouse Printer Monitor HDD
do
# оператор case для сравнения первых элементов меню
case $ item в
Мышь)
echo «Какой тип монитора вам нравится?»
;;
Принтер)
# Подменю здесь объявлены элементы
select sub_item в Samsung HP Dell
do
# оператор case для элементов солнечного меню
case $ sub_item в
Samsung)
echo «Цена принтера samsung составляет 100 долларов США»
break
;;
HP)
echo «Новый принтер HP 880 цена принтера составляет 450 долларов США. «
# возврат в родительское меню
break
;;
Dell)
echo» Сейчас нет доступных принтеров Dell «
# вернуться в родительское меню
break 2
;;
esac
done
break
;;
Monitor)
echo «Купите наш новый монитор Samsung по низкой цене»
break # возврат в текущее (главное) меню
;;
HDD)
ec ho «Жесткие диски хорошего качества доступны на складе»
# возврат из скрипта
break 2
esac
готово
готово
После запуска скрипта отображается родительское меню с 4 пунктами. Здесь только второй пункт родительского меню содержит подменю. После выбора 2 появилось подменю, а когда пользователь выбрал 3, отобразилось соответствующее сообщение пункта меню 3 и вернулось обратно в родительское меню.
Пример 4: Создание меню bash с массивом
Переменная массива может хранить несколько данных. Таким образом, вы можете использовать массив в качестве данных список для создания базового меню. В этом примере показано, как использовать массив с оператором select для создания меню. Создайте файл bash с именем select4.sh с помощью следующего сценария bash. Подпрограмма Bash используется в этом скрипте для создания меню из массива. Используется массив с тремя элементами и вызывается menu_from_array () для создания меню. Скрипт проверяет выбранный пункт меню. число находится в диапазоне от 1 до 3 или нет. Если число находится за пределами этого диапазона, пользователю будет предложено выбрать его в этом диапазоне, он напечатает пункт меню выбора с другим текстом.
select item; do
# Проверить номер выбранного пункта меню
if [1 -le «$ REPLY «] && [» $ REPLY «-le $ #];
затем
echo» Выбранная операционная система — $ item «
break ;
else
echo «Неправильный выбор: выберите любое число от 1 до $ #»
fi
done
>
# Объявление массива
linux = (‘Ubuntu’ ‘Linux Mint’ ‘CentOS’)
# Вызов подпрограммы для создания меню
menu_from_array «$ »
Здесь сначала выбирается 2, находящееся в пределах диапазона, и печатается текст. 6 выбирается во второй раз за пределами диапазона и предлагает пользователю выбрать число в пределах диапазона.
Заключение
Задача создания меню Bash с использованием оператора select объясняется в этом руководстве как можно проще. Надеюсь, что кодировщик, который хочет поработать с меню bash и изучить инструкцию выбора bash, получит помощь из этого руководства. Спасибо.