私は最近、私を混乱させたコードを見ていました。コードはこの例になります
#!/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未定義のため、なぜこれはエラーにならないのですか?これを「グッドプラクティス」と見なしていますか?
回答:
forin 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"
doneBourneシェルである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によって定義されているので、はい、それは「良い習慣」と見なされます。