load_1=15231
load_2=20547
load_3=24561
load_4=22874
f4=434
min=0
f3=1
for n in 1 2 3 4
do [ "$((sum_$n=load_$n+f4))" -lt \
"$((min=min?min:sum_$n))" ] &&
min=$((sum_$n)) f3=$n
printf '$%s =\t%d\n' \
"sum_$n" "$((sum_$n))" \
min "$min" f3 "$f3"
done
A expansão matemática expandirá as variáveis do shell primeiro . Quando isso acontecer, chegará a uma declaração que se parece com:
sum_[1234] = load_[1234] + f4
... onde os colchetes representam cada iteração no loop e qual é a sintaxe aritmética válida porque as strings representam nomes de variáveis para inteiros em uma expansão aritmética de shell. Ele definirá essas variáveis no contexto de shell atual mesmo quando for usado como um argumento para [ test ]
- portanto, $sum_1
é definido simultaneamente para o valor 15231 e comparado a $min
, que é% código%.
Mas, com base nos seus valores, 0
nunca é ajustado de acordo com $min
, porque nenhum valor para $sum_$n
é menor que $sum_$n
.
OUTPUT
$sum_1 = 15665
$min = 15665
$f3 = 1
$sum_2 = 20981
$min = 15665
$f3 = 1
$sum_3 = 24995
$min = 15665
$f3 = 1
$sum_4 = 23308
$min = 15665
$f3 = 1
Na verdade, poderíamos colocar a coisa toda em uma única expansão de matemática e deixar o teste completo:
load_1=15231
load_2=20547
load_3=24561
load_4=22874
f4=434
f3=$((!(min=0)))
for n in 1 2 3 4
do echo \$min = "$((
min = ( min > ( sum_$n = load_$n+f4 ) )
? ( sum_$n + !( f3 = $n ) )
: ( min ? min : sum_$n )
))"; done
Isso define todas as variáveis apropriadamente para cada iteração, mas somente se expande para o valor de $min
a cada vez. Imprime:
$min = 15665
$min = 15665
$min = 15665
$min = 15665