2016-08-02 34 views
1

Ich möchte ein Skript erstellen und nachdem Sie den ersten Befehl eingeben, möchte ich zurück zum vorherigen gesendet werden.#!/Bin/bash lesen, wenn dann wieder zu lesen

Zum Beispiel, wenn Sie x eingeben, möchte ich nach dem y oder z eingeben können. Es kann in demselben Skript getan werden?

Antwort

0

Wickeln Sie den Teil, den Sie in einer Schleife wiederholt werden soll, und überlegen Sie, wie Sie beenden aus der Schleife. Hier wird der Befehl break den Kreis verlassen, wenn Sie eingeben. Andernfalls, nachdem die if-Anweisung abgeschlossen ist, kehren Sie zum Anfang der Schleife für eine weitere Runde zurück.

while true; do 
    read -p " Please enter [x ; y ; z; q]: " COMMAND 
    if [ "$COMMAND" = x ] ; then 
     echo " This is command X. "   
    elif [ "$COMMAND" = y ]; then 
     echo " This is command y. "   
    elif [ "$COMMAND" = z ]; then 
     echo " This is command z" 
    elif [ "$COMMAND" = q ]; then 
     break 
    else 
     echo " Command not found! " 
    fi 
done 

Sie können diese reinigen durch die Verwendung einer case Anweisung statt großer if Aussage auf. Sie können für jede Auswahl mehrere Befehle ausführen. Die ;; signalisiert das Ende jedes einzelnen Blocks.

while true; do 
    read -p " Please enter [x ; y ; z; q]: " COMMAND 
    case $COMMAND in 
     x) echo "This is command X." 
      ;; 
     y) echo "This is command Y." 
      ;; 
     z) echo "This is command Z." 
      ;; 
     q) break ;; 
    esac 
done 

Sie können auch einen speziellen Test anstelle des true Befehls, so dass die Schleife selbst den Wert des Befehls überprüfen und beenden, anstatt für einen expliziten break Befehl wartet.

while [ "$COMMAND" -ne q ]; do 
    read -p " Please enter [x ; y ; z; q]: " COMMAND 
    case $COMMAND in 
     x) echo "This is command X." 
      ;; 
     y) echo "This is command Y." 
      ;; 
     z) echo "This is command Z." 
      ;; 
    esac 
done 
+0

Vielen Dank! Ihr Kommentar hat mir geholfen. Ich mag eher die erste Option mit if. –

0

Eine rekursive Funktion, um die Arbeit leicht

#!/bin/bash 
readfun(){ 
read -p " Please enter [x ; y ; z]: " command # Use lowercase names 
[[ "$command" =~ ^[xyz]$ ]] && readfun 
# logical AND ie '&&' terminates the recursion if any character other than x y z is entered 
} 
readfun #starting point for the script 
echo "Command : ${command} not found" 
+0

Ich würde nicht Rekursion verwenden nur Iteration in der Schale zu simulieren. – chepner

+1

Ich bezweifle sehr, 'bash' ist für Rekursion optimiert; Irgendwann wird dir auf dem Stapel kein Platz mehr sein. Benutze einfach eine Schleife. – chepner

+0

@chepner: Ich bezweifelte, dass rekursive Aufrufe nicht optimiert sind, aber ich wundere mich, dass die Dokumentation darüber nicht erwähnt. – sjsam

0

einfach wickeln Sie das Ganze in eine nie endende while Schleife machen würde:

while true 
do 
    [whatever] 
done 
0

while und case:

#!/bin/bash 
while true 
do 
    read -p " Please enter [x ; y ; z]: " COMMAND 
    case $COMMAND in 
     x) echo " This is command x. " 
      ;; 
     y) echo " This is command y. " 
      ;; 
     z) echo " This is command z. " 
      ;; 
     *) exit 0 
      ;; 
    esac 
done 

In Aktion:

$ bash test.sh 
Please enter [x ; y ; z]: x 
This is command x. 
Please enter [x ; y ; z]: y 
This is command y. 
Please enter [x ; y ; z]: z 
This is command z. 
Please enter [x ; y ; z]: a 
$