2011-10-25 10 views
5

W moim bash test ma postawę, aby wyjść ze stanu 0:BASH: [] (test) zachowuje unconformly

$ test -n && echo true || echo false 
-> true 

podczas

$ test -n "" && echo true || echo false 
-> false 

To znaczy, gdy nie otrzymują żadnego argumentu w ogóle przyjmuje wartość niezerową.

Sprawa -z działa prawidłowo zamiast:

$ test -z && echo true || echo false 
-> true 
$ test -z "" && echo true || echo false 
-> true 

Czy to jest normalne zachowanie?

+0

Dobre pytanie. Zastanawiam się również, dlaczego oba powiodły się zarówno test -n jak i test -z (bez argumentów). –

+0

Proszę uważnie z '&&' i '||'! Wypróbuj ten kod: 'touch ~/x && touch/x || echo fail' - jeśli 'touch/x' nie powiedzie się,' fail' zostanie wydrukowany! – uzsolt

Odpowiedz

5

Zasadniczo pytasz, czy łańcuch "-z" nie jest pusty. Jest, więc mówi ci true. Rzeczywisty algorytm testu wykorzystuje się:

  • 0 argumenty:

    Wyjście false (1).

  • 1 argumentu:

    Wyjście prawdziwe (0) jeśli $ 1 nie jest null; w przeciwnym razie, zakończ false.

  • 2 argumenty:

    Jeśli $ 1 jest wyjście true jeśli $ 2 jest null, false jeśli $ 2 nie jest null '!'.

    Jeśli $ 1 jest jednoargumentowym podstawowym, zakończ true, jeśli jednoargumentowy test jest prawdziwy, false , jeśli jednoargumentowy test jest fałszywy.

    W przeciwnym razie należy uzyskać nieokreślone wyniki.

...

Cytat z the POSIX test command specification.

0

Tak, jest to oczekiwane.

$ man test 
-n string     True if the length of string is 
          non-zero. 
-z string     True if the length of string 
          string is zero. 

test [option] #without any operand zwraca status wyjścia, które jest prawdziwe dla WSZYSTKICH opcji.

Spróbuj tych:

test -d 
test -f 
test -n 
test -G 
test -k 
... 
+0

To nie pomaga OP.OP wie jak to działa z argumentem. Pytanie dotyczy zachowania '-n' _ bez argumentu_ i dlaczego do cholery jest uważane za" prawdziwe ". –

+0

Niezupełnie, test z operatorem i bez argumentu zwraca wartość true do opcji ALL. Zmieniłem odpowiedź. – aayoubi

1

Przypuszczalnie bez argumentów "-n" i "-z" nie są traktowane jako podmioty, lecz jedynie jako ciągi i test "a non-empty string" jest prawdą. Domyślam się, że test zlicza swoje argumenty jako pierwszy krok, a jeśli liczba wynosi 1, po prostu sprawdź długość argumentu.

+0

To miłe wyjaśnienie. W rzeczywistości teoria ta działa i nie kontrastuje z instrukcją, która nigdzie nie precyzuje, że parametry są interpretowane PRZED argumentami. – davide

Powiązane problemy