Я хочу, например, разделить все целые числа от 1 до 5 на 8 и поместить их в массив. Я думал о чем-то похожем на код ниже, но я уверен, что это неправильно и грязно:
COUNTER=0
until [ $COUNTER -lt 8 ]; do
${steps[$COUNTER]}=1+(5-1)/8*$COUNTER
let COUNTER+=1
done
Есть ли способ сделать это чисто, если мой код верен вообще?
bash
может только сделать целочисленную арифметику. Используйте bc
для плаваний:
from=1
to=5
steps=8
for c in $(seq 0 $steps) ; do
ar[c]=$(echo $(bc -l <<< "$from + ($to - $from) / $steps * $c"))
done
echo "${ar[@]}"
Эти seq
команда может увеличить плаванием:
declare -a steps=($(seq 1 .5 5))
Вы можете получить приращение с echo 'scale=1;(5-1)/8'|bc
Да, но так как удар не делает арифметики с плавающей точкой, необходимо будет использовать другой инструмент и сохранить его вывод в массиве удара. Например:
$ perl -le 'print $_/8 for 1..5'
0.125
0.25
0.375
0.5
0.625
Сохраните в массиве с:
array=( $(perl -le 'print $_/8 for 1..5') )