Unerwarteter EOF- und Syntaxfehler


9

Ich schreibe gerade mein drittes Shell-Skript und bin auf ein Problem gestoßen. Dies ist mein bisheriges Skript:

#!/bin/bash
echo "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script"

while read  
do  
 case in  
        1) who;;  
        2) ls -a;;  
        3) cal;;  
        4) exit;;  
 esac    
done

Wenn ich versuche, das Skript auszuführen, heißt es:

line2 : unexpected EOF while looking for matching '"'  
line14 : syntax error: unexpected end of file.    

Was mache ich falsch?


1
Sicher meinst du "EOF", nicht "ECF"?
10b0

Antworten:


5

Das Problem ist, dass Ihrer caseAussage das Thema fehlt - die Variable, die sie auswerten soll. Daher möchten Sie wahrscheinlich so etwas:

#!/bin/bash
cat <<EOD
choose one of the following options:
1) display all current users
2) list all files
3) show calendar
4) exit script
EOD

while true; do
    printf "your choice: "
    read
    case $REPLY in
        1) who;;
        2) ls -a;;
        3) cal;;
        4) exit;;
    esac    
done

Hier casewird die Standardvariable verwendet, $REPLYdie readgefüllt wird, wenn keine Variablennamen angegeben werden ( help readEinzelheiten siehe ).

Beachten Sie auch die Änderungen: Wird printfverwendet, um die Eingabeaufforderung in jeder Runde anzuzeigen (und keine neue Zeile anzuhängen), catwird verwendet, um Anweisungen in mehreren Zeilen zu drucken, damit sie nicht umbrochen werden und leichter zu lesen sind.


6

Vergessen wir nicht select:

choices=( 
    "display all current users" 
    "list all files" 
    "show calendar" 
    "exit script"
)
PS3="your choice: "
select choice in "${choices[@]}"; do
    case $choice in
        "${choices[0]}") who;;
        "${choices[1]}") ls -a;;
        "${choices[2]}") cal;;
        "${choices[3]}") break;;
    esac
done

1
Dies scheint die bisher sauberste Antwort zu sein. Es wird select verwendet, um genau das zu tun, was das OP erfordert. Die Auswahlmöglichkeiten werden in ein Array eingefügt, das eine hervorragende Möglichkeit darstellt, Daten wie diese zu verarbeiten, und sie für die Verwendung an anderer Stelle im Skript verfügbar macht. Es wird eher break als exit verwendet, damit das Skript nach Abschluss dieses Teils etwas anderes tun kann.
Joe

2

Versuchen wir zunächst einen Einzelfall. Ich werde verwenden read -p, um die Benutzereingabe in eine Variable zu lesen, optgefolgt von einer case-Anweisung wie unten.

#!/bin/bash
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt
case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac

Das obige Skript funktioniert einwandfrei, und ich glaube, Sie müssen es in einer Schleife haben, damit Sie Benutzereingaben lesen können, bis der Benutzer Option 4 drückt.

Wir könnten es also mit einer whileSchleife wie unten machen. Ich setze die Variable optmit dem Anfangswert auf 0. Jetzt iteriere ich in der whileSchleife, solange die optVariable den Wert 0 hat (weshalb ich die optVariable am Ende der caseAnweisung auf 0 zurücksetze ).

#!/bin/bash
opt=0;
while [ "$opt" == 0 ]
do
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt

case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac
opt=0
done

0

Ich persönlich würde das "while" am Anfang des Codes setzen. Wenn Sie dann mit a folgen :, kann es so oft durchlaufen werden, wie Sie möchten. So würde ich es schreiben.

while :
do
    echo "choose one of the following options : \
      1) display all current users \
      2) list all files \
      3) show calendar \
      4) exit script"
    read string
    case $string in
        1)
            who
            ;;

dann mach weiter mit den Fragen und beende mit

esac
done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.