我正在尝试调试别人的脚本:
代码行是:
y=$((${oldvalue[$x]}-${newvalue[$x]}))
y
只要两边都是正数,就可以很好地计算。但是,我遇到的生产情况是,它们都是负数,我得到的错误是:
DEBUG Old value = -4144290000
DEBUG New value = -4009685000
script.sh: line 123: -4144290000--4009685000: assignment requires lvalue
我从来不会使用ksh
自己进行哪怕是最简单的计算,但我处于生产支持的位置并且必须处理一个大泥球,我至少会使用 Perl/Python。谁能告诉我为什么会出现这个问题以及如何解决它?
答案1
如果您使用该$xxx
语法,则会扩展变量,然后将结果计算为算术表达式。
所以,
y=$((${oldvalue[$x]}-${newvalue[$x]}))
成为
y=$((-4144290000--4009685000))
并ksh
抱怨那个意想不到的--
操作员。
您可以通过添加空格来解决这个问题,在这种情况下它会变成:
y=$((-4144290000 - -4009685000))
但是,你也可以这样写:
y=$((oldvalue[$x]-newvalue[$x])))
在这种情况下,变量的内容将作为算术评估的一部分进行扩展,并且在这种情况下作为一个数值进行扩展。
在以下情况下,差异变得更加重要:
a=1+1 b=2
echo "$((a*b)) vs $(($a*$b))"
其中给出4 vs 3
、 和 指向第三种且比第一种更稳健的方法来解决该问题:
y=$(((${oldvalue[$x]}) - (${newvalue[$x]})))
答案2
减号两边都需要空格:
y=$((${oldvalue[$x]} - ${newvalue[$x]}))