Можно ли использовать переменную 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
.