Баш для цикла с диапазоном {# .. #}

17

{# .. #} генерирует последовательность чисел или символов, аналогично range () в Python. Если я выполню команду echo {1..5}в командной строке, у меня есть:

1 2 3 4 5

Вместо этого следующий скрипт bash не работает должным образом.

for i in {1..3};
do
    echo "Iteration $i"
done

напечатает:

Iteration {1..3}

Почему?
* Я мог бы использовать, seqно я прочитал это устарело ( http://www.cyberciti.biz/faq/bash-for-loop/ )

Shake0
источник
Эта ошибка возникает, если скрипт выполняется командой «sh» (попробуйте использовать «bash»).
Shake0

Ответы:

22

Я попробовал ваш код (скопировать вставить в терминал), и он дал результат, отличный от того, что вы опубликовали:

for i in {1..3};
do
    echo "Iteration $i"
done
#---OUTPUT BELOW---
Iteration 1
Iteration 2
Iteration 3

Я использую Linux Mint 12 Lisa (производная от Ubuntu) с версией bash 4.2.10 (1) -релиз

zipizap
источник
2
Вы правы! Я думал, что sh и bash - это одно и то же ..
Shake0
1
нет, bash и sh довольно разные ... bash более способный, чем sh, он был сделан на плечах sh :), хотя они оба имеют хорошую степень совместимости, у них также есть свои отличия
zipizap
обратите внимание, что вы можете создавать вложенные списки, например, для var в {{i..j}, {l..m}}; делать echo $ var; готово, если вам нужна неправильная последовательность, например 1 2 3 7 8 9
brown.2179
Обратите внимание, что в некоторых дистрибутивах /bin/shIS фактически указывает на bash, в Debian и Ubuntu обычно указывает на то, /bin/dashчто в основном POSIX-совместимо, но не поддерживает тот же синтаксис, что и Bash.
dragon788