Bash for 循环中“do”关键字的用途是什么?

Fre*_*son 80 shell bash for

doBashfor循环语法中关键字的用途是什么?对我来说,感觉是多余的。

for i in `seq 1 2`; do echo "hi"; done
Run Code Online (Sandbox Code Playgroud)

为什么不是这样的语法?

for i in `seq 1 2`; echo "hi"; done
Run Code Online (Sandbox Code Playgroud)

我确信它确实达到了目的。我只是想学习。

Sté*_*las 118

请注意,该语法是从 Bourne shell 继承的。

在变量名称之后,您可以in明确给出元素列表,或者do循环遍历位置参数。

for i in 1 2 3
do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

或者

set 1 2 3
for i do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

在这do两种情况下(即使在第一种情况下它不是绝对必要的)都可以使语法更加一致。它也与需要的while/until循环一致do。

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done
Run Code Online (Sandbox Code Playgroud)

您需要do告诉条件命令列表的结束位置。

请注意,Bourne shell 不支持for i; do. 直到 2016 版标准(for i do一直是 POSIX;请参阅相关的 Austin 组错误),该语法也不是 POSIX 。

zsh 有一些速记形式,如:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Run Code Online (Sandbox Code Playgroud)

或支持多个变量:

for i j (1 a 2 b) echo $i $j
Run Code Online (Sandbox Code Playgroud)

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

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

for i in 1 2 3; { echo "$i";}
Run Code Online (Sandbox Code Playgroud)

Bourne shellksh和zsh(但不bash支持)也支持:

for i { echo "$i"; }
Run Code Online (Sandbox Code Playgroud)

While bash, kshand zsh(但不是 Bourne shell)支持:

for i; { echo "$i"; }
Run Code Online (Sandbox Code Playgroud)

所有 (Bourne, bash, ksh, zsh) 支持:

for i
{ echo "$i";}
Run Code Online (Sandbox Code Playgroud)

ksh93, bash,zsh支持:

for ((i=1;i<=3;i++)) { echo "$i"; }
Run Code Online (Sandbox Code Playgroud)

  • 这里有_这么多_我不知道。谢谢! (8认同)
  • @Random832:那是因为 `od` 已经被用作 Octal Dump 程序的名称。 (4认同)
  • 一如既往,完整完美的答案(参考zsh)... (2认同)
  • 在任何一种情况下,对于 `for` 都不是“绝对必要的”;命令可以由换行符或分号终止。它对 `if`/`while`(前者带有 `then` 而不是 `do`)更有意义,但原则上那些可以省略它并且需要一个子外壳或大括号来(罕见)使用多个命令。我怀疑 Bourne shell 这样做的真正原因是因为 ALGOL 这样做,我们应该很高兴 `done` 没有拼写为 `od`。 (2认同)