
Digamos que tenemos "bucle for" de la siguiente manera:
#!/bin/bash
for i in $(cat test_file); do
echo $i
done
El contenido del archivo de texto son los nombres de las carpetas en una carpeta principal.
Si el archivo de texto contiene 10000 entradas (es decir, la variable i), ¿cómo puedo decirle al "bucle for" que duerma 10 segundos entre cada 10 "ecos"? En otras palabras, cuando el bucle for lee la variable i en el archivo de texto, ¿cómo puedo controlar la cantidad de variables que el bucle for puede ejecutar en cada período de tiempo específico? Entonces el resultado es el siguiente:
Variable #1
Variable #2
Variable #3
.
.
.
.
sleep 10
Variable #11
Variable #12
Variable #13
.
. .
Respuesta1
Utilice lo siguienteintentoguion (dormir 10 segundos entre cada 10 "ecos"):
test.sh
es un nombre de prueba del script
#!/bin/bash
while ((++i)); read -r line
do
echo "$line"
if (( "$i" % 10 == 0))
then
sleep 10
fi
done < $1
Uso:
bash test.sh test_file
while ((++i))
- incrementará i
el contador cada vez que read -r line
devuelva una línea de la entrada
if (( "$i" % 10 == 0))
- comprueba si el número de línea actual i
es divisible por 10
(significa que el flujo de ejecución llega a las siguientes 10 líneas)
sleep 10
- pausa el guión durante 10 segundos
Respuesta2
xargs -L 10 sh -c 'printf "%s\n" "$@"; sleep 10' sh < test_file
Laboral
xargs
with-L
tomará 10 líneas de una vez y las pasará alsh -c
comando. Allí se consume el primer argumento como nombre del programa, colocaremos un nombre ficticiosh
. Entonces estas 10 líneas estarán disponiblessh
como "$@" y podremos hacer lo que queramos. Aquí simplemente los imprimimos. Luego lo hacemossleep
durante 10 segundos. Después de eso,xargs
pasará a los siguientes 10 tramos y este ciclo se repetirá hasta que se acaben las mentiras en test_file.