for 循环有两种语法风格:
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
for name [ [in [words ...] ] ; ] do commands; done
乍一看,两者可以表达的循环类型似乎彼此无关。第一个可以基于算术表达式来表达循环,而第二个可以基于集合中的枚举成员来表达循环words
。
从本质上讲,它们实际上在可以表达的循环类型上有所不同,还是彼此等效?如果是前者,什么时候用哪个?
答案1
第二种形式始终是有限的,第一种形式可以简单地制成无限循环:
for ((;;)); do echo $SHELL; done
答案2
首先
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
可以说比第二个更普遍
for name [ [in [words ...] ] ; ] do commands; done
因为
- 表达式中使用的变量可以用作数组索引(并从第二个中使用的单词列表中获取选择),
- 但第二种形式使用不变的单词列表来逐步执行(但第一种形式使用表达用于结束循环,这意味着循环终止未在相同程度上预先确定)。
答案3
这:
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
(( ))
循环整数,因为每个部分(除以;
)内都是一个“算术表达式”,因此强制这样做。
它类似于c
for循环,在一行中定义了开始、结束和“步骤动作”,更紧凑。
第二个适用于单词列表,可以是数字、字符串或数组:
for a in 1 2 3 4 5; do echo "$a"; done
for a in one two three four five; do echo "$a"; done
for a in "${one[@]}" ; do echo "$a"; done
需要注意的是,单词列表会受到外壳分割的影响,这在前一种构造中不是问题。