Конструкция 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 = " $(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 позволяет легко создавать меню. Это особенно полезно при написании сценариев оболочки, требующих ввода данных пользователем.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Оставьте комментарий