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 select
Schleife würde opt
auf die Option gesetzt, die der Benutzer ausgewählt hat, und sie würde $REPLY
auf das gesetzt, was der Benutzer eingegeben hat. Wenn der Benutzer also 1
als Antwort auf Ihre erste Frage eingegeben hat, $REPLY
wäre 1
und $opt
wäre Elvis
. An keiner Stelle wäre $opt
. Option 1
Es macht es einfacher, Ihre case
Anweisungen zum Testen zu schreiben $REPLY
als $opt
.
Außerdem ist es zu früh, die Person mit Namen zu begrüßeninnendie select
Schleife, da wir uns möglicherweise noch nicht sicher sind, ob wir einen richtigen Namen für sie haben. Der Code zwischen dem Ende der case
Anweisung und dem done
Ende der select
Schleife 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 name
und 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 „ exit
wenn der Benutzer wählt“ beendet Quit
( break
verlässt die select
Schleife 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 „ -r
with“ read
, um Backslashes richtig lesen zu können, und Sie haben „ PS4
statt“ verwendet PS3
, um die Auswahlaufforderung in der zweiten Schleife festzulegen.