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
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
Antworten:
Es gibt viele Möglichkeiten, diese Schleife durchzuführen.
Mit ksh93
Syntax (auch unterstützt von zsh
und bash
):
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 zehnmaligen Ausführung oder aufgrund der angezeigten Datei beendet wurde.
Wenn Sie möchten und Zugriff auf inotify-tools haben, können Sie den sleep 10
Anruf 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 aufweisen. Auf diese Weise wird Ihre Schleife beendet, sobald der angegebene Dateiname angezeigt wird (falls er angezeigt wird).
Der vollständige Code mit inotifywait
(ersetzen 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
inotifywait
als Ersatz für sleep
.
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 folgenden seq
Befehl verwenden:
count=10
for i in $(seq $count)
do
whatever
done
$(seq $count)
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
obwohl test -e file && exit
ist flexibler
exists1
, werden immer noch eine Reihe von Fehlern ausgegeben, wenn keine passende Datei gefunden wird. (Auch es gibt Fehler, wenn es mehrere Übereinstimmungen gibt.) Jede andere Shell, die ich getestet habe, scheint auf jeden Fall Fehler zu geben ...
done 2<>/dev/null
. Ist bash
das ein Skript? Ich dachte, dass es das nur in einem -i
nteraktiven Kontext bewirkt. Trotzdem exists?
ist es so viel wie ein Füllername wie file
. aber ja, ich hasse es, in Weiterleitungen zu zitieren - wenn es so viel vermasselt.
test -e
.