
这段代码取自一个更大的脚本,(谦虚地)模拟不存在的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
,bash
和zsh
.它评估了算术表达式。在 中((..))
,所有运算符及其优先级、结合性和值与 C 语言中的相同。
令你困惑的是==
新的测试操作符内部[[...]]
。如果==
可用,它相当于=
并执行模式匹配。您需要在两边加双引号来进行字符串比较[[ "$a" == "$b" ]]
。