
Digamos que temos "for loop" como segue:
#!/bin/bash
for i in $(cat test_file); do
echo $i
done
O conteúdo do arquivo de texto são nomes de pastas em uma pasta pai
Se o text_file contém 10.000 entradas (ou seja, variável i), como posso dizer ao "for loop" para dormir 10 segundos entre cada 10 "ecos". Em outras palavras, quando o loop for lê a variável i no text_file, como posso controlar o número de variáveis que o loop for pode executar a cada período específico de tempo? Então a saída é a seguinte:
Variable #1
Variable #2
Variable #3
.
.
.
.
sleep 10
Variable #11
Variable #12
Variable #13
.
. .
Responder1
Use o seguintefestaroteiro (dormir 10 segundos entre cada 10 "ecos"):
test.sh
é um nome de teste do 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
o contador cada vez que read -r line
retornar uma linha da entrada
if (( "$i" % 10 == 0))
- verifica se o número da linha atual i
é divisível por 10
(significa que o fluxo de execução atinge as próximas 10 linhas)
sleep 10
- pausa o script por 10 segundos
Responder2
xargs -L 10 sh -c 'printf "%s\n" "$@"; sleep 10' sh < test_file
Trabalhando
xargs
with-L
pegará 10 linhas de uma só vez e as passará para osh -c
comando. Lá o primeiro argumento é consumido como nome do programa, colocaremos um nome fictíciosh
. Então essas 10 linhas ficarão disponíveissh
como "$@" e poderemos fazer o que quisermos. Aqui nós apenas os imprimimos. Então nóssleep
por 10 segundos. Depois disso,xargs
passaremos as próximas 10 parcelas e este ciclo se repetirá até que acabe o número de mentiras em test_file.