7 votes

Pourquoi ça ne tourne pas en boucle dans le menu ?

J'utilise GNU bash, version 4.3.46 sur une machine Ubuntu. Pour une raison quelconque, cette boucle while ne fonctionne pas comme prévu.

Le menu doit tourner en boucle jusqu'à ce que l'utilisateur décide de quitter le programme, puis il y a un contrôle d'erreur demandant à l'utilisateur s'il est sûr, puis le programme se termine.

Voici le code :

#!/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

Je pense que cela peut être dû au fait que les variables globales sont déclarées au début et que je lis une nouvelle valeur localement...

7voto

TheWanderer Points 18999

Le problème se situe dans les conditions de votre boucle while. Cette ligne :

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

dit "tant que menu_choice n'est pas 3 et quit_programme n'est pas y, continuez à boucler." Le problème est que, si l'une de ces conditions n'est plus vraie, la boucle while se termine.

Ce que vous voulez, c'est ça :

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

en utilisant || 代わりに && . De cette façon, la boucle while continuera à tourner tant que l'une des deux conditions est vraie, au lieu des deux.

7voto

Delorean Points 10073

Ce script plus simple devrait fonctionner pour vous

#!/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"

Il n'est pas nécessaire de continuer à vérifier le menu_choice de sorte qu'il peut être supprimé de la vérification de la boucle while.

Dans mon exemple ci-dessus, je viens de définir un booléen de quit_program qui est vérifié dans la boucle. Si l'utilisateur choisit l'option 3, puis dit "oui" à la confirmation, alors le booléen est mis à true pour tuer la boucle.

Vous pouvez également aller encore plus loin sans vérifier un booléen avec ceci :

#!/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"

Ce deuxième exemple accomplit la même chose, mais la fonction while La boucle s'exécute simplement sans vérifier le booléen d'avant. La boucle est interrompue avec la commande break à la place.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X