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

What is the most portable way to write an iteration (for, while) loop in a (POSIX) shell script?

根据我在堆栈上阅读的内容,这是一种语法:

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? 但我想在这里得到答案,因为我相信我的问题对于未来的搜索来说更精确。

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

  • 您应该使用 $(…) 代替反引号。

  • 甚至 POSIX shell 也支持 iterator=$(( $iterator + 1 ))(其中 $(( … )) 符号与 $( … ) 符号不同!),因此您不需要需要使用 expr.

将它们放在一起:

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

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

有些人会要求在引用变量时用引号括起来。这样做没有什么坏处,在很多通用代码中,我会这样做。但是这里的值是由脚本严格控制的;空格或其他笨拙的字符无法妨碍脚本的正确运行。