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

在(POSIX)shell脚本中编写迭代(for,while)循环的最方便的方法是什么?,shell,loops,iteration,posix,Shell,Loops,Iteration,Posix,根据我在stack上读到的内容,这里有一个语法: iterator=0 while [ "$iterator" -lt 100 ] do printf "$iterator" iterator=`expr $iterator + 1 ` done 有人想改进一下吗 目的是使迭代循环在posix系统上最具可移植性 [编辑] 刚刚发现这个问题,它有非常相关的答案: 但我想在这里得到一个答案,因为我相信我的问题对于未来的搜索更为精确。 您可能需要printf格式的换行符;否则,所有数字都

根据我在stack上读到的内容,这里有一个语法:

iterator=0
while [ "$iterator" -lt 100 ]
do 
  printf "$iterator" 
  iterator=`expr $iterator + 1 `
done
有人想改进一下吗

目的是使迭代循环在posix系统上最具可移植性

[编辑] 刚刚发现这个问题,它有非常相关的答案: 但我想在这里得到一个答案,因为我相信我的问题对于未来的搜索更为精确。

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

  • 您应该使用
    $(…)
    来代替背面的记号

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

把这些放在一起:

iterator=0
while [ $iterator -lt 100 ]
do
    printf '%d\n' $iterator
    iterator=$(( $iterator + 1 ))
done
如果有可用的
seq
等命令,还有其他选项,但这不是POSIX的一部分

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

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

  • 您应该使用
    $(…)
    来代替背面的记号

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

把这些放在一起:

iterator=0
while [ $iterator -lt 100 ]
do
    printf '%d\n' $iterator
    iterator=$(( $iterator + 1 ))
done
如果有可用的
seq
等命令,还有其他选项,但这不是POSIX的一部分


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

要迭代什么?整数。这里我以-lt 100为例。可能的重复我们宁愿在一个地方收集好的答案,也不愿把它们分散在许多类似的问题上。Bash和POSIX之间的区别使得这一点不那么简单,但是指定的副本有许多Anwer可移植,并且被标记为Anwer。您想迭代什么?整数。这里我以-lt 100为例。可能的重复我们宁愿在一个地方收集好的答案,也不愿把它们分散在许多类似的问题上。Bash和POSIX之间的区别使得这一点不那么简单,但是指定的副本有许多Anwer是可移植的,并且被标记为可移植的。关于新行:是的,我有点忽略了:)关于
seq
:实际上不是POSIX,而是调用子流程,所以我不想这样。您不介意使用带有反勾号和
expr
的子进程,所以我不确定为什么
seq
会有问题,因为它是一个子进程。不是POSIX完全是另一个问题——也是不可避免的。但是
awk'BEGIN{for(i=0;i<100;i++)print i}
是完美的POSIX,尽管仍然有一个子进程。顺便说一句,我的答案与你交叉引用的问题非常接近。是的,不使用子进程是另一回事。我们不要把事情搞混了。顺便说一句,你的awk语法中缺少一个结束引号。关于新行:是的,我有点忽略了:)关于
seq
:实际上不是POSIX,并且调用子进程,所以不要这样。你不介意使用带有反勾号的子进程和
expr
,所以我不确定为什么
seq
会成为一个问题,因为它是一个子过程。不是POSIX完全是另一个问题——也是不可避免的。但是
awk'BEGIN{for(i=0;i<100;i++)print i}
是完美的POSIX,尽管仍然有一个子进程。顺便说一句,我的答案与你交叉引用的问题非常接近。是的,不使用子进程是另一回事。我们不要把事情搞混了。顺便说一句,awk语法中缺少结束引号。