2013-03-22 14 views
19

Mam dwie zmienneoperator jednoargumentowy spodziewać w skrypcie przy porównywaniu wartości zerowej sznurkiem

var="" 
var1=abcd 

Tu jest moja skorupa kod skryptu

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

Jeśli ten kod będzie skłonić ostrzeżenie

[: ==: unary operator expected 

Jak mogę to rozwiązać?

+0

Aby sformatować kod we wpisie, po prostu zaznacz go i kliknij ikonę "{}" (lub wcięcie go o 4 spacje). Twój kod został oznaczony przez '>' (co oznacza cytowany tekst, nie sformatowany kod) i niepotrzebne znaczniki '
'. Naprawiłem to. –

+0

Istnieje wiele innych pytań na temat StackOverflow dotyczących konieczności podawania zmiennych w przypadku, gdy są one nieustawione lub mają wartość null. – chepner

+0

Przypomnienie: aby wskazać, że odpowiedź rozwiązała problem, możesz kliknąć zieloną strzałkę, aby ją "zaakceptować". Którą odpowiedź przyjmiesz i czy w ogóle przyjmiesz odpowiedź, zależy wyłącznie od ciebie. –

Odpowiedz

59

Ponieważ wartość $var jest pusty łańcuch, to:

if [ $var == $var1 ]; then 

rozszerza się następująco:

if [ == abcd ]; then 

który jest błąd składni.

trzeba przytoczyć argumenty:

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

Można również użyć = zamiast ==; to jest oryginalna składnia i jest trochę bardziej przenośna.

Jeśli używasz bash, można użyć składni [[, które nie wymagają cytaty:

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

Nawet wtedy, to nie zaszkodzi zacytować zmiennej odniesienia i dodawanie cytatów :

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

może uratować przyszłość czytelnikowi chwilę próbując sobie przypomnieć, czy [[ ... ]] wymaga od nich.

+0

Dzięki, koleś .. To zadziałało :) Dzięki za szybką odpowiedź. – user103134

+1

Ten sam błąd pojawia się na większej lub mniejszej niż operator. Jak rozwiązać to jako porównanie liczb. jeśli [$ var -gt $ var1] – sugunan

1

Dlaczego wszyscy ludzie chcą używać "==" zamiast zwykłego "="? To zły nawyk! Użyto go tylko w wyrażeniu [[]]. A także w (()). Ale możesz użyć również = też! Działa to dobrze w każdym przypadku. Jeśli używasz liczb, a nie łańcuchów, nie używaj spacji do ciągów znaków, a następnie porównuj łańcuchy, ale porównaj numery. w ten sposób:

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

To jest lepsze i szybsze. Jestem ekspertem w C/C++, Java, JavaScript. Ale jeśli używam basha, nigdy nie użyję "==" zamiast "=". Dlaczego to robisz?

+1

Cóż, istnieją bardziej przekonujące argumenty niż _ Jestem eksportem w ... Dlaczego to robisz? Zobacz na przykład: https://unix.stackexchange.com/a/16110/59743. Mówi ci, że '==' jest aliasem dla '='.'=' jest standardowym operatorem, natomiast '==' jest szeroko implementowane, ale nie jest to POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html – hagello

Powiązane problemy