Erro ao subtrair dois números negativos em ksh: “atribuição requer lvalue”

3

Estou tentando depurar o script de outra pessoa:

A linha de código é:

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

y é calculado bem, desde que ambos os lados sejam números positivos. No entanto, tenho uma situação de produção em que ambos são negativos e o erro que recebo é:

DEBUG Old value = -4144290000
DEBUG New value = -4009685000
script.sh: line 123: -4144290000--4009685000: assignment requires lvalue

Eu nunca usaria ksh para o mais simples dos cálculos, mas estou em uma posição de suporte à produção e tenho que lidar com uma grande bola de lama, eu usaria pelo menos Perl / Python. Alguém pode dizer por que esse problema está acontecendo e como consertá-lo?

    
por amphibient 27.12.2012 / 19:51

2 respostas

5

Se você estiver usando a sintaxe $xxx , a variável será expandida e o resultado será avaliado como uma expressão aritmética.

Então,

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

Torna-se

y=$((-4144290000--4009685000))

e ksh reclamam do operador -- inesperado.

Você pode contorná-lo adicionando espaços conforme descobriu, e nesse caso ele se torna:

y=$((-4144290000 - -4009685000))

Mas você também pode escrever:

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

Nesse caso, o conteúdo da variável é expandido como parte da avaliação aritmética e, nesse caso, como um valor numérico.

O diferente se torna ainda mais importante em casos como:

a=1+1 b=2
echo "$((a*b)) vs $(($a*$b))"

O que dá 4 vs 3 e aponta para um terceiro e mais robusto do que a primeira maneira de contornar o problema:

y=$(((${oldvalue[$x]}) - (${newvalue[$x]})))
    
por 27.12.2012 / 21:52
0

Precisava de espaços em ambos os lados do negativo:

y=$((${oldvalue[$x]} - ${newvalue[$x]}))
    
por 27.12.2012 / 20:06