なぜ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
なぜ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
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"が文字列として解釈されているというオリジナルの回答の部分を修正しました。ではない。それらは変数として扱われますが、それらにはまだ価値がありません。
:
これは、さらに以下の事実によって複雑になります。
でも、$((...))
が本当に何をしているのか分かりにくいですね。
それはそのオペランドの算術評価を行い、裸の単語が変数ではなく、コマンドや文字列リテラルある(すなわち、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
また
@ zostayと全く同じことを正しく言っているので、私はすでにこの回答をupvotedしています。あなたは彼の例を理解できませんでした。シェルでTRUEとFALSEが定義されていないため、構文エラーが発生しています。彼の完全な例のDIDは真と偽のコマンドの数値戻りコードとしてそれらを定義します(他の答えの上の4行を詳しく見てください; TRUE = $? 'は変数$ TRUEなどを定義しています)。 – Izkata
私はこの例を訂正しています。しかし、いいえ、同じことを言っているわけではありません。@ zostayは、「真」と「偽」は文字列として扱われていると言っています。彼らは環境変数として扱われます。これはまったく別の獣です。 '$ true'と' $ false'は、リテラルではなく空の文字列を評価します。 'echo $(($(echo $ a)))' '' a'が定義されていないところで試してみてください。構文エラーは出ませんが0を返します。この文脈では、数値でないものは0と評価されます。 – fge
$ 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`
、 '$(($ TRUE ==ます$ FALSE))'を報告しますエコーあなたが期待するように '0' 'echo $(($ TRUE == $ TRUE))'と 'echo $(($ FALSE == $ FALSE))'も '1'を返します。 – zostay
これは正しいです。ブール値がbashに存在しないので、 '$(())'の中に特別な意味を持たないので、真と偽の値は – Sorpigal
+1です。質問を読んで? – Random832