回答:
シェル内の単一の角括弧はtest
(別個のコマンドまたはシェル組み込みの)の同義語であるため[ 0 ]
、と同じことを意味しtest 0
ます。test
あなたはそのマンページで読むことができるように、比較を行い、ファイルの属性をテストするためのものです。比較、ファイルテスト、または実行可能な他の操作のように見える式が与えられない場合、代わりに引数が存在し、空でない文字列があるかどうかをテストします。0
またはどちらも1
テストに本当に適切な入力ではありません。空でない文字列のテストは単に成功し、whileループは永久にループします。
代わりに試してみてください
while false; do
echo "hello"
done
おそらく交換false
でtrue
。または多分あなたが望むのは使用することです(( ))
:
while (( 0 )); do
echo "hello"
done
これは、ほとんどの言語のように動作します。0は失敗/偽を意味し、1は成功/真を意味します。
0
とは1
空の文字列ではありません。新しいシェルプログラマーは、多くの場合、if [ 1=2 ]
代わりに書いてif [ 1 = 2 ]
、前者が常に真実である理由を疑問に思います。これは、単一の引数であり、空の文字列ではないため、真実です。
ここでの値0は、数値定数としてではなく、文字列として機能しています。これらのテストは、正常終了ステータスを生成する効果においてすべて同等です。
[ A ]
[ "XYZ" ]
[ 0 ]
これらは失敗した終了ステータスを生成します。
[ ]
[ "" ]
論理的に真と評価される非空白引数があります。これにより、次のようなことができます。
if [ $UNDER_NUCLEAR_ATTACK ] ; then
launch-missiles -a $DRY_RUN # $DRY_RUN set to "-n" during testing
fi
この変数UNDER_NUCLEAR_ATTACK
は、真を示すために空白以外の値に設定されるか、偽を示すために設定されていないか空です。
!
演算子を適用してロジックを逆にすることができます。
[ ! a ] # fails: a is nonblank so true; and not true is false.
[ ! ] # succeeds: blank is false, not blank is true.
数値条件を評価するには、数値テスト演算子を使用する必要があります。
while [ $A -gt $B ] ; do ...
場合A
やB
文字列を含む十進整数のようなその表情は、彼らは番号が比較され、そして場合A
よりも大きいB
ループを実行、。したがって、それUNDER_NUCLEAR_ATTACK
は空白または非空白の文字列型ブール値ではなく、実際には0
(false)または他の値(true)である数値ブール値であるとします。その場合、次のようなテストを作成します。
if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ...
if / thenコンストラクトは、コマンドのリストの終了ステータスが0であるかどうかをテストし(0はUNIXの慣例により「成功」を意味するため)、1つ以上のコマンドを実行します。
つまり、ゼロのテスト結果を返しています。
[
(除く一つだけの引数を取得し]
、それがある場合、引数が空でない場合、それは状況ゼロで終了し、ゼロ以外に、もちろん、)。したがって、たとえば、[ 1 ]
の終了コードも返します0
。
[ ]
(引数なしで)および[ "" ]
(単一の空の引数で)成功しません。