Bourne shell 中具有自定义步长的范围数组

Bourne shell 中具有自定义步长的范围数组

假设我想在 shell 中创建一个整数范围数组,以便该数组:

  • 开始于$START_VALUE
  • 结束于$END_VALUE
  • 元素分开$STEP_SIZE,从 开始$START_VALUE

对于任何熟悉 Python 的人来说,我正在有效地寻找rangeBourne shell 中的对应项,特别是 Zsh 中的对应项。

是否有任何 shell 内置插件可以在这里提供帮助?


注意:Python 的range函数支持递增和递减范围数组(即,其中$START_VALUE大于或小于$END_VALUE)。

答案1

就像在 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

答案2

在 bash 和 zsh 中,您可以使用 {START..STOP..INCRMENT},当 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)。

相关内容