他人のスクリプトをデバッグしようとしています。
コード行は次のとおりです。
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]}))