Как в bash создать интерактивное меню с динамически подставляемыми вариантами выбора?

  • 3 ноября 2023 г. 9:19
Ответы на вопрос 2
В bash можно создать интерактивное меню с помощью цикла `while` и оператора `select`. Для динамического добавления вариантов выбора можно использовать массивы.

Вот пример скрипта, который демонстрирует создание интерактивного меню с динамическим выбором вариантов:

```bash
#!/bin/bash

# Массив с вариантами выбора
options=("Вариант 1" "Вариант 2" "Вариант 3" "Выход")

# Функция, которая будет выполняться при выборе варианта
function handle_choice() {
  case $1 in
    1)
      echo "Вы выбрали вариант 1"
      ;;
    2)
      echo "Вы выбрали вариант 2"
      ;;
    3)
      echo "Вы выбрали вариант 3"
      ;;
    4)
      echo "Выход"
      exit 0
      ;;
    *)
      echo "Некорректный вариант"
      ;;
  esac
}

# Бесконечный цикл для отображения меню
while true
do
  # Печатаем варианты выбора
  echo "Выберите один из вариантов:"
  select option in "${options[@]}"
  do
    # Обрабатываем выбранный вариант
    handle_choice $REPLY
    break
  done
done
```

Вы можете добавить или удалить варианты выбора, изменяя значения в массиве `options`. Функция `handle_choice` будет выполняться при выборе варианта и может быть настроена для выполнения необходимых действий.

Примечание: Данный скрипт использует `select` для интерактивного выбора варианта. Он доступен только в bash и не будет работать в других оболочках, таких как sh или dash.
select, for, while, until - это четыре команды, которые создают цикл. Например:

for a in 1 2; do
  for b in 1 3; do
    select list; do
      while something; do
        break
      done
    done
  done
done

Это нормальное использование всех циклов. Однако в вашем скрипте может быть ошибка или неправильное написание команды case. Я не совсем понял задачу, но вы можете посмотреть пример ниже, возможно, это поможет:

jsonlist="$(jq '.[][]|keys[]' sites.json|tr -d \")"
select action in ${jsonlist}; do
  echo "[$action]"
  test "$action" == "title" && break
  newlist="$(jq ".[][][\"$action\"][]" sites.json)"
  echo "$newlist"
done
Похожие вопросы