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

amp*_*ent 4 ksh shell-script arithmetic

我正在尝试调试其他人的脚本:

代码行是:

y=$((${oldvalue[$x]}-${newvalue[$x]}))
Run Code Online (Sandbox Code Playgroud)

y只要双方都是正数,就可以很好地计算。但是,我有一个生产情况,它们都是负面的,我得到的错误是:

DEBUG Old value = -4144290000
DEBUG New value = -4009685000
script.sh: line 123: -4144290000--4009685000: assignment requires lvalue
Run Code Online (Sandbox Code Playgroud)

ksh即使是最简单的计算,我也不会使用自己,但我处于生产支持的位置并且必须处理一大堆泥浆,我至少会使用 Perl/Python。谁能告诉为什么会发生这个问题以及如何解决它?

Sté*_*las 5

如果您使用$xxx语法,则扩展变量,然后将结果计算为算术表达式。

所以,

y=$((${oldvalue[$x]}-${newvalue[$x]}))
Run Code Online (Sandbox Code Playgroud)

成为

y=$((-4144290000--4009685000))
Run Code Online (Sandbox Code Playgroud)

ksh抱怨那个意外的--运营商。

您可以通过添加空格来解决它,在这种情况下,它变为:

y=$((-4144290000 - -4009685000))
Run Code Online (Sandbox Code Playgroud)

但是,你也可以这样写:

y=$((oldvalue[$x]-newvalue[$x])))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,变量的内容作为算术评估的一部分进行扩展,在这种情况下作为一个数值。

在以下情况下,差异变得更加重要:

a=1+1 b=2
echo "$((a*b)) vs $(($a*$b))"
Run Code Online (Sandbox Code Playgroud)

这给出了4 vs 3, 并指出了解决问题的第三种方法,并且比第一种方法更强大:

y=$(((${oldvalue[$x]}) - (${newvalue[$x]})))
Run Code Online (Sandbox Code Playgroud)