eu usaria
while read A B
do echo A=$A B=$B
C=$(( $A + $B ))
echo Sum,C = $C
done<<EOF
1 2
3 4
5 6
7 8
EOF
Para operações mais complexas, dc é seu amigo (notação reversa polonesa!)
C=$(echo "$A $B +pq"|dc)
Eu gostaria de executar um loop for para um conjunto de variáveis que eu indiquei incorretamente como {A,B}
. Depois disso, meu script parece:
#!/bin/sh
for {A,B} in {1,2} {3,4} {5,6} {7,8}
do
echo A=$A B=$B
C=$(($A+$B))
echo Sum,C = $C
done
Como posso corrigi-lo?
eu usaria
while read A B
do echo A=$A B=$B
C=$(( $A + $B ))
echo Sum,C = $C
done<<EOF
1 2
3 4
5 6
7 8
EOF
Para operações mais complexas, dc é seu amigo (notação reversa polonesa!)
C=$(echo "$A $B +pq"|dc)
set 1 2 3 4 5 6 7 8
while [ "$#" -gt 0 ]
do C="$(($1+$2))"
shift 2
done
for
não permite duas atribuições simultâneas dessa maneira. Portanto, coloque uma matriz e shift
no intervalo desejado. Se você usar a matriz $@
do shell padrão como eu faço acima, você sempre estará trabalhando com suas duas primeiras posições $1
e $2
. Se você usar algum tipo de matriz de extensões, estará trabalhando com ${array[0]}
e ${array[1]}
ou ${array[1]}
e ${array[2]}
dependendo do seu shell.
Senão, com um loop for
você pode codificar algum tipo de delimitador em cada argumento:
for x in 1+2 3+4 5+6 7+8
do C="$(($x))"
done
... o que funciona perfeitamente aqui, mas geralmente não é feito de forma tão clara.
Eu poderia fazer um possível contorno (Obrigado @mikeserv por me fornecer a idéia de matriz):
array=('1 2' '3 4' '5 6' '7 8')
for x in "${array[@]}"
do
A='echo $x | awk '{print $1}''
B='echo $x | awk '{print $2}''
echo A=$A B=$B
C=$(($A+$B))
echo Sum,C = $C
done
Sugira se uma simplificação adicional é possível.
Tags shell control-flow