Диапазоны массивов с пользовательским размером шага в оболочках Борна

Скажем, я хочу создать массив массивов целых чисел в оболочке, так что массив:

  • Запуск $START_VALUE
  • Заканчивается в $END_VALUE
  • Элементы $STEP_SIZE раздельно, начиная с $START_VALUE .

Для тех, кто знаком с Python, я действительно ищу конкурента range в оболочках Bourne, и особенно в Zsh.

Есть ли встроенные встроенные оболочки?


Примечание. Функция range Python поддерживает увеличение и уменьшение массивов диапазонов (т. $START_VALUE Где $START_VALUE больше или меньше $END_VALUE ).

Как и в bash, в zsh , это работает:

 printf '%s ' {2..23..3}; echo 

Поскольку это также работает:

 set -- {2..23..3} for i do echo "$i" done 

Поскольку это:

 set -- {2..23..3} for i; do echo "$i" done 

Поскольку это:

 for i in {0..20..2} do echo "$i" done 

Что работает в zsh, но не в bash, это диапазоны с переменными:

 a=2 b=23 c=3 set -- {$a..$b..$c} for i do echo $i done 

В bash и zsh вы можете использовать {START..STOP..INCREMENT}, и он работает так, как ожидается, когда START <STOP. Например,

  for i in {0..20..2} do echo $i done 

выдает 0, 2, 4, 6, …, 20. В bash вы также можете делать «назад» диапазоны, изменив его на {20..0 ..- 2}, который будет печатать 20, 18, 16,. .., 2, 0. Это, однако, не работает для zsh.

Метод, который работает как для bash, так и для zsh, заключается в использовании seq.

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

выводит 20, 18, 16, …, 0 (как в bash, так и в zsh). Формат здесь: FIRST, STEP, LAST (и STEP является необязательным, если он не указан, он становится 1).