Conheço o comando seq
para gerar uma sequência de números inteiros, um por linha, mas gostaria de fazer duas perguntas:
É possível escrever os números da sequência na mesma linha?
É possível criar uma string composta da sequência de números separados por um espaço em branco?
echo $(seq 1 10)
Respostas:
Com
bash
,zsh
eksh93
, você pode usar o formulário de expansão de chaves {start..end..step} :fonte
O GNU
seq
usa a-s
opção separator ( ):fonte
echo $(seq 5)
funciona bem.Portátil para todos os shells e qualquer sistema que tenha seq (como esta pergunta está marcada)
Se o início for 1:
De outra forma:
Com bc:
Na festança
Nota:
Essa solução de eco funciona se o valor do IFS contiver uma nova linha, o que ocorre por padrão.
Por padrão, o IFS é definido como a sequência <space><tab> <newline> . E é redefinido para cada início limpo do shell. Mas, se você tem alguma preocupação de que isso possa ter mudado em alguns casos extremos, temos várias soluções.
No entanto, a redefinição do valor do IFS sob sh pode ser complexa. Leia os detalhes completos aqui .
Desativar IFS.
sempre funcionará. Desde que não exista um código abaixo (ou scripts filho) que precise de um conjunto IFS, como um script necessário
OldIFS="$IFS"
.Solução correta.
Usando um truque para sh:
fonte
IFS='<space><tab><newline>'
onde aqueles<space>
,<tab>
,<newline>
são os correspondentes caracteres literais.Usa isto:
fonte
...ou...
Ambos os comandos acima separarão os números inteiros por espaço em branco.
xargs
o padrão é imitar/bin/echo
e, portanto, cada número inteiro é separado por um único espaço. O padrão será o comprimento máximo da linha de comando de 128K. Você pode ajustar isso ...... imprime 1. Eu o valor
-s
aqui não é arbitrário - eu o obtive depois de tentar um valor mais alto (que aparentemente funcionou de qualquer maneira), mas depoisxargs
imprimi a mensagem útil:paste
é um dos dois (que eu saiba) utilitários sancionados pelo POSIX para manipular linhas de comprimento arbitrário:paste
o padrão é um delimitador de tabulação e, portanto, haverá uma tabulação entre cada número inteiro após o segundo comando. Você pode...... use a
-d
opção elimitador para alterar esse comportamento,fonte
seq 10 | xargs
funciona bem, mas por causa dos limites de linha de comando,seq 100000 | xargs
emite 5\n
linhas delimitadas (no meu sistema)paste and
cut` são os dois utilitários sancionados pelo POSIX para trabalhar com linhas de comprimento arbitrário. Dito isto,xargs | xargs
é uma opção. Ou entãoseq 100000|tr \\n \
$IFS
um número? E nobash
seu devagar, de qualquer maneira. Na sua resposta, você fala sobresh
- você nem precisa definir$IFS
nesse contexto - ele será repassado pelo ambiente se estiver definido lá. E não é mais curto do que oseq 100000|paste -s
que é melhor do que o desempenho 5: 1. Epaste
não vem com nenhuma dica.$IFS
- eu uso o tempo todo -, mas não o uso a menos que eu o defina e você também não deveria. Especialmente, você não deve recomendar a estranhos aleatórios que não conhecem nada melhor que eles deveriam fazê-lo. Não deixe ao acaso - é um programa de computador. É um erro se se comportar inesperadamente - por que permitir isso?