2010-10-13 12 views
7

W skrypcie bashW jaki sposób słowo kluczowe "jeśli" sprawdza, czy wartość ma wartość false?

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

wyjściowa: Yes

To oznacza, że ​​'1' jest traktowany jako prawdziwą wartość.

Ale w kodzie:

word = Linux 
letter = nuxi 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

wyjściowa: Nie

Ale echo "$word" | grep -q "$letter" powróci 1, dlaczego wynik jest nr

jak słowo kluczowe if testu wartość zwracana przez komendę po if?

+0

można znaleźć [moja odpowiedź tutaj] (http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var/3870055 # 3870055), aby był przydatny. –

Odpowiedz

8

Wartość zwracana polecenia jest sprawdzana. [ 1 ] ma wartość zwracaną 0 (prawda). Każda inna wartość zwracana (np. 1) oznacza błąd.

można wyświetlać wartości zwracanej ostatniego wykonanego polecenia za pomocą $? zmiennej:

true 
echo $? 
# returned 0 
false 
echo $? 
# returned 1 
echo $? 
# returned 0 as the last executed command is 'echo', and not 'false' 
+0

Ah, czy to dlatego, że '[' jest wbudowaną powłoką, zwróci 0 po zakończeniu testu? –

+0

Wygląda na to, że '0' jest wyrażeniem, które zwraca wartość' prawda'. '[0 = 1]' ma wartość zwracaną '1' (wartość oczekiwana) i' [0 = 0] 'ma wartość zwracaną równą' 0'. Uruchom 'man test', aby uzyskać więcej informacji o' teście' (aka '[') – Lekensteyn

+3

'[1]' lub '[0]' zwraca wartość prawda, ponieważ 'test' /' ['z pojedynczym parametrem sprawdza po prostu, czy ciąg parametru (tutaj '1' lub' 0') jest niepusty.iow '[" "]' byłoby fałszywe. – Dummy00001

0

To dlatego, że nie udało się znaleźć grep dolarów literę w słowie $, stąd kod wyjścia jest równy 1. Ilekroć proces w systemie Linux zwraca kod inny niż 0, oznacza to, że nie powiodło się. 0 oznacza, że ​​pomyślnie zakończono. Można to sprawdzić przez echo "Linux" | grep -d "nuxi"; echo $?

Z drugiej strony w skryptów świat 0 oznacza fałsz, a 1 oznacza to prawda. Tak więc grep nie znalazł słowa i wysłał 1 jako kod wyjścia, jeśli przyjął go jako prawdziwą wartość.

7

w Uniksie ziemi, 0 i 1 to prawda jest fałszywa.

przypadku pierwszego przykładu:

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

"If" sprawdza kod zakończenia danego polecenia na true/false (czyli zero/non-zero).

Nawiasy kwadratowe rzeczywiście wywołać polecenie „test” (patrz „test man” więcej informacji) i podać kod wyjścia na razie.

"test 1" (lub nawet "test any_string") zwraca true (0), więc "tak" jest wyjście.

Dla twojego drugiego przykładu, to wypisuje "Nie", ponieważ "nuxi" nie występuje w "Linux", jeśli zmienisz "nuxi" na "nux" (być może to był literówka?) I usuniesz spacje wokół the = wtedy otrzymasz zachowanie, którego się spodziewasz. na przykład

word=Linux 
letter=nux 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 
Powiązane problemy