在(POSIX)shell脚本中编写迭代(for,while)循环的最便携方式是什么?

时间:2016-09-04 17:19:40

标签: shell loops iteration posix

从我在堆栈上读到的内容,这里有一种语法:

iterator=0
while [ "$iterator" -lt 100 ]
do 
  printf "$iterator" 
  iterator=`expr $iterator + 1 `
done

有人关心改进吗?

目标是制作一个在posix系统上最便携的迭代循环。

[编辑] 刚发现这个问题有非常相关的答案: How do I iterate over a range of numbers defined by variables in Bash?但我想在这里给出答案,因为我相信我的问题对于将来的搜索会更准确。

1 个答案:

答案 0 :(得分:2)

  • 您可能需要printf格式的换行符;否则,这些数字都打印在一行上,没有间距。

  • 您应该使用$(…)代替后面的标记。

  • 即使POSIX shell支持iterator=$(( $iterator + 1 ))(其中$(( … ))表示法与$( … )表示法不同!),因此您无需使用expr

把它们放在一起:

iterator=0
while [ $iterator -lt 100 ]
do
    printf '%d\n' $iterator
    iterator=$(( $iterator + 1 ))
done

如果您有seq等命令可用,但还有其他选项,但这不是POSIX的一部分。

有人会在引用时要求将变量括在引号中。这样做没有任何害处,而且在很多通用代码中,我会这样做。但这里的值严格受脚本控制;空格或其他笨拙的角色无法妨碍脚本的正确操作。