429 Stimmen

If, elif, else-Anweisungsprobleme in Bash

Ich kann anscheinend nicht herausfinden, was das Problem mit der folgenden if-Anweisung in Bezug auf elif und then ist. Beachten Sie, dass printf noch in der Entwicklung ist und ich es noch nicht im Statement getestet habe, daher ist es höchstwahrscheinlich falsch.

Der Fehler, den ich erhalte, lautet:

./timezone_string.sh: Zeile 14: Syntax-Fehler in der Nähe von unerwartetem Token `then'
./timezone_string.sh: Zeile 14: `then'

Und das Statement sieht so aus.

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unbekannter Parameter"
fi

528voto

fedorqui Punkte 249453

Es fehlt ein Leerzeichen zwischen elif und [:

elif[ "$seconds" -gt 0 ]

sollte sein

elif [ "$seconds" -gt 0 ]

Alles zusammen, die zu befolgende Syntax ist:

if [ Bedingungen ]; then
   # Dinge
elif [ andere_Bedingungen ]; then
   # Andere Dinge
else
   # Falls keiner der oben genannten Fälle eintritt
fi

Da diese Frage viele Aufrufe erhält, ist es wichtig anzugeben, dass die folgende Syntax befolgt werden muss:

if [ Bedingungen ]
# ^ ^          ^

was bedeutet, dass Leerzeichen um die Klammern erforderlich sind. Andernfalls funktioniert es nicht. Dies liegt daran, dass [ selbst ein Befehl ist.

Der Grund, warum Sie nichts wie elif[: Befehl nicht gefunden sehen (oder ähnliches), ist, dass die Shell nach if und then nach elif, else oder fi sucht. Sie findet jedoch ein weiteres then (nach dem falsch formatierten elif[). Erst nachdem der Befehl analysiert wurde, würde er ausgeführt werden (und eine Fehlermeldung wie elif[: Befehl nicht gefunden würde ausgegeben).

342voto

anubhava Punkte 713155

Sie haben einige Syntaxprobleme mit Ihrem Skript. Hier ist eine korrigierte Version:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unbekannter Parameter"
fi

28voto

choroba Punkte 214897

[ ist ein Befehl (oder ein eingebauter Befehl in einigen Shells). Er muss durch Leerzeichen von der vorherigen Anweisung getrennt sein:

elif [

9voto

Mr. Weirdo Punkte 115

Ich würde empfehlen, dass Sie sich die Grundlagen der Bedingungen in bash ansehen.

Das Symbol "[" ist ein Befehl und muss ein Leerzeichen davor haben. Wenn Sie nach Ihrem elif kein Leerzeichen angeben, interpretiert das System elif[ als einen bestimmten Befehl, was definitiv nicht das ist, was Sie jetzt wollen.

Verwendung:

elif(EIN ERFORDERLICHES LEERZEICHEN OHNE KLAMMERN)[(EIN LEERZEICHEN OHNE KLAMMERN)Bedingungen(EIN LEERZEICHEN OHNE KLAMMERN)]

Kurz gesagt, bearbeiten Sie Ihr Code-Segment wie folgt:

elif [ "$Sekunden" -gt 0 ]

Sie haben keine Kompilierungsfehler. Ihr abschließendes Code-Segment sollte so aussehen:

#!/bin/sh    
if [ "$Sekunden" -eq 0 ];then
       $zeitzone_string="Z"
    elif [ "$Sekunden" -gt 0 ]
    then
       $zeitzone_string=`printf "%02d:%02d" $Sekunden/3600 ($Sekunden/60)%60`
    else
       echo "Unbekannter Parameter"
    fi

6voto

John Walsh Punkte 179

Fehlender Leerzeichen zwischen elif und [ Der Rest Ihres Programms ist richtig. Sie müssen es korrigieren und überprüfen. Hier ist das korrigierte Programm:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unbekannter Parameter"
fi

Nützlicher Link dazu bash if else Anweisung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X