私は最近、私を混乱させたコードを見ていました。コードはこの例になります
#!/bin/bash
for var;
do
echo "$var"
done
コマンドライン引数で実行すると、それらが出力されます
$ ./test a b c
a
b
c
これは、私にとっては予想外のことです。var
未定義のため、なぜこれはエラーにならないのですか?これを「グッドプラクティス」と見なしていますか?
私は最近、私を混乱させたコードを見ていました。コードはこの例になります
#!/bin/bash
for var;
do
echo "$var"
done
コマンドライン引数で実行すると、それらが出力されます
$ ./test a b c
a
b
c
これは、私にとっては予想外のことです。var
未定義のため、なぜこれはエラーにならないのですか?これを「グッドプラクティス」と見なしていますか?
回答:
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シェルの一部のバージョンではwhen が0(回避できる${1+"$@"}
代わり)、Bourneおよびksh88でスペース文字が含まれない"$@"
場合$IFS
など)、またはこのnounset
オプションは有効になっており$#
、一部のシェルの一部のバージョンでは0ですbash
(これも${1+"$@"}
回避策として)。
これがデフォルトの動作です、はい。これは、に記載されて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によって定義されているので、はい、それは「良い習慣」と見なされます。