Por que isso não faz o loop do menu?

7

Estou usando o GNU bash, versão 4.3.46 em uma máquina Ubuntu. Por alguma razão, esse loop while não funciona como esperado.

O menu deve fazer um loop continuamente até que o usuário decida encerrar o programa, então há alguma verificação de erro solicitando ao usuário se ele tem certeza, então o programa termina.

Este é o código:

#!/bin/bash

menu_choice=0
quit_program="n"

while [[ $menu_choice -ne 3 && $quit_program != "y" ]]
do

    printf "1. Backup\n"
    printf "2. Display\n"
    printf "3. Exit\n\n"

    printf "Enter choice: \n"
    read menu_choice

    if [ $menu_choice -eq 3 ]
    then
        printf "Are you sure you want to quit? (y/n)\n"
        read quit_program

    fi

done

Eu acho que pode ter que com variáveis globais são declaradas no começo e eu estou lendo em um novo valor localmente ...

    
por Konahrik16 26.03.2017 / 20:29

2 respostas

7

O problema está nas suas condições de loop while. Esta linha:

while [[ $menu_choice -ne 3 && $quit_program != "y" ]]

está dizendo "enquanto menu_choice não é 3 e quit_program is y, continue em loop." O problema é que, se uma dessas condições não for mais verdadeira, o loop while terminará.

O que você quer é isto:

while [[ $menu_choice -ne 3 || $quit_program != "y" ]]

usando || em vez de && . Dessa forma, o loop while continuará a fazer o loop, desde que a condição seja verdadeira, em vez de ambas.

    
por TheWanderer 26.03.2017 / 20:51
7

Este script mais simples deve funcionar para você

#!/bin/bash

menu_choice=0
quit_program=false

while [ $quit_program == false ]
do

    printf "1. Backup\n"
    printf "2. Display\n"
    printf "3. Exit\n\n"

    printf "Enter choice: \n"
    read menu_choice

    if [ $menu_choice -eq 3 ]
    then
        printf "Are you sure you want to quit? (y/n) "
        read ask
        if [ $ask == "y" ]
        then
            quit_program=true
        fi

    fi

done

printf "\nDone\n"

Não há necessidade de verificar o menu_choice , para que possa ser removido da verificação do loop while.

No meu exemplo acima, eu apenas configurei um booleano de quit_program que é verificado no loop. Se o usuário escolher a opção 3 e, em seguida, disser "y" para a confirmação, o booleano será configurado como true para eliminar o loop.

Você também pode ir mais longe sem verificar um booleano com isso:

#!/bin/bash

menu_choice=0

while true
do
    printf "1. Backup\n"
    printf "2. Display\n"
    printf "3. Exit\n\n"

    printf "Enter choice: \n"
    read menu_choice

    if [ $menu_choice -eq 3 ]
    then
        printf "Are you sure you want to quit? (y/n) "
        read ask
        if [ $ask == "y" ]; then break; fi
    fi
done

printf "\nDone\n"

Este segundo exemplo realiza a mesma coisa, mas o loop while é executado sem verificar o booleano de antes. O loop é quebrado com o comando break .

    
por Dorian 26.03.2017 / 20:53