Existe um programa unix padrão que retorna um intervalo de números

22

Estou aprendendo scripts de shell a partir de um livro desatualizado, e parece-me que seria realmente útil ter um programa que apenas retorna uma cadeia de números delimitados por espaços como

$ range 10 20
10 11 12 13 14 15 16 17 18 19 20

Então, se você está fazendo um script de shell, você pode ter

for i in 'range 10 20'; do some stuff with numbers in that range;done

existe tal coisa, ou preciso escrever eu mesmo?

    
por MYV 28.05.2013 / 08:46

7 respostas

79

seq faz parte do coreutils.

for i in $( seq 1 2 11 ) ; do echo $i ; done

Saída:

1
3
5
7
9
11

Se você fornecer apenas 2 argumentos para seq , o incremento será 1:

$ seq 4 9
4
5
6
7
8
9
    
por 28.05.2013 / 09:14
33

Seria a Bash suficiente?

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

Você pode fazer muitas coisas com a expansão de chaves . O Bash 4 também suporta intervalos preenchidos, por ex. {01..20} .

Note que o Bash não é considerado portátil, e não um utilitário padrão do Unix. Embora você possa seguramente assumir que ele está instalado na maioria dos Linuxes modernos, não use isso em um script que você planeja executar em todos os tipos de máquinas semelhantes ao Unix.

    
por 28.05.2013 / 09:03
9

Se você quiser algo estritamente portátil (isto é, que não se baseie em extensões bash específicas ou comandos não especificados pelo POSIX)

awk 'BEGIN {for(i=10;i<=20;i++) printf "%d ",i; print}'
    
por 28.05.2013 / 09:32
6

Antes de 10.7 não havia seq no Mac OS X, mas jot , devido à herança da BSD.

jot -- print sequential or random data

...

HISTORY
    The jot utility first appeared in 4.2BSD

Exemplo:

$ jot - 1 3
1
2
3
    
por 28.05.2013 / 16:17
2

Use um for loop

for ((i = 10; i <= 20; ++i)); do
    printf '%d\n' "$i"
done
    
por 28.05.2013 / 11:06
2

Você pode usar seq ou, se não tiver, você mesmo pode escrever:

#!/bin/bash
[ $# -ge 1 ] || { echo "Usage: seq Number [ Number ]" 1>&2 ; exit 1; }
[ $# -eq 1 ] && { [ $1 -gt 1 ] && ./seq $(($1 - 1)) ; echo $1 ; }
[ $# -eq 2 ] && { [ $(($2 - $1)) -gt 0 ] && ./seq $1 $(($2 - 1)) ; echo $2 ; }

Uso:

$ ./seq 3
1
2
3

Ou:

$ ./seq 3 7
3
4
5
6
7
    
por 31.05.2013 / 00:23
1

Por uma questão de completude aqui, algo que funcionará com algumas variantes mais antigas do Unix (contanto que tenham o perl instalado). Não é realmente elegante.

for I in $(perl -e 'print join("\n", 1..10)'); do something with $I; done
    
por 28.05.2013 / 19:25

Tags