2013-07-22 2 views
1

Интересно, если можно написать цикл «for i in {n..k}» с переменной.Можно ли использовать переменную in для синтаксиса в bash?

Например,

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. Я знаю, что есть много способов создать цикл, используя переменную, но я хотел спросить конкретно об этом синтаксисе.

+0

Причина, по которой она не работает, заключается в том, что bash выполняет расширения расширений * перед расширением переменной - http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions –

ответ

6

Невозможно использовать переменные в синтаксисе {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 
+1

+1 для 'seq' .. ... – hek2mgl

2

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

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

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

1

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

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

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