Дополнительно
Как выполнить итерацию по диапазону чисел, заданных переменными в Bash?
Как выполнить итерацию по диапазону чисел в Bash, когда диапазон задается переменной?
Я знаю, что могу это сделать (это называется "выражение последовательности" в [документации] Bash1):
for i in {1..5}; do echo $i; done
Что дает:
1
2
3
4
5
И все же, как я могу заменить любую из конечных точек диапазона переменной? Это не работает:
END=5
for i in {1..$END}; do echo $i; done
Что печатает:
{1..5}
1392
20
edit: Я предпочитаю
seq
другим методам, потому что я действительно могу его запомнить ;)В
след
способ является самым простым, но в bash есть встроенная арифметической оценки.Для ((выражение1;выражение2;выражение3));
построить работает так же, как для (выражение1;выражение2;выражение3)
в C-подобных языков, и, как и другие `((выражение)), потому что, Баш рассматривает их как арифметика.обсуждение
Используя
сл
хорошо, как Jiaaro предложил. Пакс Диабло предложил цикл в bash, чтобы избежать вызова подпроцесса, с дополнительным преимуществом, что больше памяти-фрэндли если $конец слишком большие. Zathrus замечена типичная ошибка в реализации цикла, а также намекнул, что, поскольку " я " является текстовой переменной, непрерывных преобразований к-и-FRO цифры выполняются с соответствующим замедлением.целочисленной арифметики
Это улучшенная версия цикла Баш:
Вот почему исходное выражение Не'т работу.
Из человек Баш:
Так, расширение скобок что-то рано как чисто текстовый макрос операции, прежде чем параметр расширения.
Снаряды высоко оптимизированный гибридов между макро-процессоров и более формальных языков программирования. Для того, чтобы оптимизировать типичные случаи использования, язык сделан более сложные и приняты некоторые ограничения.
Я хотел бы предложить придерживаться стандарта POSIX<суп>1</SUP и> характеристики. Это означает, используя для Я в в <список> У; У
, если список уже известен, в противном случае, использовать
Аили
след`, как в:<ч> <суп>1. Баш-это отличный снаряд, и я использую его в интерактивном режиме, но я не'т положить в bash-измы в моем сценарии. Скриптов может понадобиться быстрее оболочки, более защищенными, более встроенный-стиль один. Они, возможно, потребуется что-то устанавливается как /bin/sh, а затем есть все обычные про-стандарты рассуждения. Помните контузия, ака bashdoor? в </SUP и ГТ;
Пути в POSIX
Если вы заботитесь о переносимости, используйте пример из стандарта POSIX:
Выход:
Вещей, которые не в POSIX:
(( ))
без доллара, хотя это обычное расширение как упомянуто на себя в POSIX.[[
.[
достаточно здесь. См. также: https://stackoverflow.com/questions/13542832/bash-if-difference-between-square-brackets-and-double-square-bracketsслед
(Лицензия GNU Coreutils){начало..конец}
, и что не может работать с переменными, как сказано в руководство bash.: [в POSIX 7 2. Язык командной оболочки](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04) не содержит слово
да, и он не на гулянки ... в POSIX
4.3.42но значение это буквально это не означает, что
$((Х+1))
расширяется сх+1
- это не переменная.Еще один уровень косвенности:
Вы можете использовать
Если вам нужен префикс, чем вы могли бы это
Если вы'вновь на БСД / ОС Х можно использовать Йота вместо сл:
Это прекрасно работает в
bash
:Я'вэ комбинировать несколько идей здесь и измеренные характеристики.
Многабукаф. на вынос:
след
и{..}
очень быстроза
ивремя
петли медленно$( )
это медленноЭто не выводы. Вы должны посмотреть на код C за каждым из них, чтобы делать выводы. Это больше о том, как мы склонны использовать каждый из этих механизмов перебором кода. Большинство отдельных операций достаточно близко, чтобы быть той же скоростью, что он's не имеет значения в большинстве случаев. Но механизм, как на (( Я=1; я&л;=1000000; я++ )) - это множество операций, как вы можете наглядно увидеть. Мы также многие другие операции в петле, чем вы получаете из Для меня в $(сл 1 1000000)`. И что не может быть очевидным для вас, поэтому делаю тесты, как это ценно.
Демос
Я знаю, что этот вопрос о
Баш
, но - только на запись -ksh93
умнее и реализует его, как ожидалось:Если вы хотите, чтобы остаться как можно ближе к раскосу-выражения, опробовать функции
спектр
от Баш-трюки'диапазон.Баш
.Например, все следующие будут делать то же самое, как
эхо {1..10}
:Он пытается поддержать родной Баш синтаксис С и"подводных камней" и как это возможно: не только переменные поддерживаются, но часто нежелательное поведение недопустимых диапазонов поступает в виде строк (например, для меня в {1..а}; сделать эхо $я; сделано`) предотвращается также.
Остальные ответы будут работать в большинстве случаев, но все они имеют по крайней мере один из следующих недостатков:
след
- это двоичный файл, который должен быть установлен, чтобы использоваться, должны быть загружены на баш, и должен содержать программу вы ожидаете, для того, чтобы работать в этом случае. Вездесущий или нет, это's большое больше полагаться на себя, чем просто на языке bash.{а..з}
; фигурные скобки будет. Вопрос был про диапазоны numbers, хотя, так что это придирка.{1..10}
скобки-расширенный синтаксис, так что программы, использующие оба могут быть немного труднее читать.$конец
не является допустимым и quot диапазона;подставки для книг" и на другой стороне диапазона. Ifконец=а
, например, ошибки не произойдет и буквальное значение{1..а}
будет вторит. Это поведение по умолчанию bash, а так-это просто зачастую неожиданные.Отказ от ответственности: я автор связан код.
Это еще один способ:
Заменить
{}
с(( ))
:Это все хорошо, но сл якобы устарела и наиболее работать только с числовыми диапазонами.
Если вы заключите свой цикл в двойные кавычки, время начала и окончания переменные будут разыменованы, когда вы повторить строку, и вы можете отправить строку обратно в Bash для выполнения. `$я должен быть экранирован с \'s так это не оценивали перед отправкой в подоболочку.
Этот выход может быть присвоено переменной:
Единственный на "накладные расходы" и это должно генерировать должен быть второй экземпляр Баш, так что должны быть пригодны для интенсивной эксплуатации.
Если вы'снова делаешь скрипт и вы (как и я) имеют фетиш для конвейеризации, это хорошо:
сл 1 $конец | команды xargs -я {} Эхо {}
Есть много способов сделать это, однако я предпочитаю приведен ниже
Используя
след
Полная команда<БР>
сл первых не в прошлом
Пример:
Только с первой и последней:
Только с последним:
С помощью
{первый..последний..инкр}
Здесь первый и последний являются обязательными и не является обязательным
Используя только первый и последний
Используя инкр
Вы можете использовать это даже для символов, как показано ниже
Это работает в bash и Korn, также может идти от высших до низших чисел. Наверное, не самый быстрый или красивый, но работает достаточно хорошо. Тоже ручки негативы.
если вы Don'т хотите использовать '
сл
' или 'ивал
' илиЙота
или арифметика расширение формата например,для ((Я=1;я&л;=конца;я++))
, или другие циклы, например,А
, и вы Дон'т хочу 'е
' и с удовольствием 'Эхо
' только, тогда этот простой метод может соответствовать вашему бюджету:а=1; Б=5; д='я в {' долларов'..'$б'}; делать Эхо -Н " и я" у; сделано;' Эхо " Д"был$; | Баш
PS: мой Баш не'т '
сл
' команда в любом случае.Протестирован на Mac и OSX 10.6.8, Баш 3.2.48