Я хотел бы вычислить некоторую информацию из файла, но разделение не работает. Если я изменю /
к +
или -
-А этот расчет верный. Любые идеи?
#!/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
Деление действительно работает, только то, что оболочка имеет дело только с целыми числами.
Я думаю, вы либо захотите вызвать что-то вроде bc
, то вы можете заниматься математикой, как вам нравится, или адаптироваться к последствиям работы с целыми числами.
Пример того, что вы могли бы сделать вместо этого: измените свое выражение так, чтобы вы умножали EMPTY
по 100
сначала, затем разделите на SERVERS
. Т.е., $(((EMPTY * 100) / SERVERS))
.
(Конечно, это может быть не так точно, как хотелось бы, но оно не всегда дает 0 в качестве результата.)
Согласно этому ссылка на сайт, Ты нуждаешься в $
перед (EMPTY / SERVERS)
слишком. Итак, ваш сценарий должен быть таким, как показано ниже:
#!/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
И согласно этому ссылка на сайт, синтаксический анализ оболочки полезен только для целочисленного деления, поэтому лучше использовать bc
.
BC делает это:
for PERCENT in $(echo "scale=3; ($EMPTY/$SERVERS)*100" | bc); do (echo "Percent Empty=$PERCENT;;");done