2013-06-17 15 views
12
#!/bin/bash 
function getComment(){ 
    local lang=$1; 
    local theComment=$2; 
    if [$lang == "Java"] #Surprisingly, an error occurs here: prog.sh: line 6: [Java: command not found 
    then 
     echo "//"$theComment; return; 
    else 
     echo "Language not found!"; return; 
    fi 
} 

getComment "Java" "Whoo!"; 

exit $? 

Ich bin ein Bash-Skript zu schreiben, die eine Variable auf einen Stringliteral vergleicht, und ich bin mit [$lang == "Java"] (wie oben dargestellt) den Wert von lang-"Java" vergleichen . Jedoch erzeugt dieser Vergleich den folgenden Fehler:vergleichen Bash Stringliteral auf eine lokale Variable

stderr: 
prog.sh: line 6: [Java: command not found 

Ich habe versucht, mit [$lang -eq "Java"] und ($lang -eq "Java") als gut, aber diese Aussagen hat nicht funktioniert, und sie erzeugt genau den gleichen Fehler.

Warum tritt dieser Fehler auf, und wie wird eine lokale Variable mit einem Zeichenfolgenliteral verglichen?

+0

Dies ist nicht relevant für Ihre Frage, aber Sie brauchen keine Semikolons am Ende der Zeilen in der Shell. Sie werden nur benötigt, wenn Sie mehr als einen Befehl in eine Zeile schreiben. –

+0

mögliches Duplikat von [bash, Befehl nicht gefunden] (http://stackoverflow.com/questions/16694586/bash-command-not-found) – chepner

+1

Nicht das beste Duplikat, aber es gibt viele Fragen zu Stack Overflow mit der gleichen Antwort : Setzen Sie Leerzeichen um '' '' '' '' '' ' – chepner

Antwort

22

Sie benötigen Räume um [ und ]:

if [ "$lang" = "Java" ] 

[ ist ein Befehl (es ist ein Synonym für test), und wie jeder andere Befehl begrenzen Sie die Parameter mit Leerzeichen.

Sie sollten auch Variablen in doppelte Anführungszeichen setzen, falls der Wert leer ist oder Leerzeichen oder Platzhalterzeichen enthält.

Schließlich ist der Operator zum Durchführen eines Zeichenfolgenvergleichs =, obwohl einige Versionen von test== als Erweiterung zulassen.

+0

gute Antwort mit Kontext –

1

Als erstes sollten Sie [] nicht verwenden - es ist better, [[.

Und zweitens - Sie müssen einige Räume hinzuzufügen:

if [[ $lang == Java ]] 
+0

Der Vergleichsoperator == verhält sich in einem Test mit zwei Klammern anders als in einzelnen Klammern. http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS –

2

Zuerst müssen Sie die Variable zwischen Anführungszeichen, da die Variable einige Leerzeichen oder Sonderzeichen haben könnte.

Schließlich denken Sie daran, dass "[" es ist eine ausführbare Datei selbst (ist in der Regel in/bin).

if [ "$lang" == "Java" ]; then