Bashの「for」ループには「in foo bar ...」部分はありません。

Bashの「for」ループには「in foo bar ...」部分はありません。

私は最近動作するので、私を混乱させるいくつかのコードを見ていましたが、うまくいくとは思わなかった。コードはこの例で単純化されました。

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

コマンドライン引数で実行すると印刷されます。

$ ./test a b c
a
b
c

(私としては)予想外のことだった。var定義されていないためにエラーが発生しないのはなぜですか?これを使用することは「良い習慣」と見なされますか?

答え1

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 シェルの一部のバージョンで 0 の場合 (修正でき${1+"$@"}ない"$@")、$IFSBourne および 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例では)を繰り返しますbc

そしてこの行動はPOSIXで定義はい、現時点ではこれは「良い習慣」と見なされます。

関連情報