Existe uma ferramenta UNIX padrão para repetir um comando qualquer número de vezes?

11

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?

    
por Jørn Schou-Rode 22.03.2010 / 14:55

6 respostas

20

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

    
por 22.03.2010 / 15:42
3

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
    
por 22.03.2010 / 15:40
3

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
    
por 22.03.2010 / 19:30
2

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.

    
por 04.02.2014 / 14:36
1

A sintaxe do loop for é tola. Isso é mais curto:

seq 10|xargs -I INDEX echo "print this 10 times"
    
por 09.01.2014 / 00:49
0

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
    
por 12.01.2014 / 23:30