2011-12-20 11 views
46

なぜbashは次のような動作をしますか?

echo $((true == false)) 
1 

私は、これは0を印刷するだろうと思っているだろうが、それは1を印刷します。 0がtrueで、0以外のすべてが偽である、そのためbashで

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

答えて

56

0は真、1は偽を意味するすべてのポスターはその点を見逃しています。この場合、$(())によって引き起こされる算術評価コンテキストのために、1が真であり、0が通常のブール値の意味で偽である。

$(())内での操作は、Bashの戻り値の等価性ではなく、 "false"と "true"が変数として扱われているが、まだバインドされていないリテラルを使用して数値の等価性を実行します。私がなぜわからないんだけど、

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

しかし:あなたは真と偽のリターン・ステータスを比較したい場合はあなたのような何かをしたい

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

:彼らはまだ割り当てられた値を持たないため、0と解釈あなたはtをしたいと思うでしょう彼の

EDIT: "true"と "false"が文字列として解釈されているというオリジナルの回答の部分を修正しました。ではない。それらは変数として扱われますが、それらにはまだ価値がありません。

+0

、 '$(($ TRUE ==ます$ FALSE))'を報告しますエコーあなたが期待するように '0' 'echo $(($ TRUE == $ TRUE))'と 'echo $(($ FALSE == $ FALSE))'も '1'を返します。 – zostay

+0

これは正しいです。ブール値がbashに存在しないので、 '$(())'の中に特別な意味を持たないので、真と偽の値は – Sorpigal

+1

+1です。質問を読んで? – Random832

-2

これは、さらに以下の事実によって複雑になります。

21

でも、$((...))が本当に何をしているのか分かりにくいですね。

それはそのオペランドの算術評価を行い、裸の単語が変数ではなく、コマンドや文字列リテラルある(すなわち、trueは本当に$trueである)、および数ではありませんものは0です。 ==演算子は2つの数値を比較し、等しい場合は1を返します。したがって、0算術文脈で、$true$false両方が空の文字列に評価する意味環境にはtrueまたはfalse環境変数は、ありません:$((true == false))が1である理由である

完全なものにするには、例えば...算術コンテキストでコマンド置換を使用することができます。

$ 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 
また
+0

@ zostayと全く同じことを正しく言っているので、私はすでにこの回答をupvotedしています。あなたは彼の例を理解できませんでした。シェルでTRUEとFALSEが定義されていないため、構文エラーが発生しています。彼の完全な例のDIDは真と偽のコマンドの数値戻りコードとしてそれらを定義します(他の答えの上の4行を詳しく見てください; TRUE = $? 'は変数$ TRUEなどを定義しています)。 – Izkata

+0

私はこの例を訂正しています。しかし、いいえ、同じことを言っているわけではありません。@ zostayは、「真」と「偽」は文字列として扱われていると言っています。彼らは環境変数として扱われます。これはまったく別の獣です。 '$ true'と' $ false'は、リテラルではなく空の文字列を評価します。 'echo $(($(echo $ a)))' '' a'が定義されていないところで試してみてください。構文エラーは出ませんが0を返します。この文脈では、数値でないものは0と評価されます。 – 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

ようこそ!あなたのコードとその出力についてのいくつかの説明は、あなたの答えを人にもっと役に立つものにするでしょう。 – J0e3gan

+0

あなたがしていることは、コードとその動作を示しているだけです。あなたは**このコードがなぜ**動作するのか説明しません。コードのダンプは通常ここに眉をひそめます! – rayryeng

関連する問題