отображать все 4 варианта каждый раз в меню выбора - PullRequest
1 голос
/ 18 февраля 2020

Я новичок в bash. Я хочу иметь меню выбора в bash. У него четыре варианта. Вот код:

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Option 4")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Option 2")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Option 3")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Exit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

Когда я выполняю этот код, появляется полное меню в первый раз с 4 опциями, но только позже (только 2-й, 3-й и ... раз) "Пожалуйста, введите ваш выбор: "появляется. Я хочу каждый раз, когда все 4 варианта появляются как в первый раз.

Как еще одна проблема, я хочу, чтобы каждый раз, когда программа выполнялась и 4 опции появлялись заново, предыдущие команды и содержимое терминала очищались. Я сделал это, поставив «clear» перед:

select opt in "${options[@]}"

, но таким образом только при первом удалении содержимого терминала.

Что я могу сделать, чтобы решить эти проблемы?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вам нужно будет добавить новый l oop, который встраивает ваше меню, а затем добавить еще break в каждый случай, а для варианта 4 отредактировать до break 2, как показано в коде ниже. Я также добавил опцию очистки экрана после выбора опции.

#!/bin/bash
PS3='Please enter your choice: '
while true; do
    clear
    options=("Option 1" "Option 2" "Option 3" "Exit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Option 1")
                echo "you chose choice $REPLY which is $opt"
                break
                ;;
            "Option 2")
                echo "you chose choice $REPLY which is $opt"
                break
                ;;
            "Option 3")
                echo "you chose choice $REPLY which is $opt"
                break
                ;;
            "Exit")
                break 2
                ;;
            *) echo "invalid option $REPLY";;
        esac
    done
done

Таким образом, случай использования этого кода будет:

$ ./select.sh
1) Option 1
2) Option 2
3) Option 3
4) Exit
Please enter your choice: 1
you chose choice 1 which is Option 1
1) Option 1
2) Option 2
3) Option 3
4) Exit
Please enter your choice: 2
you chose choice 2 which is Option 2
1) Option 1
2) Option 2
3) Option 3
4) Exit
Please enter your choice: 3
you chose choice 3 which is Option 3
1) Option 1
2) Option 2
3) Option 3
4) Exit
Please enter your choice: 4

$

Добавление паузы после выбора

Если вы хотите, чтобы пользователь мог прочитать выбранную опцию, вы можете добавить следующую строку перед последним done кода:

read -p "Press [Enter] key to continue..."

Таким образом, пользователь увидит сообщение и придется нажать клавишу Enter, чтобы снова отобразить меню.

И случай использования этого будет:

1) Option 1
2) Option 2
3) Option 3
4) Exit
Please enter your choice: 1
you chose choice 1 which is Option 1
Press [Enter] key to continue...
1 голос
/ 18 февраля 2020

Если пользователь нажимает ввод, не делая какого-либо выбора , меню будет отображаться заново. Насколько я знаю, единственный способ программно принудительно заставить меню быть нарисованным снова - заключить оператор select в другой l oop и повторно выполнить оператор select. Вы будете использовать break для выхода из select и возврата в верхнюю часть оболочки l oop и break 2 для выхода из select и оболочки.

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Option 4")
<b>while :; do</b>
  select opt in "${options[@]}"
  do
    case $opt in
        "Option 1")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Find Subdomain")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Option 3")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Option 4")
            <b>break 2</b>
            ;;
        *) echo "invalid option $REPLY";;
    esac
    <b>break</b>
  done
<b>done</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...