Zwei Menüauswahlen im Bash-Skript

Zwei Menüauswahlen im Bash-Skript

Ich lerne Bash und versuche eine Aufgabe zu lösen.

Die Übung besteht darin, den Vor- und Nachnamen aus einer Menüliste auszuwählen. Wenn der Name jedoch nicht in der Liste enthalten ist, muss er manuell eingegeben werden.

Ich bin jedoch etwas verwirrt, da ich bei Auswahl einer Option nicht weiß, wie ich zum zweiten Menü gelange, ohne die Option „Beenden“ auszuwählen (ich versuche, bei jeder Option „Abbrechen“ hinzuzufügen, aber das funktioniert nicht).

Sie versuchen, bei der manuellen Eingabe die Eingabe des Benutzers zu lesen, sehen aber keinen funktionierenden Vorschlag?

Wie kann ich die Schleife beenden, wenn ich den Vor- und Nachnamen erhalte? Denn wenn ich beides erhalte, gerate ich in dieselbe Schleife.

echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

echo "Hello $opt Next Step is Select your Lastname "
done

PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
    case $opt2 in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

clear
echo "Welcome $opt $opt2"
done

Antwort1

Die selectSchleife würde optauf die Option gesetzt, die der Benutzer ausgewählt hat, und sie würde $REPLYauf das gesetzt, was der Benutzer eingegeben hat. Wenn der Benutzer also 1als Antwort auf Ihre erste Frage eingegeben hat, $REPLYwäre 1und $optwäre Elvis. An keiner Stelle wäre $opt. Option 1Es macht es einfacher, Ihre caseAnweisungen zum Testen zu schreiben $REPLYals $opt.

Außerdem ist es zu früh, die Person mit Namen zu begrüßeninnendie selectSchleife, da wir uns möglicherweise noch nicht sicher sind, ob wir einen richtigen Namen für sie haben. Der Code zwischen dem Ende der caseAnweisung und dem doneEnde der selectSchleife wird ausgeführt, wenn der Benutzer einungültigAuswahl aus dem Menü (das geht auch mit einem *)Kofferetikett).

Es wäre besser, aussagekräftigere Variablennamen wie nameund zu verwenden family. Außerdem benötigen wir nicht zwei separate Arrays zum Speichern der Optionen (tatsächlich ist es fraglich, ob Sie in diesem Fall überhaupt Arrays benötigen, da wir die Zeichenfolgen direkt auflisten könnten).

Im folgenden Code habe ich den Code außerdem mit „ exitwenn der Benutzer wählt“ beendet Quit( breakverlässt die selectSchleife und wir verwenden es, wenn der Benutzer erfolgreich einen Namen ausgewählt hat). Alle interaktiven Dialoge finden wie üblich im Standardfehlerstrom statt.

#!/bin/bash

PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your name is not in the list' >&2
            read -e -r -p "What's your name: " name
            break
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
   esac

   echo 'Try again!' >&2

done
printf 'Hello %s, now select your family name\n' "$name" >&2

PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your family is not in the list' >&2
            read -e -r -p "What's your family: " family
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
    esac

    echo 'Try again!' >&2

done

printf 'Welcome, %s %s!\n' "$name" "$family"

Weitere Kleinigkeiten behoben: Verwenden Sie „ -rwith“ read, um Backslashes richtig lesen zu können, und Sie haben „ PS4statt“ verwendet PS3, um die Auswahlaufforderung in der zweiten Schleife festzulegen.

verwandte Informationen