bash の if と [[ の違いは何ですか?

bash の if と [[ の違いは何ですか?

私はそれを見る

if cmd
then
echo Hi
fi

異なる動作をする

if [[ $(cmd) ]]
then
echo Hi
fi

では、[[ がある場合とない場合では何が起こるのでしょうか?

答え1

シェルには[テストコマンドのエイリアスがあります。コマンド。これは[[、わずかに異なる一部のシェルの機能です。bash では、これはコマンドではなくキーワードですが、コマンドのように機能します。

これを次のように考えることができます。 を実行し[[、そのコマンドへの引数として「$(cmd)」の出力を提供します。if次に、 の戻りステータスをチェックします[[。 に演算子が指定されていない場合は[[-nが暗黙的に指定されます。

   -n string
          True if the length of string is non-zero.

例:

if cmd          # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output

答え2

ステートメントif expr(括弧なし) は、bash コマンドとして評価された後の戻りステータスをチェックしますexpr。成功すると、値として扱われますtrue

一方、if [[ expr ]]二重角括弧はbash-specificキーワードは、ファイルの存在をテストするなどの独自のオプション セットを処理したり-f /path/to/file、 などの変数テストを処理したりすること$a == $bができます。これらの括弧内では、 を含む bash コマンドのセットとして何らかの式を評価するように明示的に指示する必要がありますif [[ $(cmds) ]]。そうしないと、そこにあるすべてのものが特別な式として扱われ、異なる方法で解析されます。

また、 という構文もありますif [ expr ]。これは通常、 のエイリアス (または、場合によっては の近似実装) ですif test exprtestコマンドに使用可能なオプションがある場合は、それを一重括弧で囲んで使用することもできます。

さらに楽しいことに、 構文がありますif ((expr))。これは、内部のすべてが算術式として評価されるため、数値を扱う場合に最適です。これも、二重括弧と同様にキーワードです。

基本的に、if exprと はif [ expr ]移植可能 (つまり、すべてのシェルがこれらを処理でき、ほぼ同じように処理します) であり、if [[ expr ]]と はif (( expr ))実装固有です。つまり、これらキーワードの評価は、それらを使用しているシェルに大きく依存します ( 、 、 などを使用していない場合bashzshこれらkshは存在しない可能性もあります)。

関連情報