ifコマンドの条件をテストする

ifコマンドの条件をテストする

echo両方のシナリオでステートメントが実行される理由をご存知ですか?

出力it worked:

#!/bin/bash

rizwan=''
if [ -n $rizwan ]; then
  echo "it worked"
fi

-nを に置き換える-zと、it worked出力がないと予想されるときに出力されます。

#!/bin/bash

rizwan=''
if [ -z $rizwan ]; then
  echo "it worked"
fi

答え1

ご存知かもしれませんが、明確にしておきましょう。 は構文[の一部ではありませんif。 は、、または のようif [ …に動作しますが、 、、はコマンドです。 これらは終了ステータスを返し、これが にとって重要です。if trueif falseif any_command[truefalseany_commandif

は組み込みコマンドですが[(Bash では組み込みコマンドです)、通常のコマンドのように動作します。POSIXで必要なため、スタンドアロンの[実行可能ファイル (例) も存在します。/usr/bin/[

これは、引数がほとんどないコマンドで[ -n whatever ]あることを意味します[。はい、]は単なる引数であり、区切り文字などではありません。指定されたコマンドは、最後の引数である[必要があります]。この方法では、コードが読みやすくなりますが、]他の目的はありません。

コマンドはtestと同等です[。唯一の違いは をtest必要としないことです]
[ -n whatever ]は と同等ですtest -n whatever

シェルが$rizwan空の文字列に展開すると、スニペット[ -n $rizwan ]とがそれぞれおよびに[ -z $rizwan ]なります。コマンドは、コード内で(または) との間に何かがあったことを認識しないため、正確に 2 つの引数を取得します。両方のテストは、がまたはである構文として扱われます。この構文は、が空でないかどうかをテストします。も も空の文字列ではないため、テストは常に成功します。[ -n ][ -z ][-n-z][ STRING ]STRING-n-zSTRING-n-z

スニペットを[ -n STRING ]またはとして動作させるには[ -z STRING ]、変数を二重引用符で囲む必要があります。 を展開した後、シェルは[ -z "$rizwan" ]正確に三つへの引数。それらは、、変数の展開された値(空の文字列であっても)、[および です。ツールは、取得したいすべての引数を取得します。-z]

$rizwan例で引用符で囲まれていない場合、複数の単語に展開され、 [3 つ以上の引数を取得します。一般に、最終結果は変数の内容と の実装によって異なります[

比較するシェル スクリプトが空白文字やその他の特殊文字で動作しなくなるのはなぜですか?

Bash[[の は異なります。これはキーワードであり、シェル パーサーと統合され、いくつかのルールを変更し、[[との間の変数と引用符を実際に認識します。の代わりに]]を使用した場合(したがって の代わりにを使用した場合)、コードは期待どおりに動作します。[[[]]]この答え

[ポータブルタイプです。

答え2

変数rizwanが空なので、ifコマンドは次のようになります。

if [ -n  ]

構文は、[ STRING ]文字列が空 (文字なし) かどうかをテストします。したがって、 の場合[ -n ]、文字列-nは明らかに空ではありません。

関連情報