Preciso somar os números, levar os valores adiante e armazenar em uma variável na condição if/else em um loop no bash do Linux. Estou obtendo apenas o valor da última iteração, mas não a soma inteira.
No exemplo abaixo, duas condições correspondem aos critérios. Durante a primeira iteração, a pontuação será 100 e a pontuação da segunda iteração será 200. Preciso somar o valor na variável fscore para cada iteração e imprimir a pontuação final.
Código:
score=0
x=10
y=20
fscore=0
arr=("abc" "efg" "ijk")
for str in ${arr[@]}
do
if [[ "$str" = "abc" && "$x" -eq 10 ]]
then
score=100
elif [[ "$str" = "efg" && "$y" -eq 20 ]]
then
score=200
else
:
fi
res=`expr $score + $fscore`
done
echo $res
Saída:
200
Saída desejada:
300
Desde já, obrigado!
Suspeito que você queira algo como:
[[...]]
Ou usar o estilo e as estruturas Korn((...))
em vez de seu equivalente padrão¹, para fazer com que pareça mais com C para operações aritméticas:(o seu
[[ "$str" = "abc" && "$x" -eq 10 ]]
também funciona² em shells do tipo Korn, essa parte do seu código está boa).O problema principal é que você não está acumulando os resultados entre as iterações. Acima, nós os acumulamos adicionando o
score
nares
variável.Outras questões:
${arr[@]}
. Não faz sentido usar arrays se você estiver deixando${arr[@]}
sem aspas.score
para os casos que não correspondem a nenhuma condição, então ele herdaria o valor da iteração anterior.expr
. Todos os shells do tipo POSIX têm suporte aritmético inteiro embutido. O mesmo para`cmd`
o qual foi substituído por$(cmd)
.for
loop e o que não está.¹ Em qualquer caso, não há array no padrão
sh
. Para torná-losh
sintaxe padrão, você precisaria substituirarr=(...)
withset -- ...
efor str in "${arr[@]}"; do
por apenasfor str do
.² Note que eles não são todos equivalentes. No bash,
[
's-eq
funciona apenas com inteiros decimais (por exemplo, 012 é interpretado como 12) enquanto for(( ... ))
e[[...]]
's-eq
, operandos são tomados como expressões aritméticas, onde5+5
,0xA
,012
e às vezesRANDOM
são interpretados como10
. Eles também são mais perigosos, pois podem acabar executando comandos arbitrários se usados com dados não higienizados, então usar o comando padrão[
é geralmente preferível se for o suficiente para o propósito.