bash:-eq 与 == 和 `bc` 输出类型

bash:-eq 与 == 和 `bc` 输出类型

这段代码取自一个更大的脚本,(谦虚地)模拟不存在的abs()函数:

[[ $(echo "$val < 0" | bc) -eq 1 ]] && val=$(echo "$val * -1" | bc)

所以我们测试这个数字是否为负数;如果是,&&则将执行后面的第二条语句。这是我原来的台词。

其他一些 SE 用户后来将其更改为:

(( $(bc <<<"$val < 0") == 1 )) && val=$(bc <<<"$val * -1")

好吧,虽然这两个显然都有效,但我仍然更喜欢我的,因为它不仅使用运算-eq符(已实现尤其对于非字符串),但它也避免了here-strings,这使得代码在只读环境中工作得更好。 (请记住,/tmp必须可写才能使此处字符串起作用。)

最后,我似乎记得bc在后面的行中将输出一个真正的整数,这使得使用==相当有问题,因为仅建议将其用于字符串。不幸的是,bc它的页面中没有透露man它是否将结果输出为纯数字或字符串。

意见?

答案1

你在这里感到困惑。

[[ $(echo "$val < 0" | bc) -eq 1 ]]和都(( $(bc <<<"$val < 0") == 1 ))使用整数比较。

((..))相当于let内置于ksh,bashzsh.它评估了算术表达式。在 中((..)),所有运算符及其优先级、结合性和值与 C 语言中的相同。

令你困惑的是==新的测试操作符内部[[...]]。如果==可用,它相当于=并执行模式匹配。您需要在两边加双引号来进行字符串比较[[ "$a" == "$b" ]]

相关内容