Wie steuert man eine For-Schleife?

Wie steuert man eine For-Schleife?

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.shist 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 iden Zähler jedes Mal, wenn read -r lineeine Zeile vom Eingang zurückgegeben wird

if (( "$i" % 10 == 0))- prüft, ob die aktuelle Zeilennummer idurch 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

  • xargsDabei -Lwerden 10 Zeilen auf einmal genommen und an sh -cden Befehl weitergegeben. Dort wird das erste Argument als Programmname verwendet, wir setzen einen Dummy-Namen sh. Dann stehen diese 10 Zeilen shals „$@“ zur Verfügung und wir können damit machen, was wir wollen. Hier drucken wir sie einfach aus. Dann sleepwarten wir 10 Sekunden. Danach xargswerden die nächsten 10 Zeilen weitergegeben und dieser Zyklus wiederholt sich, bis keine Zeilen mehr in der Testdatei vorhanden sind.

verwandte Informationen