「in foo bar…」部分なしの「for」ループをバッシュ


25

私は最近、私を混乱させたコードを見ていました。コードはこの例になります

#!/bin/bash
for var;
do
  echo "$var"
done

コマンドライン引数で実行すると、それらが出力されます

$ ./test a b c
a
b
c

これは、私にとっては予想外のことです。var未定義のため、なぜこれはエラーにならないのですか?これを「グッドプラクティス」と見なしていますか?

回答:


27

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"
done

Bourneシェルであるksh88は、特定の条件下で問題が発生します($#Bourneシェルの一部のバージョンではwhen が0(回避できる${1+"$@"}代わり)、Bourneおよびksh88でスペース文字が含まれない"$@"場合$IFSなど)、またはこのnounsetオプションは有効になっており$#、一部のシェルの一部のバージョンでは0ですbash(これ${1+"$@"}回避策として)。


私の脳が開始時に繰り返される「ループ」の編集を停止することを決定する前に、この3回を読まなければなりませんでした
Three Diag

20

これがデフォルトの動作です、はい。これは、に記載されてhelpforキーワード:

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によって定義されているので、はい、それは「良い習慣」と見なされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.