Ich versuche, ein einfaches Menü mit select
Befehl. Das Skript (zu Testzwecken) lautet wie folgt:
#!/bin/bash echo "*******************" PS3="Select an option and press Enter: " options=("apache" "named" "sendmail") select opt in "${options[@]}" do case $opt in "apache") date ;; "named") echo "test" ;; "sendmail") echo "test 2" ;; *) echo "invalid option";; esac done echo "*********************"
Das Skript erkennt keine gültigen Eingaben, die ich gebe, und gibt immer die Meldung „Ungültige Option“ aus. Was mache ich in diesem Skript falsch?
Kommentare
- Ihre Eingabe ist 1, 2 oder 3, richtig?
Antwort
Ihr von select angezeigtes Menü sieht folgendermaßen aus:
1) apache 2) named 3) sendmail Select an option and press Enter:
Zu diesem Zeitpunkt geben Sie “ 1 „oder“ 2 „oder“ 3 „: Sie geben das Wort nicht ein.
Außerdem wird select
wiederholt, bis eine break
, also möchten Sie Folgendes:
case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac
Wenn Sie dem Benutzer erlauben möchten, entweder die Nummer oder einzugeben Das Wort könnte man so schreiben:
select opt in "${options[@]}"; do case "$opt,$REPLY" in apache,*|*,apache) do_something; break ;; named,*|*,named) do_something; break ;; sendmail,*|*,sendmail) do_something; break ;; esac done
Das Komma hat keine syntaktische Bedeutung, es ist nur da, um eine Musterübereinstimmung auf der $ REPLY durchführen zu können Variable (die der Benutzer tatsächlich eingegeben hat) oder die Variable $ opt
Kommentare
- Die
select
Befehl benötigt einebreak
, nichtcase
. - Danke! Mir war nicht klar, dass es sich um numerische Optionen handelte. Duhh!
- Hah, ich programmiere auch in C und du brauchst dort in jedem Abschnitt eine
break
. In einem case … esac -Block in einem Shell-Skript benötigen Sie jedoch niemals einenbreak
/ b> Es kann so leicht passieren, dass sie durcheinander gebracht werden. 🙂 - @syntaxerror, Sie ' haben Recht, Sie ' brauchen für
case
. Sie benötigen jedoch einebreak
, um derselect
-Schleife zu entkommen. - @glenn jackman Ich hätte dies gerne wurde zu einem hilfreicheren Kommentar (siehe weiter). Es wäre also großartig, wenn Sie zustimmen würden, Ihren Kommentar von 12:55 zu löschen. Ich werde das natürlich auch mit meinem machen.
Antwort
Ihre wird auf das Optionswort gesetzt, das der vom Benutzer eingegebenen Nummer entspricht. Wenn Sie sich ansehen möchten, was der Benutzer tatsächlich eingegeben hat, schauen Sie sich $REPLY
an.
Kommentare
- Vorausgesetzt, die
case
vergleicht$opt
mit " Apache ", " mit dem Namen " und " sendmail ", es ist korrekt und es muss nichts geändert werden. - @manatwork, es sei denn, das OP möchte, dass der Benutzer die Wörter " eingibt apache ", " mit dem Namen " oder " sendmail " anstatt 1, 2 oder 3 zu drücken.
- Interessant. $ REPLY enthält
1
/2
/3
und $ opt enthältapache
/named
/sendmail
- @fred, ja,
$REPLY
ist das, was der Benutzer eingegeben hat. Wenn es sich um eine gültige Nummer handelt, ist$opt
das dieser Nummer entsprechende Wort.