
Nehmen wir an, wir haben eine „for-Schleife“ wie folgt:
#!/bin/bash
for i in $(cat test_file); do
echo $i
done
Der Inhalt der Textdatei sind die Namen der Ordner in einem übergeordneten Ordner
Wenn die Textdatei 10.000 Einträge enthält (also die Variable i), wie kann ich dann der „For-Schleife“ sagen, dass sie zwischen jeweils 10 „Echos“ 10 Sekunden pausieren soll? Mit anderen Worten: Wenn die For-Schleife die Variable i in der Textdatei liest, wie kann ich die Anzahl der Variablen steuern, die die For-Schleife in jedem bestimmten Zeitraum ausführen kann? Die Ausgabe lautet also wie folgt:
Variable #1
Variable #2
Variable #3
.
.
.
.
sleep 10
Variable #11
Variable #12
Variable #13
.
. .
Antwort1
Verwenden Sie die folgendenSchlagSkript (10 Sekunden zwischen jeweils 10 "Echos" schlafen):
test.sh
ist ein Testname des Skripts
#!/bin/bash
while ((++i)); read -r line
do
echo "$line"
if (( "$i" % 10 == 0))
then
sleep 10
fi
done < $1
Verwendung:
bash test.sh test_file
while ((++i))
- erhöht i
den Zähler jedes Mal, wenn read -r line
eine Zeile vom Eingang zurückgegeben wird
if (( "$i" % 10 == 0))
- prüft, ob die aktuelle Zeilennummer i
durch teilbar ist 10
(bedeutet, dass der Ausführungsfluss die nächsten 10 Zeilen erreicht)
sleep 10
- pausiert das Skript für 10 Sekunden
Antwort2
xargs -L 10 sh -c 'printf "%s\n" "$@"; sleep 10' sh < test_file
Arbeiten
xargs
Dabei-L
werden 10 Zeilen auf einmal genommen und ansh -c
den Befehl weitergegeben. Dort wird das erste Argument als Programmname verwendet, wir setzen einen Dummy-Namensh
. Dann stehen diese 10 Zeilensh
als „$@“ zur Verfügung und wir können damit machen, was wir wollen. Hier drucken wir sie einfach aus. Dannsleep
warten wir 10 Sekunden. Danachxargs
werden die nächsten 10 Zeilen weitergegeben und dieser Zyklus wiederholt sich, bis keine Zeilen mehr in der Testdatei vorhanden sind.