シェル構文は、コンテキストに大きく依存します。つまり、特定のもの (true
など) または false
) の意味は、それが発生する場所に大きく依存します。あなたの例では、 false
コマンド、文字列値、および整数値を含む (存在しない) 変数名です。例を見てみましょう:
-
false
コマンドとして:false; echo $? # prints "1" if false; then echo "yep"; else echo "nope"; fi # prints "nope"
「false」という名前のコマンド (通常は /usr/bin/false、または同じことを行う bash ビルトイン) がありますが、実際には何も実行せず、失敗ステータスで終了します。終了ステータスとして、0 は成功 (真実のようなもの) を示し、0 以外は失敗 (偽のようなもの) を示します。これは、より一般的なゼロ =false、ゼロ以外 =true の規則の反対ですが、終了ステータスの場合はより理にかなっています。
-
false
未解釈の文字列値として:if [[ false ]]; then echo "yep"; else echo "nope"; fi # prints "yep" if [[ true ]]; then echo "yep"; else echo "nope"; fi # prints "yep" if [[ wibble ]]; then echo "yep"; else echo "nope"; fi # prints "yep" if [[ "this is a string" ]]; then echo "yep"; else echo "nope"; fi # prints "yep" [[ false ]]; echo $? # prints "0" (=success) [ false ]; echo $? # prints "0" (=success) test false; echo $? # prints "0" (=success)
これらすべての場合において、コマンド
test
またはその類義語[
または bash 条件式[[ ]]
式を取得せず、単一の文字列のみを取得したため、非常に単純なテストを実行します。長さがゼロでない文字列か? 「true」、「false」、「wibble」などはすべて長さが 0 ではないため、コマンド/式は真のようになり、成功します。比較:[[ "" ]]; echo $? # prints "1" (=failure), because the string is zero-length [[ ]]; echo $? # prints "1" (=failure), because there isn't even a string [ ]; echo $? # same
test
に注意してください そして[
は通常のコマンドであり、「false」(および「wibble」など) は単なる引数です。[[ ]]
コマンドの代わりに使用できる bash 構文です。それらの引数/内容は、コマンド名自体とは異なる方法で解析されます。 -
false
整数を含む可能性のある変数名として:if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi # prints "equal"
これは少し奇妙で、bash の
[[ ]]
の詳細に依存します。 数値が等しいかどうかをテストします。[[ ]]
にあることに注意してください (そして[ ]
そしてtest
式)、-eq
数値が等しいかどうかのテスト、および=
文字列が等しいかどうかをテストします。たとえば、[[ 01 -eq 1 ]]
(1 と 01 は数値的に等しいため) は true ですが、[[ 01 = 1 ]]
false です (同じ文字列ではないため)。[[ false -eq true ]]
の場合 、「true」および「false」は整数値ではないため、bash はそれらを変数名として扱う (そして変数に整数値が含まれることを期待する) ことによって、それらを整数に変換しようとします。実際、どちらも変数として定義されていないため、どちらも空の文字列として評価され、整数 0 として解釈されます。観察:if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi # prints "equal" if [[ false -eq 0 ]]; then echo "equal"; else echo "nope"; fi # prints "equal" false=5 if [[ false -eq true ]]; then echo "equal"; else echo "nope"; fi # now prints "nope"
false
を定義することに注意してください 変数は他の用途に影響を与えないため。コマンドとして使用すると、ステータス 1 で終了します。文字列として使用すると、「false」のままです (「5」ではありません)。