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

Я создаю скрипт 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
1
задан 5 September 2016 в 14:28

2 ответа

Вы можете сделать это с помощью встроенной функции 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
ответ дан 24 May 2018 в 10:29

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

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

Я предлагаю вам сделать следующее усовершенствование исходной идеи меню. Вместо того, чтобы отображать «Вы ввели e», когда вы нажимаете «Выход», почему бы не использовать элемент меню выхода, чтобы закрыть окно Главное меню и выйти из 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
ответ дан 24 May 2018 в 10:29
  • 1
    возможно, это полезный комментарий, но он не объясняет, почему сценарий не работает. – miracle173 24 March 2014 в 12:23
  • 2
    @ miracle173 Оба сценария работают. Первый скрипт записывается в спецификации, указанные в вопросе. Второй скрипт имеет усовершенствование по сравнению с оригинальным дизайном, указанным в вопросе, что дает ему более удобное условие выхода. Вы утверждаете, что скрипт не работает. Вы сначала запустили sudo apt-get install 9menu перед запуском скрипта? Помните, что это скрипт shell , поэтому необходимо сначала установить требуемую программу терминала. – karel 24 March 2014 в 12:37
  • 3
    ваш ответ не объясняет, почему сценарий OP не работает – miracle173 24 March 2014 в 13:19
  • 4
    @ miracle173 Вы математик с репутацией как один, поэтому я пытаюсь полностью объяснить это вам, не проявляя ни малейшего снисхождения. Код bash в вопросе - 37 строк плохо сконструированного кода. Код bash в моем ответе - 1 строка правильно построенного кода bash. Мое объяснение математику состоит в том, что мой код разработан, чтобы быть кратким, точным и правильно сформулировать задание без каких-либо дополнительных доказательств контрпримерами. Я прошу вас быть благотворительными и считать это с моей точки зрения. – karel 24 March 2014 в 13:37
  • 5
    Должен сказать, я согласен с @ miracle173. Ваш код просто вводит ненужную зависимость для чрезвычайно простой задачи, и вы предполагаете, что графический интерфейс лучше, пока вы не знаете, для чего будет сценарий. Это был вопрос bash, и вы ввели X-программу, которая сразу же затрудняет ее установку, менее переносимую и более тяжелую. Он также не отвечает на фактический вопрос, который был «что случилось с моим скриптом»? Хотя это может быть полезным инструментом, вы не объясняете, как это можно интегрировать в скрипт, как OP поймает выбор пользователя и обработает его в своем сценарии? – terdon♦ 26 March 2014 в 21:21

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

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