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


76

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

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

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

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

私はそれ目的を満たしていると確信してます。学びたいだけです。

回答:


118

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

変数名の後に、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

条件コマンドdoのリストがどこで終わるかを伝える必要があります。

Bourneシェルはをサポートしていなかったことに注意してください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、not、ashnor yash)もサポートしています。

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

Bourneシェル、kshおよびzsh(ただしではないbash)サポート:

for i { echo "$i"; }

一方bashkshおよびzsh(ただしBourneシェル)のサポート:

for i; { echo "$i"; }

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

for i
{ echo "$i";}

ksh93bashzshサポート:

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

2
いつものように、完全かつ完璧な答え(zshを参照)...
Kiwy

2
いずれの場合も、「厳密に必要」ではありませんfor。コマンドは改行またはセミコロンで終了できます。if/ while(前者はでthenなく前者do)にはもう少し理にかなっていますが、原則として、それらを省略し、複数のコマンドを(まれに)使用するためにサブシェルまたはブレースを必要とすることもできます。Bourneシェルがそれを行う本当の理由は、ALGOLがそれを行うためであると思わdoneodます。
Random832

4
@ Random832:odOctal Dumpプログラムの名前として既に使用されていたためです。
user1024

8
ありますので、多くのここで私は知りませんでした。ありがとうございました!
軌道上の明るさのレース

1
@mirabilos for i doはBourneおよびPOSIXですが、一部の古いバージョンの灰ベースのシェルIIRCでは動作しません。スペース文字が含まれていないfor i in "$@"場合、Bourneシェルで$IFSは機能しません。for i<newline>do非常に古いBSDシステムを検討する必要がある場合、実際に最もポータブルです。参照してくださいin-ulm.de/~mascheck/various/bourne_args詳細
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.