Sim, isso é possível. O Bash tem uma linguagem de script muito extensa. Neste caso:
for i in {1..100}; do echo 'hello'; done
Mais exemplos em loop: link
Referência completa do bash: link
Isso provavelmente é fácil, mas existe uma maneira simples de escrever um comando uma vez no console e executá-lo n
times, em que n
é especificado em tempo de execução? Algo parecido com isto:
repeat 100 echo hello
Existe tal comando (assume a instalação típica do Linux)?
Ou eu escreveria para fazer algum tipo de loop no bash?
Or would I write to do some kind of loop in bash?
Sim, você gostaria assim:
for(( i = 0; i < 100; i++ )); do echo "hello"; done
ou menor:
for((i=100;i--;)); do echo "hello"; done
Além de mais métodos incorporados, você pode usar um utilitário externo que gera uma sequência de números.
# gnu coreutils provides seq
for i in $(seq 1 100) ; do printf "hello\n" ; done
# freebsd (and probably other bsd) provides jot
for i in $(jot - 1 100) ; do printf "hello\n" ; done
Eu não encontrei uma ferramenta Linux "padrão" para fazer este trabalho, mas eu geralmente preservo meus arquivos de ponto (.bashrc, .vimrc etc.) da instalação para a instalação, então o seguinte é bem "padrão" se você olhar a partir da perspectiva de preservar seus arquivos de ponto em novas instalações:
No final de seu .bashrc ou .bash_aliases, coloque a seguinte definição:
repeat() {
n=$1 #gets the number of times the succeeding command needs to be executed
shift #now $@ has the command that needs to be executed
while [ $(( n -= 1 )) -ge 0 ] #loop n times;
do
"$@" #execute the command; you can also add error handling here or parallelize the commands
done
}
Salve o arquivo e reabra o shell ou execute source /path/to/.bashrc
ou source /path/to/.bash_aliases
, o que você escolher modificar, em um shell existente.
É isso! Você deve poder usá-lo da seguinte maneira:
repeat 100 echo hello
repeat 84 ~/scripts/potato.sh
etc.
A sintaxe do loop for é tola. Isso é mais curto:
seq 10|xargs -I INDEX echo "print this 10 times"
Atualmente, nenhuma das outras respostas está usando ferramentas padrão do Unix, que é o que a pergunta do título está pedindo.
Todos eles usam comandos não padrão ( seq
ou jot
) ou extensões de shell (estilo C for
loop ou expansão de contraventamento), ou seja, todos não seguem o padrão POSIX.
Aqui está uma maneira portátil que deve funcionar com qualquer shell e sistema operacional compatível com POSIX:
for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
Tags command-line unix