while [ -n "$1" ]; で始まるループはいつ実行されますか?

while [ -n "$1" ]; で始まるループはいつ実行されますか?

私はwhileループで始まるシェルスクリプトを持っています

while [ -n "$1" ]; do

$1はスクリプト名の直後の引数、つまりfirstargumentを実行するときのを参照することはわかっています./myscript.sh firstargument。 は何を-nしますか?

答え1

これは-n空でない文字列のテストです。

空の文字列に展開された場合"$1"、その特定のテストは失敗し、ループは実行されません。

それはおそらくループ本体には、shift次の位置パラメータを にシフトするステートメントが含まれており$1、ループはこのようにして、空の引数が見つかるか、引数リストの最後に到達するまで、スクリプトへの引数をループします。

このtestユーティリティは と同等です[が、[最後の引数が である必要があります]

このテストは次のようにも書ける。

while test -n "$1"; do

[と は両方ともtestシェルに組み込まれている可能性がありますが、 のような標準パスの下で外部コマンドとしても使用できるはずです/bin

man testこのテストやその他のテストの詳細については、 や、シェルのマニュアル (組み込みユーティリティであるため) を参照してください。

この-nテストは、標準テストも実施しており、testユーティリティのPOSIX標準


もしこのループはループするはずです全てシェル スクリプトの引数が空の場合、失敗する可能性があります。

$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3

代わりに、次のようなものを使うべきかもしれません

for arg do
    if [ -n "$arg" ]; then
        # do something with "$arg"
    fi
done

...もちろん、スクリプトが何を行うかによって異なります。

関連情報