Як створити діапазон із кроком n у bash? (генерувати послідовність чисел із кроком)


143

Шлях до перебору діапазону в bash є

for i in {0..10}; do echo $i; done

Який би був синтаксис ітерації над послідовністю з кроком? Скажіть, я хотів би отримати лише парне число у наведеному вище прикладі.


Парні числа, помножте i на 2.: P
Джої Роберт,

примноження досить потворне, я повинен сказати
SilentGhost

2
@Omnifarious Я не був би таким впевненим. Наприклад, ОС X поставляється з 3.2. Я б сказав, що цикл у стилі С повинен бути прийнятим.
Елі Корвіго

Відповіді:


195

Я б зробив

for i in `seq 0 2 10`; do echo $i; done

(хоча звичайно seq 0 2 10 буде виробляти той же вихід самостійно).

Зверніть увагу, що seqдозволяє числа з плаваючою комою (наприклад, seq .5 .25 3.5), але розширення дужки bash дозволяє лише цілі числа.


4
Я загрожу здогадкою про те, що скоромовка була пов’язана з тим, що ваша відповідь була загальною для "ш", а не специфічною для "баш". Чистий підхід Баша {begin end step} працює трохи краще. Старіший метод "seq" зручний у старих або менших системах пам'яті, таких як busbox. Я відповів як на вашу, так і на відповідь Тебонсая. :)
Скотт Прив

6
Віддайте перевагу $ (...) для зворотних цитат. Зворотні котирування не гніздяться гучно.
всезнайко

seq 1000000 1000010 плаває тільки, насправді - немає способу змусити це робити цілі числа! Підтяжка розширення працює.
hmijail сумує у відставці

112

Розширення дужок Bash 4 має ступінчасту функцію:

for {0..10..2}; do
  ..
done

Незалежно від того, якщо Bash 2/3 (стиль C для циклу, див. Відповіді вище) або Bash 4, я вважаю за краще будь-що над командою 'seq'.


1
і btw, чи знаєте ви, чи bash4 за замовчуванням в будь-якій великій ОС?
SilentGhost

3
Bash4 досі не є мейнстрімом, ні. Чому б не послідовно? Ну, скажімо, це словами бота на IRC-каналі #bash: "seq (1) - це нестандартна зовнішня команда, яка використовується для підрахунку до 10 у дурних хаутах Linux".
TheBonsai

наскільки я розумію, що послідовність є частиною основних елементів. що в цьому нестандартного? аргументи? спасибі за вашу допомогу.
SilentGhost

4
Ці аргументи можуть не враховувати вас: * є достатня кількість систем без GNU coreutils (але встановлено Bash) * ви створюєте непотрібний зовнішній процес * ви покладаєтесь на ідею, що всі «seq» роблять те, що робить ваш «seq» * це не стандартизовано ISO
TheBonsai

3
@becko Якщо крок зберігається у змінній i, ви не можете цього зробити for {0..10..${i}}.. він не працює.
Nehal J Wani

72

Чистий Bash, без зайвого процесу:

for (( COUNTER=0; COUNTER<=10; COUNTER+=2 )); do
    echo $COUNTER
done

10
+1 Оскільки крок також можна замінити змінною.
Nehal J Wani

1
Я думаю, що це дійсно те, що, швидше за все, хочуть люди - простий спосіб зробити цикл із заданим значенням кроку. Це звучить простіше, ніж усі відповіді на основі послідовності, і є чіткішим синтаксисом, ніж розширення дужки Bash4, і схоже, що це дозволило б отримати змінні (я цього не пробував, але синтаксис це напевно пропонує).
tobylaroni

Працює в Bash 3, на відміну від відповіді @ TheBonsai.
серцеrer

Він навіть вирішує змінну ((i = "$ first"; i <= "$ last"; i + = "$ step")). Не так просто з фігурними дужками та слідами.
Blaa_Thor

20
#!/bin/bash
for i in $(seq 1 2 10)
do
   echo "skip by 2 value $i"
done

seq - команда Linux. Це не буде доступно для Mac OS X або FreeBSD.
Дерексон

5
Послідовність FWIW доступна в моєму стандартному ОС X Mavericks 10.9.1
Марк

Я спробував інший sintax, але це єдиний, що працює для мого на маленькому CentOS. @z - врятував мій день: D
m3nda

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.