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
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?
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.
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}'
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
Use um for
loop
for ((i = 10; i <= 20; ++i)); do
printf '%d\n' "$i"
done
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 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