2011-10-25 5 views
5

Benim bash test durumunun 0:BASH: [] (test) uyumsuz davranır

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

ile çıkması için bir tavrı vardır.

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

Bu, herhangi bir argüman almadığı zaman sıfırdan farklı olduğu anlamına gelir.

-z durumu düzgün çalışıyor:

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

Bu beklenen davranış mı?

+0

İyi soru. Ayrıca hem 'test -n' hem de 'test -z' (argümanlar olmadan) hem de başarılı olur. –

+0

'&&' ve '||' ile dikkatlice olun! Bu kodu deneyin: 'touch'a dokunun ~/x && touch/x || echo fail' - 'touch/x' başarısız olursa, 'fail' basılacaktır! – uzsolt

cevap

5

Temel olarak, dize "-z" nonempty olup olmadığını testini soruyor. Bu, size true'u bildirir. Test kullanan gerçek algoritmasıdır:

  • 0 parametreler:

    çıkış yanlış (1).

  • 1 argüman:

    Çık gerçek (0) 1 $ null değilse; aksi halde yanlış olarak çıkar.

  • 2 argümanlar:

    $ 1 ise, çıkış $ 2 boş değilse 2 $ null yanlışsa doğru '!'.

    1 $ tek bir birincil ise, tekli sınama doğruysa true, false ise unary sınaması yanlıştır.

    Aksi takdirde, belirtilmemiş sonuçlar üretir.

...

the POSIX test command specification Alıntı sahibi.

0

Evet bekleniyor.

$ 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 operandTÜM seçenekleri için geçerlidir bir çıkış durumu döndürür.

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

Bu, OP'ye yardımcı olmaz.OP, bir argümanın nasıl çalıştığını bilir. Soru, '-n' bir argüman_ww 'in davranışına ve niçin' gerçek 'olarak algılandığına ilişkindir. –

+0

Gerçekten, bir operatör ile test edin ve işlenmeyen TÜM seçeneklere doğru döndürün. Yanıtı düzenledim. – aayoubi

1

Tahminen, argümanlar "-n" ve "-z" olmadan operatörler ama sadece dize olarak kabul edilmez ve test "a non-empty string" doğrudur:


bunlar deneyin. Ben test ilk adım olarak kendi argümanlarını sayar ve sayım 1 ise, basitçe argüman uzunluğunu incelemek olduğunu tahmin ediyorum.

+0

Bu güzel bir açıklama. Aslında, bu teori işe yaramaz ve elkitabında bulunmaz, bu hiçbir yerde parametrelerin argümanlardan önce yorumlanmamasını belirtir. – davide