我知道如何for
在bash
.
如何在 POSIX shell 脚本中执行等效循环?
由于有多种方法可以实现相同的目标,请随意添加您自己的答案并详细说明它的工作原理。
一个这样的bash
循环的示例如下:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
我知道如何for
在bash
.
如何在 POSIX shell 脚本中执行等效循环?
由于有多种方法可以实现相同的目标,请随意添加您自己的答案并详细说明它的工作原理。
一个这样的bash
循环的示例如下:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
我在Shellcheck.net wiki中找到了有用的信息,我引用:
重击¹:
POSIX:
虽然要注意
i++
不是 POSIX,所以必须翻译,例如 toi += 1
ori = i + 1
。:
是一个始终具有成功退出代码的空命令。"$((expression))"
是作为参数传递给 的算术扩展:
。您可以在算术扩展中分配给变量或进行算术/比较。因此,问题中的上述脚本可以使用以下规则以 POSIX 方式重写:
虽然在这里,您可以通过以下方式使其更清晰:
如在 中
init
,我们分配了一个常量值,因此我们不需要计算算术表达式。i != 10
in可以很容易地test
转换为[
表达式,并且 fornext
使用 shell 变量赋值而不是算术表达式中的变量赋值,让我们摆脱:
了引用的需要。除了
i++
->之外i = i + 1
,还有更多非 POSIX 的特定于 ksh/bash 的结构的翻译,您可能需要这样做:i=1, j=2
. 算术运算符不是真正的POSIX,
(并且在某些使用 ksh93 的语言环境中与小数分隔符冲突)。您可以将其替换为像+
in这样的另一个运算符,: "$(((i=1) + (j=2)))"
但使用i=1 j=2
会更清晰。a[0]=1
: POSIX shell 中没有数组i = 2**20
: POSIX shell 语法中没有幂运算符。<<
虽然支持 2 的幂,但可以使用i = 1 << 20
. 对于其他权力,可以诉诸bc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: 不是POSIX。POSIX 工具箱中最接近的是i=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.¹ 从技术上讲,该语法来自 ksh93 shell,除了 bash 之外,zsh 也可以使用
感谢您对上述差异的深入背景知识。使用 shellcheck.net 时对我有用的替代品如下所示。
重击
POSIX
有些人注意到 seq 也是使用 seq 1 10 的选项。创建一个循环,但这取决于 os 有 seq。
这种方法更通用,因为您可以
$
在其中插入任意变量:只需确保您已
seq
安装实用程序,但由于它位于 中CoreUtils
,因此您可以安装。