2017-02-26 5 views
1

Ich lerne Korn Shell, die auf Bourne Shell basiert. Unten ist mein wirklich einfacher Code.Korn Shell Fehler [: fehlende `] '

read ab 
if [ $ab = "a" || $ab = "A" ] ; then 
    echo hi 
fi 

Aus irgendeinem Grund || Betreiber mir den Fehler geben:

[: missing `]' 
a: command not found 
+2

Die '' || interpretiert wird durch die Shell zu schreiben, nicht durch die '[' Befehl (ja, '[' ist ein Befehl). Also wird '[' mit Argumenten '$ ab =" a "' aufgerufen, und es beschwert sich über das fehlende ']'. Sie könnten '-o' verwenden, was der" oder "Befehl für' ['] ist, aber die Methode in @codeforester ist wahrscheinlich eine bessere Methode dafür. –

+0

@KeithThompson - Ich habe verstanden, dass '-o' in der neueren Version von Bash veraltet ist. Ich bin mir nicht sicher über ksh. – codeforester

+2

@codeforester, es ist eigentlich die POSIX-Spezifikation, die es veraltet markiert, keine bestimmte Shell. –

Antwort

3

Der richtige Weg, um Ihre if Zustand zu schreiben ist:

read ab 
if [ "$ab" = "a" ] || [ "$ab" = "A" ]; then 
    echo hi 
fi 

Mit [ ... ], ist es wichtig, zu setzen die Variablen in Anführungszeichen. Andernfalls wird die Shell mit einem Syntaxfehler fehlschlagen, wenn die Variablen auf nichts erweitert werden oder wenn ihre Erweiterung Leerzeichen enthält.


Siehe auch:

+0

Ich benutze $ {ab}, empfehlen Sie immernoch doppelte Anführungszeichen? –

+1

@ Mint.K: Ja. '$ {ab}' wird immer auf zwei oder mehr Wörter erweitert, wenn es Leerzeichen enthält. –

+0

@ Mint.K, '$ {ab}' unterscheidet sich überhaupt nicht von '$ ab', es sei denn, Sie führen eine Verkettungsoperation mit einer Zeichenfolge aus, die mit einem Zeichen beginnt, das als Teil eines Shellvariablennamens zulässig ist. '$ {ab} _foo'). –

1

Wenn Sie KSH oder eine moderne bash verwenden, können Sie die Nicht-Standard-[[ verwenden ... ]] anstelle von [ ... ].

Dies hat zwei Vorteile:

  1. können Sie verwenden || innerhalb [[ ... ]]
  2. Variable Erweiterungen brauchen keine Anführungszeichen.

Dies macht es sicher und kürzer

[[ $ab = a || $ab = A ]]