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

我确信它确实可以达到目的。我只想学习。

Answers:


118

请注意,该语法是从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

(尽管您不能使用indo作为变量名代替j上述名称)。

即使很少记录,大多数类似Bourne的shell(Bourne,ksh,bash,zsh,不是ashnor yash)也支持:

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

Bourne shell kshzsh(但不bash支持)还支持:

for i { echo "$i"; }

虽然bashkshzsh(但不是Bourne shell)中支持:

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),它更有意义,但是原则上,那些可以省略它,并且需要一个子shell或花括号来(很少)使用多个命令。我怀疑Bourne shell这样做的真正原因是因为ALGOL做到了,我们应该done为没有拼写而感到高兴od
2016年

4
@ Random832:那是因为od已经被用作八进制转储程序的名称。
2016年

8
这里有很多我不知道的东西。谢谢!
Lightness Races in Orbit

1
@mirabilos 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的细节
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.