在 ksh 中减去两个负数时出错:“赋值需要左值”

在 ksh 中减去两个负数时出错:“赋值需要左值”

我正在尝试调试别人的脚本:

代码行是:

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]}))

相关内容