doBash forループ構文のキーワードの目的は何ですか?私には、それは冗長に感じます。
for i in `seq 1 2`; do echo "hi"; doneなぜこのような構文ではないのですか?
for i in `seq 1 2`; echo "hi"; done私はそれが目的を満たしていると確信しています。学びたいだけです。
doBash forループ構文のキーワードの目的は何ですか?私には、それは冗長に感じます。
for i in `seq 1 2`; do echo "hi"; doneなぜこのような構文ではないのですか?
for i in `seq 1 2`; echo "hi"; done私はそれが目的を満たしていると確信しています。学びたいだけです。
回答:
構文は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"; }一方bash、kshおよびzsh(ただしBourneシェル)のサポート:
for i; { echo "$i"; }すべて(ボーン、bash、ksh、zsh)のサポート:
for i
{ echo "$i";}ksh93、bash、zshサポート:
for ((i=1;i<=3;i++)) { echo "$i"; }for。コマンドは改行またはセミコロンで終了できます。if/ while(前者はでthenなく前者do)にはもう少し理にかなっていますが、原則として、それらを省略し、複数のコマンドを(まれに)使用するためにサブシェルまたはブレースを必要とすることもできます。Bourneシェルがそれを行う本当の理由は、ALGOLがそれを行うためであると思わdoneれodます。
                    odOctal Dumpプログラムの名前として既に使用されていたためです。
                    for i doはBourneおよびPOSIXですが、一部の古いバージョンの灰ベースのシェルIIRCでは動作しません。スペース文字が含まれていないfor i in "$@"場合、Bourneシェルで$IFSは機能しません。for i<newline>do非常に古いBSDシステムを検討する必要がある場合、実際に最もポータブルです。参照してくださいin-ulm.de/~mascheck/various/bourne_args詳細