Сложность скрипта Bash

3

Я создаю скрипт 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
    
задан Selena Gomez 24.03.2014 в 02:18
источник

3 ответа

5

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

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

  -i    to make NAMEs have the 'integer' attribute

Итак, вы объявляете эту переменную как целое число, а затем передаете ей буквы (строки), а так как bash ожидает целое число, оно преобразует его в 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"
    
ответ дан terdon 24.03.2014 в 03:47
источник
0

Вы можете сделать это, используя встроенную функцию 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 .

    
ответ дан c0rp 26.03.2014 в 17:19
0

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

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 отображает меню графически, нет необходимости добавлять условие ошибки «недействительного ответа», поскольку элементы меню выбираются из главного меню с щелчком мыши, и в меню есть только пять возможных записей, которые можно выбрать, щелкнув их мышью.

Я предлагаю вам сделать следующее усовершенствование исходной идеи меню. Вместо того, чтобы отображать «Вы ввели e», когда вы нажимаете «Выход», почему бы не использовать пункт меню exit , чтобы закрыть окно Главное меню и выйти из 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  
    
ответ дан karel 24.03.2014 в 03:18