我正在使用 bash,版本:
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
我编写了以下脚本:
#!/usr/bin/bash
a=11
b=4
c=7+b
if [[ a -eq c ]]
then
echo "ok"
else
echo "not ok"
fi
它打印“ok”。当我将其更改a
为 10 时,它打印“not ok”。所以我有一个简单的问题,do[[ ]]
和(( ))
makes 是否“传递求值”(在我的示例中,这意味着c
首先求值为7+b
然后b
求值为4
最后它总体变为11
)?
我之所以问这个问题,是因为我与人工智能(chatGPT、gemini、claude)发生了严重的“争斗”,他们说这种评估不会发生,但我的例子却表明并非如此(他们说c
被评估为7+b
,并且由于它不是一个数字,0
因此取该值)...提前致谢
是的,Bash 在算术表达式中递归评估变量:
但是,由于 Bash 和其他 shell 也会扩展命令替换,因此在算术运算中存在一个命令注入漏洞。因此,不要在未经适当验证的情况下在算术运算(或以及所有其他需要算术表达式的上下文)中使用
$(( ))
不受(( ))
信任[[ ]]
的输入:请参阅: 在 Shell 算术评估中使用未净化数据的安全隐患
一个小问题是赋值时的求值与引用时的求值,即这里
a
和的差c
为零:这里不是零
b
因为在处理分配时会评估的值c=7+b
,并且由于b
未设置,因此使用默认值零。其他 shell 可能会也可能不会这样做。至少 ksh 和 zsh 的行为似乎与 Bash 类似,而 Dash(
/bin/sh
在 Debian/Ubuntu 中)只会给出类似“sh: 1: 非法数字:7+b”的错误。请注意,上面的变量需要包含可以单独求值的完整表达式。如果您改用
$var
,则可以将任何碎片放入变量中,只要结果最终是一个可以求值的表达式即可。例如这是11 - (7+ 4)
: