Попытка удара arithemetic для сценария, но $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
Почему это?
bash
не может обработать арифметику нецелого числа. Это даст Вам корректный результат, пока все выражения являются целыми числами. Таким образом, необходимо постараться не получать значение нецелого числа где-нибудь в вычислении.
В Вашем случае, когда Вы оцениваете 1 / 5
, 2 / 5
и т.д., это создает целочисленную нулевую стоимость в передачах удара к некоторым значениям нецелого числа, и результаты выходят, чтобы быть нулем соответственно. Приоритет из разделения и умножения является тем же, и те же операторы прецедента всегда выполняются слева направо, как они размещаются в выражение.
Одна работа вокруг должна будет сделать умножение сначала и затем разделение, таким образом, удар никогда не должен обрабатывать значение нецелого числа. Исправленное выражение будет,
$ 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
Bash не делает очень хорошо в этом виде арифметики... Вот Ваша проблема:
$ echo $((1/5))
0
$ echo $((2/5))
0
$ echo $((4/5))
0
$ echo $((4/5))
0
, Если необходимо обработать значения нецелого числа, можно использовать bc
$ max=5; for e in $(seq 1 1 "$max"); do percent=$(bc <<< "scale=1 ; $e/$max*100") ; 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
(благодаря @Arronical для указания, как отформатировать вывод как целые числа)
В отличие от удара, awk предлагает полную арифметику с плавающей точкой. Например:
$ awk -v max=5 'BEGIN{for (e=1;e<=max;e++) print "echo " e " / " max " : = " 100*e/max}'
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100
Попробуйте
percent=$(( $e*100/$max ))
:)
ОЦЕНКА АРИФМЕТИКИ раздела See:
man bash
Это только поддерживает целое число.