
Допустим, у нас есть следующий «цикл 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
Работающий
xargs
with-L
возьмет 10 строк за один раз и передаст их вsh -c
command. Там первый аргумент используется как имя программы, мы поместим фиктивное имяsh
. Затем эти 10 строк будут доступныsh
как "$@" и мы можем делать все, что захотим. Здесь мы просто печатаем их. Затем мыsleep
в течение 10 секунд. После этогоxargs
передадим следующие 10 траншей, и этот цикл повторяется, пока не закончится ложь в test_file.