web-dev-qa-db-ja.com

Bash forループの「do」キーワードの目的は何ですか?

Bash doループ構文のforキーワードの目的は何ですか?私には、それは冗長だと感じています。

for i in `seq 1 2`; do echo "hi"; done

なぜこのような構文ではないのですか?

for i in `seq 1 2`; echo "hi"; done

きっとします目的を満たします。ただ学びたいだけです。

77

この構文はBourne Shellから継承されていることに注意してください。

変数名の後には、inを使用して要素のリストを明示的に指定するか、doを使用して位置パラメータをループできます。

for i in 1 2 3
do
  echo "$i"
done

または

set 1 2 3
for i do
  echo "$i"
done

両方のケースでdoを使用すると(最初のケースでは厳密に必要でない場合でも)、構文の一貫性が向上します。また、whileが必要なuntil/doループとも一致します。

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

conditionコマンドのリストがどこで終了するかを通知するには、doが必要です。

Bourne Shellはfor i; doをサポートしていないことに注意してください。その構文は、標準の2016年版までPOSIXでもありませんでした(for i doは常にPOSIXでした。 関連するAustinグループのバグ を参照してください)。

zshには次のような省略形があります。

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

または、複数の変数のサポート:

for i j (1 a 2 b) echo $i $j

(ただし、上記のinの代わりに変数名としてdoまたはjを使用することはできません)。

まれにしか文書化されていない場合でも、ほとんどのBourneのようなシェル(Bourne、ksh、bash、zsh、ashyashもない)も以下をサポートします。

for i in 1 2 3; { echo "$i";}

Bourne Shell、kshおよびzshbashは除く)もサポートします。

for i { echo "$i"; }

bashkshおよびzsh(ただしBourne Shellはサポートしていません)は次をサポートします:

for i; { echo "$i"; }

すべての(ボーン、bashkshzsh)サポート:

for i
{ echo "$i";}

ksh93bashzshサポート:

for ((i=1;i<=3;i++)) { echo "$i"; }
118