3 votos

División no funciona en bash

Me gustaría calcular alguna información de un archivo pero la división no funciona. Si cambio el / a un + o - , este cálculo es correcto. ¿Algunas ideas?

 #!/bin/sh
    FILE=/tmp/stats

    for EMPTY in $(cat $FILE |sed '1!d'); do (echo "Empty Servers $EMPTY | Empty-Servers=$EMPTY;"); done
    for SERVERS in $(cat $FILE |sed '2!d'); do (echo "Total Servers $SERVERS | Total=$SERVERS;"); done

    PERCENT=$(((EMPTY / SERVERS)*100))
    echo $PERCENT
 

6voto

Jacob Puntos 1861

La división que hace el trabajo, sólo que lo que el shell sólo trabaja con números enteros.

Creo que ya sea que usted desee invocar algo como bc, entonces usted puede hacer matemáticas sin embargo te gusta, o la adaptación a los efectos de tratar con números enteros.

Ejemplo de lo que podría hacer en su lugar: el cambio de su expresión en torno a que se multiplica EMPTY por 100 primero, y luego dividir por SERVERS. Es decir, $(((EMPTY * 100) / SERVERS)).
(Por supuesto, esto puede no ser tan precisa como le gustaría, pero que no cede 0 como resultado todo el tiempo).

1voto

Tom Puntos 98

Según este enlace , también necesita un $ antes de (EMPTY / SERVERS) . Así que su guión debe ser como sigue:

 #!/bin/sh
FILE=/tmp/stats

for EMPTY in $(cat $FILE |sed '1!d'); do (echo "Empty Servers $EMPTY | Empty-Servers=$EMPTY;"); done
for SERVERS in $(cat $FILE |sed '2!d'); do (echo "Total Servers $SERVERS | Total=$SERVERS;"); done

PERCENT=$(($((EMPTY / SERVERS))*100))
echo $PERCENT
 

Y de acuerdo con este enlace , el análisis de shell es útil solo para la división de enteros, por lo que es mejor usar bc .

-1voto

Kjellson Puntos 21

BC lo hace:

 for PERCENT in $(echo "scale=3; ($EMPTY/$SERVERS)*100" | bc); do (echo "Percent Empty=$PERCENT;;");done
 

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: