Ich versuche, ein einfaches Menü mit dem select
Befehl zu implementieren . 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?
bash
shell-script
select
Sumod
quelle
quelle
Antworten:
Ihr von select angezeigtes Menü sieht folgendermaßen aus:
Zu diesem Zeitpunkt geben Sie "1" oder "2" oder "3" ein: Sie geben das Wort nicht ein.
Außerdem
select
wird eine Schleife ausgeführt, bis einbreak
Befehl angezeigt wird. Sie möchten also Folgendes:Wenn Sie dem Benutzer erlauben möchten, entweder die Nummer oder das Wort einzugeben, können Sie Folgendes schreiben:
Das Komma hat keine syntaktische Bedeutung. Es dient lediglich dazu, die Musterübereinstimmung entweder für die Variable $ REPLY (die vom Benutzer tatsächlich eingegeben wurde) oder für die Variable $ opt zu erstellen
quelle
select
Befehl braucht einbreak
, nichtcase
.break
dort in jedem Abschnitt ein. Allerdings werden Sie nie brauchenbreak
in einem Fall ... esac Block in einem Shell - Skript . Es kann so leicht passieren, dass sie durcheinander geraten. :-)break
zucase
. Sie benötigen jedoch einebreak
, um derselect
Schleife zu entkommen .Ihre
$opt
Variable wird auf das Optionswort gesetzt, das der vom Benutzer eingegebenen Nummer entspricht . Wenn Sie sehen möchten, was der Benutzer tatsächlich eingegeben hat, schauen Sie sich an$REPLY
.quelle
case
Vergleiche$opt
mit "Apache", "Named" und "Sendmail" ist dies korrekt und es muss nichts geändert werden.1
/2
/3
und $ opt hältapache
/named
/sendmail
$REPLY
ist das, was der Benutzer eingegeben hat, und wenn es eine gültige Nummer war,$opt
ist dies das Wort, das dieser Nummer entspricht.