私は最近動作するので、私を混乱させるいくつかのコードを見ていましたが、うまくいくとは思わなかった。コードはこの例で単純化されました。
#!/bin/bash
for var;
do
echo "$var"
done
コマンドライン引数で実行すると印刷されます。
$ ./test a b c
a
b
c
(私としては)予想外のことだった。var
定義されていないためにエラーが発生しないのはなぜですか?これを使用することは「良い習慣」と見なされますか?
答え1
for
in value1 value2...
Bourneに似たすべてのシェルに部分が指定されていない場合、ループは位置引数を繰り返します。
これは70年代後半からBourneシェルに存在していましたが、Bourneシェルではこれを省略する必要があります;
(使用することもできますfor i do
(一部の以前のashバージョンでは前に改行を追加する必要はありませんdo
))。
バラよりBash for ループで「do」キーワードの目的は何ですか?より多くの情報を含むより多くの情報が必要な場合奇妙バリアント。
行為:
for i
do
something with "$i"
done
良いアイデアです。一般的な製品よりも移植性と信頼性がわずかに高いです。
for i in "$@"; do
something with "$i"
done
Bourne シェル、ksh88 は、一部のケース (たとえば、$#
Bourne シェルの一部のバージョンで 0 の場合 (修正でき${1+"$@"}
ない"$@"
)、$IFS
Bourne および ksh88 に空白文字が含まれていない場合)、またはこのnounset
オプションが有効になって$#
いるbash
(など、一部のシェルの一部のバージョンでは0です。${1+"$@"}
解決策としてもう一度)。
答え2
これがデフォルトの動作です。はい。help
キーワードに文書化されていますfor
。
terdon@tpad ~ $ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
Execute commands for each member in a list.
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
Exit Status:
Returns the status of the last command executed.
したがって、繰り返すリストを指定しない場合は、デフォルトで$@
位置引数の配列(a
例では)を繰り返しますb
。c
そしてこの行動はPOSIXで定義はい、現時点ではこれは「良い習慣」と見なされます。