do
Bash for
ループ構文のキーワードの目的は何ですか?私には、それは冗長に感じます。
for i in `seq 1 2`; do echo "hi"; done
なぜこのような構文ではないのですか?
for i in `seq 1 2`; echo "hi"; done
私はそれが目的を満たしていると確信しています。学びたいだけです。
do
Bash 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、ash
nor 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
ます。
od
Octal Dumpプログラムの名前として既に使用されていたためです。
for i do
はBourneおよびPOSIXですが、一部の古いバージョンの灰ベースのシェルIIRCでは動作しません。スペース文字が含まれていないfor i in "$@"
場合、Bourneシェルで$IFS
は機能しません。for i<newline>do
非常に古いBSDシステムを検討する必要がある場合、実際に最もポータブルです。参照してくださいin-ulm.de/~mascheck/various/bourne_args詳細