Existe uma ferramenta UNIX padrão para repetir um comando várias vezes?

11

Provavelmente, isso é fácil, mas existe uma maneira simples de escrever um comando uma vez no console e executá-lo nvezes, onde né especificado em tempo de execução? Algo assim:

repeat 100 echo hello

Existe esse comando (assuma a instalação típica do Linux)?

Ou eu escreveria para fazer algum tipo de loop no bash?

Jørn Schou-Rode
fonte

Respostas:

3

Ou eu escreveria para fazer algum tipo de loop no bash?

Sim, você gostaria:

for(( i = 0; i < 100; i++ )); do echo "hello"; done

ou, mais curto:

for((i=100;i--;)); do echo "hello"; done
Michael Borgwardt
fonte
e depois coloque essas coisas em uma função e pronto, você tem o seu comando: repeat () {for_stuff_here; faça "$ @"; done}
akira 22/03
3

Além dos métodos mais integrados, 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
phogg
fonte
2

Eu não encontrei uma ferramenta Linux "padrão" para fazer esse trabalho, mas normalmente preservo meus arquivos de ponto (.bashrc, .vimrc etc.) de instalação em instalação, portanto, o seguinte é bastante "padrão" se você o examinar em a perspectiva de preservar seus arquivos de ponto em novas instalações:

No final de suas .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/.bashrcou source /path/to/.bash_aliases, o que você escolher para modificar, em um shell existente.

É isso aí! Você deve poder usá-lo da seguinte maneira:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

etc.

Rovin Bhandari
fonte
legais. seria bom para colocar "local" em frente ao n = US $ 1, para evitar a poluição do namespace variável global
Don escotilha
1

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

seq 10|xargs -I INDEX echo "print this 10 times"
Pyrolistical
fonte
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 ( seqou jot) ou extensões de shell ( forexpansão de loop ou brace no estilo C ), ou seja, todos falham em seguir 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
jlliagre
fonte