it-swarm.com.de

Warum wird das Menü nicht in einer Schleife angezeigt?

Ich verwende GNU bash, Version 4.3.46 auf einem Ubuntu-Rechner. Aus irgendeinem Grund funktioniert diese while-Schleife nicht wie erwartet.

Das Menü sollte kontinuierlich wiederholt werden, bis der Benutzer das Programm beendet. Anschließend wird der Benutzer durch eine Fehlerüberprüfung dazu aufgefordert, zu prüfen, ob er sicher ist. Anschließend wird das Programm beendet.

Hier ist der 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

Ich denke es muss evtl. mit globalen Variablen am Anfang deklariert werden und ich lese lokal einen neuen Wert ein ...

7
Konahrik16

Das Problem liegt in Ihrer while-Schleife. Diese Linie:

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

sagt "solange menu_choice nicht 3 ist nd quit_program nicht y, mache eine Schleife." Das Problem ist, dass die while-Schleife endet, wenn eine dieser Bedingungen nicht mehr erfüllt ist.

Was Sie wollen, ist das:

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

verwenden von || anstelle von &&. Auf diese Weise wird die while-Schleife fortgesetzt, solange eine der beiden Bedingungen erfüllt ist.

7
TheWanderer

Dieses einfachere Skript sollte für Sie funktionieren

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

Es ist nicht erforderlich, den menu_choice ständig zu überprüfen, damit er aus der Prüfung der while-Schleife entfernt werden kann.

In meinem obigen Beispiel habe ich gerade einen Booleschen Wert von quit_program festgelegt, der in der Schleife überprüft wird. Wenn der Benutzer Option 3 auswählt und dann zur Bestätigung "y" sagt, wird der Boolesche Wert auf "true" gesetzt, um die Schleife zu beenden.

Sie können auch noch weiter gehen, ohne einen Booleschen Wert zu überprüfen:

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

Dieses zweite Beispiel führt dasselbe aus, aber die while -Schleife wird nur ausgeführt, ohne den Booleschen Wert von zuvor zu überprüfen. Die Schleife wird stattdessen mit dem Befehl break unterbrochen.

7
Dorian