it-swarm.com.de

So wiederholen Sie die Schleife n-mal in Bash

Ich habe unten Szenario wie:

if [file exists]; then
   exit   
Elif
   recheck if file exist (max 10 times)
   if found exit else recheck again as per counter  
fi 
9
Rocky86

Es gibt viele Möglichkeiten, diese Schleife durchzuführen.

Mit der Syntax ksh93 (Wird auch von zsh und bash unterstützt):

for (( i=0; i<10; ++i)); do
    [ -e filename ] && break
    sleep 10
done

Für jede POSIX-ähnliche Shell:

n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
    n=$(( n + 1 ))
    sleep 10
done

Beide Schleifen schlafen in jeder Iteration 10 Sekunden, bevor die Existenz der Datei erneut getestet wird.

Nachdem die Schleife beendet wurde, müssen Sie ein letztes Mal prüfen, ob die Datei vorhanden ist, um herauszufinden, ob die Schleife aufgrund einer 10-maligen Ausführung oder aufgrund der angezeigten Datei beendet wurde.

Wenn Sie möchten und Zugriff auf inotify-tools haben, können Sie den Aufruf sleep 10 Durch ersetzen

inotifywait -q -t 10 -e create ./ >/dev/null

Dies würde warten, bis ein Dateierstellungsereignis im aktuellen Verzeichnis auftritt, würde jedoch nach 10 Sekunden eine Zeitüberschreitung verursachen. Auf diese Weise wird Ihre Schleife beendet, sobald der angegebene Dateiname angezeigt wird (falls er angezeigt wird).

Der vollständige Code mit inotifywait (ersetzen Sie ihn durch sleep 10, Wenn Sie das nicht möchten) sieht möglicherweise so aus

for (( i=0; i<10; ++i)); do
    [ -e filename ] && break
    inotifywait -q -t 10 -e create ./ >/dev/null
done

if [ -e filename ]; then
    echo 'file appeared!'
else
    echo 'file did not turn up in time'
fi
9
Kusalananda

Wenn die Anzahl keine Variable ist, können Sie die Klammererweiterung verwenden:

for i in {1..10}   # you can also use {0..9}
do
  whatever
done

Wenn die Anzahl eine Variable ist, können Sie den Befehl seq verwenden:

count=10
for i in $(seq $count)
do
  whatever
done
8
xenoid
n=0
until [ "$((n+=1))" -gt 10 ]
do    <exists? command exit
done
echo oh noes!

obwohl test -e file && exit ist flexibler

0
mikeserv