2011-12-20 35 views
46

Bash neden aşağıdaki davranışa sahiptir?

echo $((true == false)) 
1 

bu 0 yazdırmak olacağını sanırdım ama 1 yazdırır.

Bu

ayrıca aşağıdaki gerçekleri nedeniyle karmaşıklaşır: bash, 0 doğrudur ve 0 dışında her şey yanlıştır

> echo $((true)) 
0 
> echo $((false)) 
0 
> echo $((true == true)) 
1 
> echo $((false == false)) 
1 

cevap

56

0'dan söz eden tüm posterler doğru ve 1 tanesi yanlıştır. Bu durumda, 1 true'dur ve $(()) tarafından neden olunan aritmetik değerlendirme bağlamından dolayı olağan boolean anlamında 0 yanlıştır. $(())== operasyon Bash dönüş durumların eşitliği değil

, bu ikisi de "yanlış" ve "gerçek" değişken olarak kabul edilir, ancak henüz bağlı değil verilen harfleri kullanarak sayısal eşitlik, gerçekleştirir Eğer böyle bir şey istemek doğru ve yanlış dönüş durumunu karşılaştırmak istiyorsanız

$ echo $((true)) 
0 
$ echo $((false)) 
0 

: henüz atanmış bir değere sahip beri 0 olarak yorumlanır,

true 
TRUE=$? 
false 
FALSE=$? 
if (($TRUE == $FALSE)); then echo TRUE; else echo FALSE; fi 

Ama nedenini emin değilim sen yapmak istersin onun.

DÜZENLEME: Orijinal yanıttaki parçanın "true" ve "false" dizeleri olarak yorumlanmasıyla ilgili kısmı düzeltildi. Onlar değil. Değişkenler olarak kabul edilirler ancak henüz onlara bağlı hiçbir değeri yoktur.

+0

, '$ (($ DOĞRU == $ YANLIŞ))' bildirir yankı Beklediğiniz gibi "0". echo $ (($ TRUE == $ TRUE)) ve echo $ (($ FALSE == $ FALSE)) 'da' 1'i rapor edecektir. – zostay

+0

Bu doğru. Boole olarak "doğru" ve "yanlış" lar bashta var olmazlar ve bu yüzden $ (()) ' – Sorpigal

+1

+1 ve -1 'in diğer tüm cevaplarına özel bir anlamı yoktur. soruyu okuyun? – Random832

21

Tamam, öyle görünüyor ki, $((...))'un gerçekten ne yaptığı konusunda bir sürü karışıklık var gibi görünüyor.

Bu barewords değişkenler değil komutlar veya dize hazır (yani true gerçekten $true olan), ve bir sayı değil şey 0 olduğunu işlenenlerinden bir aritmetik değerlendirme yapar. == operatörü iki sayıyı karşılaştırır ve eşitse 1 değerini döndürür. $((true == false)) 1 neden

hangisi: aritmetik bağlamında bu nedenle 0, hem $true ve $false boş dizge olarak anlamı ortamda, hiçbir true veya false ortam değişkenleri yoktur!

tam olması için ayrıca Mesela ... aritmetik bağlamında komut ikamesi kullanabilirsiniz:

$ echo $((`echo 2`)) 
2 
$ echo $((3 + $(echo 4))) 
7 
$ a=3 
$ echo $((a + $(echo 4))) 
7 
# undefine a 
$ a= 
$ echo $((a + $(echo 4))) 
4 
$ a="Hello world" 
$ echo $((a + 1)) 
1 
# undefine a again 
$ a= 
$ echo $(($(echo $a))) 
0 
Ayrıca
+0

Bu cevabı zaten bastım çünkü doğru bir şekilde @zostay ile aynı şeyi söylüyorsunuz, siz onun örneğini anlayamadınız. Bir sözdizimi hatası alıyorsunuz, çünkü TRUE ve FALSE kabuğunuzda tanımlı değil; onun tam örneği DID onları doğru ve yanlış komutların sayısal dönüş kodları olarak tanımlar (diğer cevapta 4 satırın üstünde daha yakından bakın; "DOĞRU = $?" $ DOĞRU, vb. değişkenini tanımlar.) – Izkata

+0

Örnek için düzelttim. Ama hayır, ben de aynı şeyi söylemiyorum: @zostay 'true' ve 'false 'dizeleri gibi ele alındığını söylüyor - bu case_ değil! Tamamen farklı bir canavar olan ve '$ true' ve '$ false' değerleri boş harflere değil, literallere göre değerlendirilir. echo $ (($ (echo $ a))) 'a' tanımlı değil: bir sözdizimi hatası vermez, ancak 0 değerini döndürür. Doğru olarak söylerse de, bu dizeler 0 olarak değerlendirilir. Ama aslında Bir sayı olmayan her şey bu bağlamda 0 olarak değerlendirilir. – fge

-1
$ bash --version 
GNU bash, version 3.2.53(1)-release (x86_64-apple-darwin13) 
$ true="true" 
$ unset false 
$ if [[ $true ]] ; then echo hi ; fi 
hi 
$ if [[ $false ]] ; then echo hi ; fi 
$ if [[ $true || $false ]] ; then echo hi ; fi 
hi 
$ if [[ $false || $true ]] ; then echo hi ; fi 
hi 
$ if [[ $false && $true ]] ; then echo hi ; fi 
$ if [[ $true && $false ]] ; then echo hi ; fi 
$ if [[ $true == $false ]] ; then echo hi ; fi 
$ if [[ $true == $true ]] ; then echo hi ; fi 
hi 
$ if [[ $false == $false ]] ; then echo hi ; fi 
hi` 
+1

SO'ya hoş geldiniz! Kodunuzun ve çıktısının bazı açıklamaları, cevabınızı insanlara daha yararlı hale getirecektir. – J0e3gan

+0

Tek yapmanız gereken kod ve davranışın ne olduğunu göstermektir. Açıklamıyorsunuz ** neden ** bu kod çalışıyor. Kod dökümü genellikle burada kaşlarını çattı! – rayryeng

İlgili konular