Faixa de matrizes com tamanho de passo personalizado em shells Bourne

0

Digamos que eu queira criar um intervalo de inteiros em um shell, de modo que o array:

  • Inicia em $START_VALUE
  • Termina em $END_VALUE
  • Os elementos são $STEP_SIZE apart, começando em $START_VALUE .

Para qualquer pessoa familiarizada com o Python, estou efetivamente procurando a range contrapartida em conchas Bourne, e especificamente em Zsh.

Existe algum shell embutido que ajude aqui?

Observação: a função range do Python suporta matrizes de intervalos crescentes e decrescentes (ou seja, onde $START_VALUE é maior ou menor que $END_VALUE ).

    
por Amelio Vazquez-Reina 14.03.2016 / 14:34

2 respostas

1

Como no bash, no zsh , isso funciona:

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

Como isso também funciona:

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

Assim:

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

Assim:

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

O que funciona no zsh, mas não no bash, é o range com variáveis:

a=2 b=23 c=3
set   -- {$a..$b..$c}
for   i
do    echo $i
done
    
por 14.03.2016 / 17:37
1

No bash e zsh você pode usar {START..STOP..INCREMENT} e funciona como esperado quando START < PARE. Por exemplo,

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

imprime 0, 2, 4, 6, ..., 20. No bash você também pode fazer intervalos "para trás", alterando-o para {20..0 ..- 2}, que imprime 20, 18, 16, ..., 2, 0. Isso, no entanto, não funciona para zsh.

Um método que funciona tanto para o bash quanto para o zsh é usar seq.

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

imprime 20, 18, 16, ..., 0 (em bash e zsh). O formato aqui é FIRST, STEP, LAST (e o STEP é opcional, se deixado de fora, torna-se 1).

    
por 14.03.2016 / 14:43

Tags