Bash Script Dificuldade

3

Estou criando um script bash e quero criar um menu. Quando eu executo o código, ele exibe o menu, mas o problema é que quando o usuário digita uma opção, ele continua reimprimindo o menu para perguntar de novo e de novo, independentemente da escolha escolhida.

#!/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
    
por Selena Gomez 24.03.2014 / 02:18

3 respostas

5

O primeiro passo sempre que você está depurando alguma coisa é fazer com que seu script imprima as diversas variáveis que está usando. Por exemplo, aqui, se você adicionar uma echo $choice antes da declaração case , verá que ela imprimirá 0 , independentemente do valor atribuído.

Isso porque você está usando a opção -i para declare , que faz (de help declare ):

  -i    to make NAMEs have the 'integer' attribute

Então, você está declarando que a variável é um inteiro e então está passando letras (strings) e como o bash está esperando um inteiro, ele converte para 0.

A próxima questão é que você está executando um loop while que só sairá quando $choice for 5 . Mesmo se o resto da sua sintaxe estivesse correta, isso só aconteceria na escolha e .

Aqui está um exemplo prático do seu script. Eu removi o declare que é desnecessário.

#!/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"
    
por terdon 24.03.2014 / 03:47
0

Você pode fazer isso usando a função incorporada 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

É mais fácil de usar e você pode ler seu choices do arquivo. Além disso, se quiser sair do menu para qualquer choice , basta adicionar break após cada choice .

    
por c0rp 26.03.2014 / 17:19
0

Abra o terminal e digite:

sudo apt-get install 9menu  

9menu cria menus X a partir do shell. Este é um programa simples que permite criar menus X a partir do shell, onde cada item de menu executará um comando.

Execute o seguinte comando para criar seu menu:

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"'

Tudo é feito por este comando de uma linha, e como 9menu exibe o menu graficamente, não há necessidade de adicionar uma condição de erro de "resposta inválida", porque as entradas do menu são selecionadas no Menu Principal janela com um clique do mouse, e existem apenas cinco entradas possíveis no menu que podem ser selecionadas clicando-as com o mouse.

Sugiro que você faça a seguinte melhoria na sua ideia de menu original. Em vez de exibir "Você digitou e" ao clicar em Sair, por que não usar o item de menu exit para fechar a janela do Menu Principal e sair do 9menu? Para fazer isso, use o seguinte comando:

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  
    
por karel 24.03.2014 / 03:18

Tags