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

括弧のないステートメントはbashコマンドで評価され、if expr戻り状態を確認します。expr成功すると価値と見なされますtrue

一方、if [[ expr ]]二重角かっこがある項目はbash具体的です。キーワード-f /path/to/fileファイルが存在するかどうかをテストするなど、独自のオプションセットを処理したり、たとえば変数テストも処理したりできます$a == $bif [[ $(cmds) ]]それ以外の場合は、そこにあるすべてを特別な式で処理し、別の方法で解析します。

if [ expr ]一般に、別名(または場合によってはおおよその実装)である構文もありますif test expr。コマンドに使用可能なオプションがある場合は、単一の角かっこの間にもtest使用できます。

より興味深くするためif ((expr))に、内部のすべてが算術式として評価されるため、数字で作業するときに最適な構文があります。これは二重括弧と同様にキーワードです。

デフォルトでは、if exprandif [ expr ]は移植可能であり(つまり、すべてのシェルはそれを処理してほぼ同じように処理できます)、実装if [[ expr ]]によってif (( expr ))異なります。つまり、キーワードであり、評価はシェルを使用する場所によって大きく異なります(使用している場合は存在しない可能性があります)。bash、、、zshまたは)などを使用しないでください。ksh

関連情報