kshから2つの負の数を減算中にエラー: "割り当てにはlvalueが必要です。"

kshから2つの負の数を減算中にエラー: "割り当てにはlvalueが必要です。"

他人のスクリプトをデバッグしようとしています。

コード行は次のとおりです。

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、最初の方法よりも問題を解決する3番目で強力な方法を指します。

y=$(((${oldvalue[$x]}) - (${newvalue[$x]})))

答え2

マイナス記号の両側にはスペースが必要です。

y=$((${oldvalue[$x]} - ${newvalue[$x]}))

関連情報