¿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?

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


¿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

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

3

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

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.