2013-03-22 5 views
19

Ich habe zwei Variablenunärer Operator in Shell-Skript erwartet, wenn Nullwert mit String-Vergleich

var="" 
var1=abcd 

Hier ist mein Shell-Script-Code

if [ $var == $var1 ]; then 
    do something 
else 
    do something 
fi 

Wenn ich diesen Code ausführen wird es eine Warnung prompt

[: ==: unary operator expected 

Wie kann ich das lösen?

+0

Um Code in einem Beitrag zu formatieren, markieren Sie ihn einfach und klicken Sie auf das Symbol "{}" (oder um 4 Leerzeichen). Ihr Code wurde mit '>' (das bedeutet zitierten Text, nicht formatierten Code) und unnötigen '
' Tags gekennzeichnet. Ich habe es repariert. –

+0

Es gibt zahlreiche andere Fragen zu StackOverflow, die sich mit der Notwendigkeit beschäftigen, Variablen für den Fall anzugeben, dass sie nicht gesetzt oder nullwertig sind. – chepner

+0

Nur zur Erinnerung: Um anzuzeigen, dass eine Antwort Ihr Problem gelöst hat, können Sie auf den grünen Pfeil klicken, um es zu "akzeptieren". Welche Antwort zu akzeptieren ist und ob eine Antwort überhaupt akzeptiert wird, liegt ganz bei Ihnen. –

Antwort

59

Da der Wert von $var die leere Zeichenfolge ist, das:

if [ $var == $var1 ]; then 

erweitert dazu:

if [ == abcd ]; then 

wodurch Syntaxfehler ist.

Sie müssen die Argumente zitieren:

if [ "$var" == "$var1" ]; then 

Sie auch = statt == verwenden können; das ist die ursprüngliche Syntax und es ist ein bisschen tragbarer.

Wenn Sie bash verwenden, können Sie die [[ Syntax verwenden, die nicht die Anführungszeichen erforderlich:

if [[ $var = $var1 ]]; then 

Selbst dann, es tut nicht weh, die variable Referenz zu zitieren, und das Hinzufügen von Anführungszeichen :

if [[ "$var" = "$var1" ]]; then 

könnte ein zukünftiger Leser einen Moment retten versucht sich zu erinnern, ob [[ ... ]] sie erfordert.

+0

Danke dude..Es hat gut funktioniert :) Danke für die schnelle Antwort. – user103134

+1

Derselbe Fehler wird größer oder kleiner als der Operator. Wie löst man das als Zahlenvergleich? if [$ var -gt $ var1] – sugunan

1

Warum alle Leute '==' anstatt einfach '=' verwenden möchten? Es ist schlechte Angewohnheit! Es wurde nur in [[]] Ausdruck verwendet. Und in()) auch. Aber du darfst auch nur = benutzen! Es funktioniert auf jeden Fall gut. Wenn Sie Zahlen verwenden, verwenden Sie nicht Zeichenfolgen, die nicht zu Zeichenfolgen passen, und vergleichen Sie dann wie Zeichenfolgen, aber vergleichen Sie Zahlen. wie das

let -i i=5 # garantee that i is nubmber 
test $i -eq 5 && echo "$i is equal 5" || echo "$i not equal 5" 

Es ist besser und schneller. Ich bin Experte in C/C++, Java, JavaScript. Aber wenn ich bash verwende, verwende ich nie '==' statt '='. Warum tust du das?

+1

Nun, es gibt überzeugendere Argumente als _Ich bin ein Export in ... Warum tust du das? _. Siehe zum Beispiel: https://unix.stackexchange.com/a/16110/59743. Es besagt, dass '==' ein Alias ​​für '=' ist.'=' ist ein Standardoperator, während '==' weit verbreitet ist, aber es ist nicht POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html – hagello