![while [ -n "$1" ]; で始まるループはいつ実行されますか?](https://rvso.com/image/146500/while%20%5B%20-n%20%22%241%22%20%5D%3B%20%E3%81%A7%E5%A7%8B%E3%81%BE%E3%82%8B%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AF%E3%81%84%E3%81%A4%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
私は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
...もちろん、スクリプトが何を行うかによって異なります。