Как управлять циклом?

Как управлять циклом?

Допустим, у нас есть следующий «цикл for»:

#!/bin/bash
for i in $(cat test_file); do 
echo $i
done

Содержимое текстового файла — это имена папок в родительской папке.

Если text_file содержит 10000 записей (т. е. переменную i), как я могу сказать "for loop" заснуть на 10 секунд между каждыми 10 "эхами". Другими словами, когда for loop считывает переменную i в text_file, как я могу контролировать количество переменных, которые for loop может запустить в каждый определенный период времени? Итак, вывод следующий:

   Variable #1
   Variable #2
   Variable #3
   .
   .
   .
   .
   sleep 10
    Variable #11
    Variable #12
    Variable #13
   .
   .       .

решение1

Используйте следующееБашсценарий (спать 10 секунд между каждыми 10 "эхо"):

test.shтестовое имя скрипта

#!/bin/bash
while ((++i)); read -r line
do
    echo "$line"
    if (( "$i" % 10 == 0)) 
    then
        sleep 10
    fi
done < $1

Применение:

bash test.sh test_file

while ((++i))- будет увеличивать iсчетчик каждый раз при read -r lineвозврате строки из ввода

if (( "$i" % 10 == 0))i- проверяет, делится ли номер текущей строки на 10(означает, что поток выполнения достигает следующих 10 строк)

sleep 10- приостанавливает выполнение скрипта на 10 секунд

решение2

xargs -L 10 sh -c 'printf "%s\n" "$@"; sleep 10' sh < test_file

Работающий

  • xargswith -Lвозьмет 10 строк за один раз и передаст их в sh -ccommand. Там первый аргумент используется как имя программы, мы поместим фиктивное имя sh. Затем эти 10 строк будут доступны shкак "$@" и мы можем делать все, что захотим. Здесь мы просто печатаем их. Затем мы sleepв течение 10 секунд. После этого xargsпередадим следующие 10 траншей, и этот цикл повторяется, пока не закончится ложь в test_file.

Связанный контент