Создайте массив с последовательностью чисел в bash
Я хотел бы написать script, который создаст мне массив со следующими значениями:
{0.1 0.2 0.3 ... 2.5}
До сих пор я использовал script следующим образом:
plist=(0.1 0.2 0.3 0.4)
for i in ${plist[@]}; do
echo "submit a simulation with this parameter:"
echo "$i"
done
Но теперь мне нужно, чтобы список был намного длиннее (но все же с постоянными интервалами).
Есть ли способ создать такой массив в одной команде? Каков наиболее эффективный способ создания такого списка?
Ответы
Ответ 1
Используя seq
, вы можете сказать seq FIRST STEP LAST
. В вашем случае:
seq 0 0.1 2.5
Затем это вопрос сохранения этих значений в массиве:
vals=($(seq 0 0.1 2.5))
Затем вы можете проверить значения с помощью:
$ printf "%s\n" "${vals[@]}"
0,0
0,1
0,2
...
2,3
2,4
2,5
Да, моя локаль настроена на запятую вместо точек для десятичных знаков. Это можно изменить установкой LC_NUMERIC="en_US.UTF-8"
.
Кстати, brace expansion также позволяет установить приращение. Проблема в том, что она должна быть целым числом:
$ echo {0..15..3}
0 3 6 9 12 15
Ответ 2
Bash поддерживает стиль C Для циклов:
$ for ((i=1;i<5;i+=1)); do echo "0.${i}" ; done
0.1
0.2
0.3
0.4
Ответ 3
Дополняя основной ответ
В моем случае seq
был не лучшим выбором.
Для создания последовательности вы также можете использовать утилиту jot
. Однако эта команда имеет более сложный синтаксис.
# 1 2 3 4
jot - 1 4
# 3 evenly distributed numbers between 0 and 10
# 0 5 10
jot 3 0 10
# a b c ... z
jot -c - 97 122