Можно ли использовать переменную in для синтаксиса в bash?

Интересно, если можно написать цикл "for i in {n..k}" с переменной.

Например:

for i in {1..5}; do
    echo $i
done

Выводит

1
2
3
4
5

С другой стороны

var=5
for i in {1..$var}; do
    echo $i
done

печатает

{1..5}

Как сделать второй код таким же, как первый?

p.s. Я знаю, что есть много способов создать цикл, используя переменную, но я хотел спросить конкретно об этом синтаксисе.

Ответ 1

Невозможно использовать переменные в синтаксисе {N..M}. Вместо этого вы можете использовать seq:

$ var=5
$ for i in $(seq 1 $var) ; do echo "$i"; done
1
2
3
4
5

Или...

$ start=3
$ end=8
$ for i in $(seq $start $end) ; do echo $i; done
3
4
5
6
7
8

Ответ 2

В то время как seq в порядке, это может вызвать проблемы, если значение $var очень велико, так как должен быть сгенерирован весь список значений, что может вызвать проблемы, если результирующая командная строка слишком длинная. bash также имеет цикл цикла C, который явно не генерирует список:

for ((i=1; i<=$var; i++)); do
    echo "$i"
done

(Это относится и к постоянным последовательностям, так как {1..10000000} также генерирует очень большой список, который может переполнять командную строку.)

Ответ 3

Вы можете использовать eval для этого:

$ num=5
$ for i in $(eval echo {1..$num}); do echo $i; done
1
2
3
4
5

Прежде чем использовать, прочитайте eval.