Answers:
请注意,该语法是从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
您需要do
告诉条件命令列表的结束位置。
请注意,Bourne shell不支持for i; do
。在2016年版标准之前,该语法也不是POSIX(for i do
一直是POSIX;请参阅相关的Austin组bug)。
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的shell(Bourne,ksh,bash,zsh,不是ash
nor yash
)也支持:
for i in 1 2 3; { echo "$i";}
Bourne shell ksh
和zsh
(但不bash
支持)还支持:
for i { echo "$i"; }
虽然bash
,ksh
和zsh
(但不是Bourne shell)中支持:
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
),它更有意义,但是原则上,那些可以省略它,并且需要一个子shell或花括号来(很少)使用多个命令。我怀疑Bourne shell这样做的真正原因是因为ALGOL做到了,我们应该done
为没有拼写而感到高兴od
。
od
已经被用作八进制转储程序的名称。
for i do
是Bourne和POSIX,但在某些旧版本的基于ash的shell IIRC中将无法使用。for i in "$@"
如果$IFS
不包含空格字符,则无法在Bourne Shell中使用。for i<newline>do
如果您需要考虑非常老的BSD系统,它确实是最便携的。见in-ulm.de/~mascheck/various/bourne_args的细节