Mam poniższy scenariusz:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Mam poniższy scenariusz:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Odpowiedzi:
Istnieje wiele sposobów wykonania tej pętli.
Ze ksh93
składnią (obsługiwaną również przez zsh
i bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Dla dowolnej powłoki podobnej do POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Obie pętle śpią po 10 sekund w każdej iteracji przed ponownym przetestowaniem istnienia pliku.
Po zakończeniu pętli będziesz musiał ostatni raz sprawdzić, czy plik istnieje, aby dowiedzieć się, czy pętla zakończyła się z powodu uruchomienia 10 razy, czy z powodu pojawienia się pliku.
Jeśli chcesz i masz dostęp do narzędzi inotify, możesz zastąpić sleep 10
połączenie
inotifywait -q -t 10 -e create ./ >/dev/null
To czekałoby na wystąpienie zdarzenia tworzenia pliku w bieżącym katalogu, ale upłynęło 10 minut. W ten sposób pętla kończy się, gdy tylko pojawi się nazwa pliku (jeśli się pojawi).
Może wyglądać pełny kod z inotifywait
(zamień na, sleep 10
jeśli tego nie chcesz)
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
jako zamiennik drop-in sleep
.
Jeśli liczba nie jest zmienną, możesz użyć rozwinięcia nawiasu:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Jeśli liczba jest zmienną, możesz użyć seq
polecenia:
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!
choć test -e file && exit
jest bardziej elastyczny
exists1
lub podobnego pliku , nadal wyświetla wiele błędów, jeśli / kiedy nie znaleziono pasującego pliku. (Również błędy jeśli istnieje wiele meczów.) Każda inna powłoka Testowałem wydaje się dawać błędy w każdym razie ...
done 2<>/dev/null
. czy bash
to jest skrypty? myślałem, że to działa tylko w -i
nieoperacyjnym kontekście. wciąż exists?
jest tak samo jak nazwa wypełniacza jak file
. ale tak, nienawidzę cytowania w przekierowaniach - jeśli to wszystko psuje.
test -e
.