Трудность со сценарием Bash

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

#!/bin/bash

declare -i choice=1;

while ((choice!=5))
    do
    echo "Main Menu:"
    echo -e "\t(a) Add"
    echo -e "\t(b) Remove"
    echo -e "\t(c) Seach"
    echo -e "\t(d) Display"
    echo -e "\t(e) Exit"
    echo -n "Please enter your choice:"
    read choice
    case $choice in
           "a"|"A")
            echo "You entered a"
            ;;
            "b"|"B")
            echo "You entered b"
            ;;
            "c"|"C")
            echo "You entered c"
            ;;
            "d"|"D")
            echo "You entered d"
            ;;
            "e"|"E")
            echo "You entered e"
            ((choice=5))
            ;;
            *)
            echo "invalid answer"
            ;;

    esac
done
3
задан 5 September 2016 в 14:28

3 ответа

Первый шаг каждый раз, когда Вы отлаживаете что-то, должен иметь Вашу печать сценария различные переменные, которые это использует. Например, здесь, если Вы добавляете echo $choice прежде case оператор, Вы будете видеть, что он распечатает 0, неважно, что оценивает Вас, дают его.

Это вызвано тем, что Вы используете -i опция к declare, который делает (от help declare):

  -i    to make NAMEs have the `integer' attribute

Так, Вы объявляете, что переменная, чтобы быть целым числом и затем передает его буквы (строки) и так как удар ожидает целое число, это преобразовывает его в 0.

следующий выпуск - то, что Вы работаете while цикл, который только выйдет, когда $choice будет 5. Даже если бы остальная часть Вашего синтаксиса была в порядке, который только произошел бы для выбора e.

Вот рабочий пример Вашего сценария. Я удалил declare, который является ненужным.

#!/bin/bash

## Use another variable to exit the loop
ok=0;

while ((ok==0))
    do
    echo "Main Menu:"
    echo -e "\t(a) Add a contact"
    echo -e "\t(b) Remove a contact"
    echo -e "\t(c) Seach contacts"
    echo -e "\t(d) Display contacts"
    echo -e "\t(e) Exit"
    echo -n "Please enter your choice:"
    read choice
    case $choice in
        "a"|"A")
        ok=1
            ;;
        "b"|"B")
        ok=1
            ;;
        "c"|"C")
        ok=1
            ;;
        "d"|"D")
            ok=1
        ;;
        "e"|"E")
            exit
        ;;
            *)
            echo "invalid answer, please try again"
            ;;

    esac
done

echo "You entered $choice"
5
ответ дан 1 December 2019 в 15:39

Можно сделать это с помощью сборки - в функции select:

echo "Main Menu:"
echo -e "\t(a) Add a contact"
echo -e "\t(b) Remove a contact"
echo -e "\t(c) Seach contacts"
echo -e "\t(d) Display contacts"
echo -e "\t(e) Exit"
echo "Please enter your choice:"

choices=("a" "b" "c" "d" "e" "Quit")
select choice in "${choices[@]}"
do
    case $choice in
        "a")
            echo "you chose choice a"
            ;;
        "b")
            echo "you chose choice b"
            ;;
        "c")
            echo "you chose choice c"
            ;;
        "d")
            echo "you chose choice d"
            ;;
        "e")
            echo "you chose choice e"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

легче использовать, и можно считать Ваш choices из файла. Также, если хотят выйти из меню для какого-либо choice, просто добавьте break после каждого choice.

0
ответ дан 1 December 2019 в 15:39

Откройте терминал и тип:

sudo apt-get install 9menu  

9menu создает X меню из оболочки. Это - простая программа, которая позволяет Вам создавать X меню из оболочки, куда каждый пункт меню выполнит команду.

Выполнение следующая команда для создания меню:

9menu -label "Main Menu" 'Add:echo "You entered a"' 'Remove:echo "You entered b"' 'Search:echo "You entered c"' 'Display:echo "You entered d"' 'Exit:echo "You entered e"'

Это все сделано этой короткой командой, и потому что 9menu отображает меню графически, нет никакой потребности добавить "недопустимый ответ" состояние ошибки, потому что записи меню выбраны из окно Main Menu щелчком мышью, и существует только пять возможных записей в меню, которое может быть выбрано путем нажатия на них с мышью.

я предлагаю, чтобы Вы сделали следующее улучшение своей идеи исходного меню. Вместо того, чтобы отобразиться "Вы ввели e" при нажатии на Exit, почему бы не использовать выход пункт меню для закрытия окно Main Menu и выход от 9menu? Сделать это тот путь использование следующая команда:

9menu -label "Main Menu" 'Add:echo "You entered a"' 'Remove:echo "You entered b"' 'Search:echo "You entered c"' 'Display:echo "You entered d"' exit  
0
ответ дан 1 December 2019 в 15:39

Другие вопросы по тегам:

Похожие вопросы: