这两种风格的 for 循环在表达内容上有什么不同吗?

这两种风格的 for 循环在表达内容上有什么不同吗?

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

(( ))循环整数,因为每个部分(除以;)内都是一个“算术表达式”,因此强制这样做。

它类似于cfor循环,在一行中定义了开始、结束和“步骤动作”,更紧凑。

第二个适用于单词列表,可以是数字、字符串或数组:

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

需要注意的是,单词列表会受到外壳分割的影响,这在前一种构造中不是问题。

相关内容