Назад | Перейти на главную страницу

Подразделение не работает в bash

Я хотел бы вычислить некоторую информацию из файла, но разделение не работает. Если я изменю / к + или --А этот расчет верный. Любые идеи?

#!/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