Verwenden des Befehls `select` zum Drucken eines Menüs in Bash

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 eine break, nicht case.
  • 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 einen break / b> Es kann so leicht passieren, dass sie durcheinander gebracht werden. 🙂
  • @syntaxerror, Sie ' haben Recht, Sie ' brauchen für case. Sie benötigen jedoch eine break, um der select -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ält apache / 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.