Estou tentando executar duas sequências no mesmo loop no meu shell, como abaixo:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
alguma idéia de como eu posso conseguir isso?
command-line
bash
sh
HISI
fonte
fonte
Respostas:
Você só precisa de expansão para isso
Podemos passar uma lista para
for
( ).for i in x y z; do stuff "$i"; done
Então, aqui, os aparelhos
{
}
recebem o shell para expandir suas seqüências em uma lista. Você só precisa colocar um espaço entre eles, pois o shell divide listas de argumentos sobre eles.fonte
echo
os númerostouch
arquivos, eles podem simplesmente fazertouch {1..15}.txt {20..25}.txt
, sem loop necessário aqui. Mas é claro que se houver várias ações no mesmo número - OK, isso poderia usar um loop.Como alternativa, podemos usar
seq
( imprimir uma sequência de números ), eis dois exemplos equivalentes:Se for um script, para tarefas repetitivas, você pode usar as funções:
fonte
A resposta de Zanna e a de pa4080 são boas e eu provavelmente iria com uma delas na maioria das circunstâncias. Talvez não seja preciso dizer, mas por uma questão de integridade, eu direi assim mesmo: você pode carregar cada valor em uma matriz e, em seguida, percorrer a matriz. Por exemplo:
fonte
Loop sem loop
A resposta de Zanna é absolutamente correta e adequada para o bash, mas podemos melhorar isso ainda mais sem utilizar um loop.
O comportamento de
printf
é tal que, se o número deARGUMENTS
for maior do que o formato controla'FORMAT STRING'
, eleprintf
dividirá tudoARGUMENTS
em partes iguais e continuará ajustando-as à cadeia de caracteres de formato repetidas vezes, até ficar fora daARGUMENTS
lista.Se estamos lutando para a portabilidade, podemos utilizar
printf "%d\n" $(seq 1 15) $(seq 20 25)
em vezVamos levar isso adiante e mais divertido. Digamos que queremos executar uma ação em vez de apenas imprimir números. Para criar arquivos a partir dessa sequência de números, poderíamos criar facilmente
touch {1..15}.txt {20..25}.txt
. E se queremos que várias coisas ocorram? Também poderíamos fazer algo assim:Ou se queremos torná-lo à moda antiga:
Alternativa portátil, mas detalhada
Se queremos criar uma solução de script que funcione com shells que não possuem expansão entre chaves (que é o que se
{1..15} {20..25}
baseia), podemos escrever um loop while simples:Claro que essa solução é mais detalhada, algumas coisas podem ser encurtadas, mas funciona. Testado com
ksh
,dash
,mksh
e, é clarobash
.Loop em estilo C do Bash
Mas se quisermos fazer um loop específico do bash (por qualquer motivo, talvez não apenas imprimindo, mas também fazendo algo com esses números), também podemos fazer isso (basicamente a versão em loop C da solução portátil):
Ou em um formato mais legível:
Comparação de desempenho de diferentes abordagens de loop
Alternativa sem casca
Só porque nós podemos aqui solução Python
Ou com um pouco de casca:
fonte
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
você nem precisa de$()
lá, apenastouch {1..15}.txt {20..25}.txt
:) Mas é claro que poderíamos usarprintf "%d\n
{1..15} {20..25} `comxargs
se quiséssemos fazer mais do que apenastouch
arquivos. Há muitas maneiras de fazer as coisas e isso torna os scripts muito divertidos!