Попытка арифметики bash для скрипта, но $e
не обновляется до конца. Выход говорит сам за себя.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: отображение 1..5 в процентах.
Выход :
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
Почему это?
command-line
bash
scripts
Cybex
источник
источник
Ответы:
bash
не может обрабатывать нецелую арифметику. Это даст вам правильный результат, если все выражения являются целыми числами. Поэтому вам нужно избегать получения нецелого значения где-то в ваших вычислениях.В вашем случае, когда вы оцениваете
1 / 5
и2 / 5
т. Д., Он создает целочисленные нулевые значения в bash, соответствующие некоторым нецелочисленным значениям, и результаты оказываются соответственно равными нулю. Приоритет деления и умножения - это одно и то же, и одни и те же прецедентные операторы всегда выполняются слева направо, когда они помещаются в выражение.Обходной путь - сначала выполнить умножение, а затем деление, чтобы bash никогда не обрабатывал нецелые значения. Исправленное выражение будет,
источник
1/5
не создает нецелое значение. Он создает целочисленное значение0
, так как результат целочисленного деления 1 на 5 равен 0. Дальнейшие операции успешно используют это значение0
. Это не то, что предполагал OP, но ни одна операция не создает нецелочисленное значение, и ни одна операция не завершается неудачно.Bash не очень хорошо справляется с такой арифметикой ... Вот ваша проблема:
Если вам нужно обрабатывать нецелые значения, вы можете использовать
bc
(спасибо @Arronical за указание, как форматировать вывод в виде целых чисел)
источник
.0
вывод, изменив$percent
свое эхо на${percent%.*}
:)В отличие от bash, awk предлагает полную арифметику с плавающей запятой. Например:
источник
Пытаться
:)
Смотрите раздел Арифметическая оценка:
Поддерживается только целое число.
источник