¿Existe una herramienta UNIX estándar para repetir un comando varias veces?

13

Probablemente esto sea muy fácil, pero ¿hay una manera simple de escribir un comando una vez en la consola y ejecutarlo en nocasiones, donde nse especifica en tiempo de ejecución? Algo como esto:

repeat 100 echo hello

¿Existe dicho comando (suponga una instalación típica de Linux)?

¿O escribiría para hacer algún tipo de bucle en bash?

Jørn Schou-Rode
fuente

Respuestas:

23

Si esto es posible. Bash tiene un lenguaje de script muy extenso. En este caso:

for i in {1..100}; do echo 'hello'; done

Más ejemplos de bucles: http://www.cyberciti.biz/faq/bash-for-loop/
Referencia completa de bash: http://www.gnu.org/software/bash/manual/bashref.html

alumbrado
fuente
¿Qué sucede cuando falla el comando?
maazza
Su manejo de errores lo detecta y determina qué hacer en su lugar.
Xyon
Traté for i in {1..100}; do python3 foo.py ; doney realmente quiero obtener el tiempo de ejecución (para ver qué tan rápido) time for i in {1..100}; do python3 foo.py ; doney luego CTRL-C no podrá detener el ciclo
polaridad
3

¿O escribiría para hacer algún tipo de bucle en bash?

Sí, te gustaría esto:

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

o, más corto:

for((i=100;i--;)); do echo "hello"; done
Michael Borgwardt
fuente
y luego pon esas cosas en una función y listo, tienes tu comando: repeat () {for_stuff_here; hacer "$ @"; hecho}
akira
3

Además de los métodos más integrados, puede usar una utilidad externa que genera una secuencia 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
fuente
3

La sintaxis del bucle for es tonta. Esto es más corto:

seq 10|xargs -I INDEX echo "print this 10 times"
Pirolista
fuente
2

No encontré una herramienta Linux "estándar" para hacer este trabajo, pero generalmente conservo mis archivos de puntos (.bashrc, .vimrc, etc.) de instalación a instalación, por lo que lo siguiente es bastante "estándar" si lo miras desde La perspectiva de preservar sus archivos de puntos en nuevas instalaciones:

Al final de su .bashrc o .bash_aliases, ponga la siguiente definición:

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
}

Guarde el archivo y vuelva a abrir el shell o ejecute source /path/to/.bashrco source /path/to/.bash_aliases, lo que elija modificar, en un shell existente.

¡Eso es! Debería poder usarlo de la siguiente manera:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

etc.

Rovin Bhandari
fuente
bonito. sería bueno poner "local" delante de n = $ 1, para evitar contaminar el espacio de nombres de la variable global
Don Hatch
0

Actualmente, ninguna de las otras respuestas está utilizando herramientas estándar de Unix, que es lo que pide la pregunta del título.

Todos usan comandos no estándar ( seqo jot) o extensiones de shell ( forbucle de estilo C o expansión de llaves), es decir, todos no se adhieren al estándar POSIX.

Aquí hay una forma portátil que debería funcionar con cualquier shell y sistema operativo compatible con POSIX:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
jlliagre
fuente