我们来举个简单的for loop
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
bash 脚本中的分号使 shell 同步执行当前命令,然后转到下一个命令。按 Enter 键的作用实际上是相同的,只是它不允许您输入以下命令,立即刷新缓冲区。
那么为什么 shell 无法解释以下行
for i in `seq 1 10`; do; echo $i; done
这for loop
实际上是如何运作的?
答案1
for
手册页中循环的语法bash
是
for name [ [ in [ word ... ] ] ; ] do list ; done
分号可以替换为回车符,如bash
手册页中其他地方所述:“列表中可能会出现一个或多个换行符的序列,而不是分号来分隔命令。”
然而,反之则不然。您不能随意用分号替换换行符。只要您遵守上述语法规则并且不在后面插入额外的分号,您的多行脚本就可以转换为单行do
:
for i in `seq 1 10`; do echo $i; done
答案2
后面的分号do
是一个错误,不应该出现。
以下正确运行:
for i in `seq 1 10`; do echo $i; done
答案3
尝试一下:
> for name in {Regular,Italic,Bold-Italic}; do echo $name;done
Regular
Italic
Bold-Italic
该元素{1,2,3}
称为大括号扩展。基本上,您的 shell 会扩展此元素并使用 for 循环中生成的每个条目(看这里有关支架扩展的更多信息)。如果不使用{}
,shell 将理解1,2,3
为单个元素,并且只会在循环中通过一次,产生
❯ for name in Regular,Italic,Bold-Italic; do echo $name;done
Regular,Italic,Bold-Italic
这可能不是你所期望的......
或者,您还可以使用大括号扩展来使用以下表示法创建序列
❯ for i in {1..5}; do echo $i; done
1
2
3
4
5
值得一提的是,您可以使用大括号扩展创建具有序列模式的不同字符串,并将其用于 for 循环,如下所示:
❯ for i in A{1..5}BC; do echo $i; done
A1BC
A2BC
A3BC
A4BC
A5BC