Сценарии оболочки — выберите цикл
Цикл выбора — это одна из категорий циклов в программировании на bash. Цикл выбора в оболочке может быть остановлен в двух случаях только при наличии оператора break или прерывания клавиатуры. Основная цель использования цикла выбора заключается в том, что он представляет пользователю различные элементы данных в виде нумерованного списка. Пользователь может легко выбрать один из вариантов, перечисленных программой.
Синтаксис общего цикла выбора приведен ниже.
Синтаксис:
select myVariable in variable1 variable2 ... variableN
do
# body to be executed for
# every value in the sequence.
doneЗдесь myVariable — это переменная, которая используется для ссылки на каждое из значений от variable1 до variableN.
Пример 1:
В приведенной ниже программе мы создаем пронумерованное меню, позволяющее пользователю (или студенту Btech) выбирать отдел.
Исходный код:
# Program to demonstrate the working of a
# select-loop in shell scripting
# PS3="Enter your choice ==> "
# echo "What is your department?"
select department in CS IT ECE EE
do
case $department in
CS)
echo "I am from CS department."
;;
IT)
echo "I am from IT department."
;;
ECE)
echo "I am from ECE department."
;;
EE)
echo "I am from EE department."
;;
none)
break
;;
*) echo "Invalid selection"
;;
esac
doneВыход:

Пример 2:
В приведенной ниже программе мы создаем пронумерованное меню, чтобы пользователь мог выбрать номер. Как только число выбрано пользователем, мы показываем, является ли число четным или нечетным.
Исходный код:
# Program to demonstrate the working of
# a select-loop in shell scripting
# PS3="Enter your choice ==> "
# echo "Choose a number:"
select num in 1 2 3 4 5 6 7
do
case $num in
2|4|6|8)
echo "Even number."
;;
1|3|5|7)
echo "Odd number."
;;
none)
break
;;
*) echo "ERROR: Invalid selection"
;;
esac
doneВыход:

Выберите цикл с подсказками ввода:
Мы можем подсказывать пользователям, прежде чем запрашивать какой-либо выбор из меню, с помощью переменной PS3 в программировании bash. Эта переменная должна быть объявлена перед циклом выбора. Значение или строка, с которой инициализируется переменная PS3, используется для запроса пользователя на консоли.
Пример 1:
В приведенной ниже программе мы предложили пользователю «Введите ваш выбор ==>».
Исходный код:
# Program to demonstrate the working of a
# select-loop in shell scripting
PS3="Enter your choice ==> "
echo "What is your department?"
select department in CS IT ECE EE
do
case $department in
CS)
echo "I am from CS department."
;;
IT)
echo "I am from IT department."
;;
ECE)
echo "I am from ECE department."
;;
EE)
echo "I am from EE department."
;;
none)
break
;;
*) echo "Invalid selection"
;;
esac
doneВыход:

Пример 2:
В этой программе мы предложили пользователю «Введите ваш выбор ==>».
Исходный код:
# Program to demonstrate the working of a
# select-loop in shell scripting
PS3="Enter your choice ==> "
echo "Choose a number:"
select num in 1 2 3 4 5 6 7
do
case $num in
2|4|6|8)
echo "Even number."
;;
1|3|5|7)
echo "Odd number."
;;
none)
break
;;
*) echo "ERROR: Invalid selection"
;;
esac
doneВыход:

Передайте параметры в цикл выбора в bash
Когда достигается конец файла (EOF) ввода, цикл выбора завершается в bash. Но в случае команды, переданной нашему сценарию, вывод предыдущей команды становится вводом для текущей команды.
Давайте разберемся, что означает команда pipe в bash. Труба считается одним из самых мощных операторов в оболочке. Обозначается символом (|). Канал принимает выходные данные одной команды и использует их в качестве входных данных для другой. И мы не ограничены одной конвейерной командой, но мы можем складывать их столько раз, сколько вам нужно, или до тех пор, пока у вас не закончатся выходные данные или файловые дескрипторы. Но в случае select-loop использование команды pipe out может привести к отсутствию вывода, как показано в программе ниже.
Пример:
Исходный код:
# Program to demonstrate the working of a
# select-loop in shell scripting
# script: select-loop-bash.sh
select department in CS IT ECE EE
do
case $department in
CS)
echo "I am from CS department."
;;
IT)
echo "I am from IT department."
;;
ECE)
echo "I am from ECE department."
;;
EE)
echo "I am from EE department."
;;
none)
break
;;
*) echo "Invalid selection"
;;
esac
doneИнтерактивные команды (одна за другой) и вывод:

Трубопровод:

Как исправить отсутствие вывода при использовании команды pipe out?
Эту проблему можно решить, убедившись, что меню выбора будет считываться из «/dev/tty» и что мы передаем параметр с правильным разделителем слов с помощью команд «echo» или «printf».
Пример:
Исходный код:
# Program to demonstrate the working of a
# select-loop in shell scripting
# script: select-loop-bash.sh
select department in CS IT ECE EE
do
case $department in
CS)
echo "I am from CS department."
;;
IT)
echo "I am from IT department."
;;
ECE)
echo "I am from ECE department."
;;
EE)
echo "I am from EE department."
;;
none)
break
;;
*) echo "Invalid selection"
;;
esac
done < /dev/ttyИнтерактивные команды (одна за другой) и вывод:
