在 (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 的一部分。
有些人会要求在引用变量时用引号括起来。这样做没有什么坏处,在很多通用代码中,我会这样做。但是这里的值是由脚本严格控制的;空格或其他笨拙的字符无法妨碍脚本的正确运行。
根据我在堆栈上阅读的内容,这是一种语法:
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 的一部分。
有些人会要求在引用变量时用引号括起来。这样做没有什么坏处,在很多通用代码中,我会这样做。但是这里的值是由脚本严格控制的;空格或其他笨拙的字符无法妨碍脚本的正确运行。