Bashビルトインについて、true
より具体的には、Bashが括弧内の式を展開して解釈する方法について、いくつかの誤解があるようです。
mikuの回答のコードは、Bashビルトインtrue
や/bin/true
、その他のtrue
コマンドの種類とはまったく関係ありません。この場合、true
は単なる文字列にすぎずtrue
、変数の割り当てや条件式の評価によっても、コマンド/ビルドへの呼び出しは行われません。
次のコードは、機能的にはミクの答えのコードと同じです。
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
ここでの唯一の違いは、比較される4つの文字が、「t」、「r」、「u」、および「e」ではなく、「y」、「e」、「a」、および「h」であることです。それでおしまい。namedや組み込みコマンドを呼び出そうとする試みはなくyeah
、(mikuの例では)Bashがトークンを解析するときに行われる特別な処理もありませんtrue
。それは単なる文字列であり、完全に任意のものです。
更新(2014-02-19): mikuの回答のリンクをたどると、混乱の原因がどこにあるのかがわかります。ミクの答えは単一の角かっこを使用していますが、彼がリンクするコードスニペットは角かっこを使用していません。それはただ:
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
両方のコードスニペットは同じように動作しますが、ブラケットは内部で行われていることを完全に変更します。
それぞれのケースでBashが行っていることは次のとおりです。
括弧なし:
- 変数を展開します
$the_world_is_flat
を文字列に展開します"true"
。
- 文字列を解析しようとする
"true"
をコマンドとして。
- 見つけて実行する
true
コマンド(組み込みまたは/bin/true
Bashのバージョンに応じて)。
- の終了コードを比較します
true
コマンドの(常に0)を0とほとんどのシェルでは、終了コード0は成功を示し、それ以外は失敗を示します。
- 終了コードが0(成功)だったので、
if
ステートメントのthen
句を実行します
ブラケット:
- 変数を展開します
$the_world_is_flat
を文字列に展開します"true"
。
- 完全に拡張された条件式を解析します
string1 = string2
。これはの形式です。=
オペレータは、bashの者です文字列比較演算子。そう...
- とで文字列比較
"true"
を行う"true"
ます。
- はい、2つの文字列は同じだったので、条件の値はtrueです。
if
ステートメントのthen
句を実行します。
true
コマンドが成功を示す終了コード0を返すため、括弧なしのコードは機能します。の値は、右側の$the_world_is_flat
文字列リテラルと同じであるため、括弧で囲まれたコードは機能しますtrue
=
ます。
要点を理解するために、次の2つのコードスニペットを検討してください。
このコード(root権限で実行した場合)は、コンピューターを再起動します。
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
このコードは、「ナイストライ」を出力するだけです。再起動コマンドは呼び出されません。
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
更新(2014-04-14)=
と==
AFAIKの違いに関するコメントの質問に答えるには、違いはありません。==
オペレータは用バッシュ固有の同義語であります=
、そして限り私が見てきたように、彼らはすべてのコンテキストでまったく同じに動作します。
ただし、またはで使用されている=
および==
文字列比較演算子について具体的に話していることに注意してください。私はそれを示唆していないよと互換性があり、どこでも[ ]
[[ ]]
=
==
bashで。
たとえば、あなたは明らかにして、変数の割り当てを行うことができない==
など、var=="foo"
(だけでなく技術的にあなたがすることができ、これを行うが、の値はvar
なり"=foo"
バッシュが見ていないので、==
ここでオペレータを、それは見ています=
が続く(代入)演算子を、リテラル値="foo"
だけになり、"=foo"
)。
また、けれども=
と==
互換性があり、あなたはどのようにそれらのテストが仕事することを心に留めておく必要がありますないあなたの中にそれを使用しているかどうかに依存し[ ]
たり[[ ]]
、また、オペランドが引用されているかどうかに。詳細については、「高度なBashスクリプトガイド:7.3その他の比較演算子(=
およびの説明までスクロールしてください==
)」を参照してください。
true
そしてfalse
最もスニペットの文脈の中で、以下の単なる文字列、ありませんbash built-ins
!以下のMike Holtの回答を読んでください。(これは、投票数が多く受け入れられた回答がIMHOの混乱を招き、投票数の少ない回答に洞察に満ちたコンテンツを