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詳細