bash
не может обрабатывать нецелую арифметику. Это даст вам правильный результат, если все выражения являются целыми числами. Поэтому вам нужно избегать получения нецелого значения где-то в ваших вычислениях.
В вашем случае, когда вы оцениваете 1 / 5
и 2 / 5
т. Д., Он создает целочисленные нулевые значения в bash, соответствующие некоторым нецелочисленным значениям, и результаты оказываются соответственно равными нулю. Приоритет деления и умножения - это одно и то же, и одни и те же прецедентные операторы всегда выполняются слева направо, когда они помещаются в выражение.
Обходной путь - сначала выполнить умножение, а затем деление, чтобы bash никогда не обрабатывал нецелые значения. Исправленное выражение будет,
$ max=5; for e in $(seq 1 1 $max); do percent=$(( $e*100/$max )); echo "echo $e / $max : = $percent"; done
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100