netsize=$somenum
( echo scale=\(2; set -- ### set scale; clear args
while [ "$#" -lt "$netsize" ] ### counts up to $netsize
do set "$@" "bal$(($#+1))" ### saves arg count as bal$#+1
### I do the below because you don't say what
### node$# getbalance does. Here it's random.
eval "node$#(){ "':& x=${!%??} y=${!#"$x"}
echo "$x.$y/'"$#\"; }" ### fakes a node$#() function
printf "%bbal$#=%b" ');"' '";' \( ### );"bal$#=";(bal$#=
"node$#" getbalance ### $x.$y/$#\n
done; printf %b+ ");($1/($@))\c" ### );(bal1/(bal1+...bal$netsize))
) | paste -sd\0 | bc ### removes all \newlines but last
Portanto, não é nada fácil dizer o que você está tentando fazer, mas uma coisa que eu notei é que você acha que precisa chamar um bc
separado para cada avaliação aritmética. O oposto é de longe a maneira mais conveniente de ir - bc
é um programa interativo, além de ser uma linguagem de script completa. Ele irá definir e armazenar os valores das variáveis durante o tempo de atividade - e assim, em vez de tentar armazenar todas essas informações no shell, apenas distribua suas equações e deixe bc
armazenar seus valores para você.
Por exemplo:
{ echo 'x=1+2'; echo '"x=";x'; }| bc
... que imprime ...
x=3
Como o primeiro bc
avalia x
para igual a 1+2
, ele imprime a string arbitrária "x="
para stdout e, por último, é solicitado que ele imprima o valor de x
, e assim é. / p>
O script acima faz praticamente a mesma coisa. Para cada iteração, bal
é incrementado em um. E imprime para bc
:
);"bal$#=";(bal$#=$!/$#\n
... e quando tiver incrementado $#
para corresponder a $netsize
que imprime (dado um exemplo $netsize
of 10) ...
(bal1/(bal1+bal2+bal3+bal4+bal5+bal6+bal7+bal8+bal9+bal10))
Nenhum desses valores é salvo no shell - bc
se lembra de todos eles, no entanto. E quando você coloca uma expressão bc
em (
parens )
, ela é avaliada e impressa.
Eu uso paste -sd\0
para remover todos os \n
ewlines porque não sei o que "node$#" getbalance
deve fazer, mas suponho que ele seguirá sua saída com um \n
ewline e (bal1=
node$# getbalance's output
\n)
é um erro de sintaxe. Então eu limpo todos eles e separo as expressões com ;
semicolons em vez disso (o que eu espero que não seja um caractere node$# getbalance
será impresso) . Para ter uma ideia clara do que todo o script imprime, você pode substituir o bc
na cauda com tr \; \n
.
Aqui, por exemplo, é o que será impresso se netsize=10
:
scale=(2)
"bal1="
(bal1=261.40/1)
"bal2="
(bal2=261.41/2)
"bal3="
(bal3=261.42/3)
"bal4="
(bal4=261.44/4)
"bal5="
(bal5=261.45/5)
"bal6="
(bal6=261.46/6)
"bal7="
(bal7=261.48/7)
"bal8="
(bal8=261.49/8)
"bal9="
(bal9=261.52/9)
"bal10="
(bal10=261.54/10)
(bal1/(bal1+bal2+bal3+bal4+bal5+bal6+bal7+bal8+bal9+bal10))
Tudo isso é executado em bc
, que imprime algo como:
bal1=261.40
bal2=130.70
bal3=87.14
bal4=65.36
bal5=52.29
bal6=43.57
bal7=37.35
bal8=32.68
bal9=29.05
bal10=26.15
.34
Se você puder ser mais claro sobre suas entradas e saídas, posso ajudar a adaptar isso especificamente às suas necessidades, mas fazer var=$(echo stuff at | bc)
uma vez por iteração é um desperdício.