Сценарии оболочки — выберите цикл

Опубликовано: 30 Сентября, 2022

Цикл выбора — это одна из категорий циклов в программировании на 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

Интерактивные команды (одна за другой) и вывод: