Tentativa bash arithemetic para um script, mas $e
não é atualizada até o final. A saída fala por si.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: Exiba 1..5 como uma porcentagem.
Resultado :
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
Por que é isso?
command-line
bash
scripts
Cybex
fonte
fonte
Respostas:
bash
não pode lidar com aritmética não inteira. Ele fornecerá o resultado correto, desde que todas as expressões sejam números inteiros. Portanto, você precisa evitar obter um valor não inteiro em algum lugar do seu cálculo.No seu caso, quando você está avaliando
1 / 5
,2 / 5
etc. , ele cria os valores inteiros de zero nas correspondências do bash para alguns valores não inteiros e os resultados são zero. A precedência de divisão e multiplicação são os mesmos e os mesmos operadores precedentes são sempre executados da esquerda para a direita à medida que são colocados na expressão.Uma solução alternativa será fazer a multiplicação primeiro e depois a divisão para que o bash nunca precise lidar com valores não inteiros. A expressão corrigida será,
fonte
1/5
não cria um valor não inteiro . Ele cria o valor inteiro0
, uma vez que o resultado da divisão inteira de 1 por 5 é 0. Outras operações usam com sucesso esse valor de0
. Não é isso que o OP pretendia, mas nenhuma operação cria um valor não inteiro e nenhuma operação falha.O Bash não se sai muito bem nesse tipo de aritmética ... Aqui está o seu problema:
Se você precisar manipular valores não inteiros, poderá usar
bc
(obrigado a @Arronical por indicar como formatar a saída como números inteiros)
fonte
.0
partir da saída mudando$percent
em sua eco para${percent%.*}
:)Diferentemente do bash, o awk oferece aritmética de ponto flutuante completo. Por exemplo:
fonte
Experimentar
:)
Veja a seção AVALIAÇÃO ARITMÉTICA de:
Ele suporta apenas números inteiros.
fonte