Ho uno scenario di seguito come:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Ho uno scenario di seguito come:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Risposte:
Esistono molti modi per eseguire questo ciclo.
Con ksh93
sintassi (supportato anche da zsh
e bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Per qualsiasi shell simile a POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Entrambi i loop dormono 10 secondi in ogni iterazione prima di testare nuovamente l'esistenza del file.
Dopo che il ciclo è terminato, dovrai verificare l'esistenza del file un'ultima volta per capire se il ciclo è uscito a causa dell'esecuzione di 10 volte o della comparsa del file.
Se lo desideri e se hai accesso a inotify-tools, puoi sostituire la sleep 10
chiamata con
inotifywait -q -t 10 -e create ./ >/dev/null
Ciò aspetterebbe che si verifichi un evento di creazione del file nella directory corrente, ma sarebbe scaduto dopo 10 secondi. In questo modo il tuo loop verrebbe chiuso non appena appariva il nome file dato (se appariva).
Il codice completo, con inotifywait
(sostituisci con sleep 10
se non lo desideri), potrebbe apparire come
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
come sostituto drop-in sleep
.
Se il conteggio non è una variabile è possibile utilizzare l'espansione del controvento:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Se il conteggio è una variabile è possibile utilizzare il seq
comando:
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!
sebbene test -e file && exit
sia più flessibile
exists1
o simile, stampa comunque una serie di errori se / quando non viene trovato un file corrispondente. (Inoltre si verificano errori in caso di più corrispondenze.) Qualsiasi altra shell che ho testato sembra dare errori in ogni caso ...
done 2<>/dev/null
. fa bash
quello scritto? ho pensato che fosse solo in un -i
contesto nterattivo. tuttavia, exists?
è un nome di riempimento quanto file
. ma sì, odio citare i reindirizzamenti - se le viti aumentano così tanto.
test -e
.