bash + cálculo aritmético com bash

0

Eu preciso fazer o follwing com o bash qual é o caminho elegante? para obter o valor final de $ $

worker_machine=32
executors_per_node=3

executer=$worker_machine/$executors_per_node-1
spare=$executer X 0.07 
sum=$executer-$spare ( with round the number to down ) 

example:

32/3 = 10 - 1 = 9
9 X 0.7 = 0.6
9 – 0.6 = 8 ( with round the number to down ) 
    
por jango 11.02.2018 / 18:34

2 respostas

1

Usando awk , pegando valores de variáveis do shell:

awk -v n="$worker_machine" -v m="$executors_per_node" \
    'BEGIN { printf("%d\n", 0.93 * (n / m - 1)) }' /dev/null

O script awk não recebe nenhuma entrada como de costume, então usamos /dev/null como arquivo de entrada e fazemos nosso cálculo e saída em um bloco BEGIN .

Usando bc :

sum=$( printf '0.93 * (%d / %d - 1)\n' "$worker_machine" "$executors_per_node" | bc )
printf '%.0f\n' "$sum"

Usando dc :

sum=$( printf '%d\n%d\n/\n1\n-\n0.93\n*\np\n' "$worker_machine" "$executors_per_node" | dc )
printf '%.0f\n' "$sum"
    
por 11.02.2018 / 18:59
0

O shell é capaz de para a matemática (como inteiros, que arredondam para baixo):

$ sum=$(( ( worker_machine/executors_per_node-1 ) * 93 / 100 ))
$ echo "$sum"
8

A escala padrão para bc é 0, então os resultados da divisão seriam inteiros:

$ sum=$(bc <<<"($worker_machine / $executors_per_node - 1)*93/100")
$ echo "$sum"
8

Como queremos um número inteiro, podemos pedir ao awk por um

$ sum=$(awk -v m="$worker_machine" -v n="$executors_per_node" 'BEGIN{ print( int((m/n-1)*93/100) )}' /dev/null)
$ echo "$sum"
8
    
por 12.02.2018 / 00:20