Tengo el siguiente escenario como:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Tengo el siguiente escenario como:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Respuestas:
Hay muchas formas de hacer este ciclo.
Con ksh93
sintaxis (también compatible con zsh
y bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Para cualquier shell similar a POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Ambos bucles duermen 10 segundos en cada iteración antes de probar nuevamente la existencia del archivo.
Después de que el ciclo haya finalizado, tendrá que probar la existencia del archivo por última vez para determinar si el ciclo se cerró debido a que se ejecutó 10 veces o debido a la aparición del archivo.
Si lo desea, y si tiene acceso a las herramientas de inotify, puede reemplazar la sleep 10
llamada con
inotifywait -q -t 10 -e create ./ >/dev/null
Esto esperaría a que ocurra un evento de creación de archivo en el directorio actual, pero se agotaría el tiempo de espera después de 10 segundos. De esta manera, su bucle se cerrará tan pronto como aparezca el nombre de archivo dado (si apareciera).
El código completo, con inotifywait
(reemplace con sleep 10
si no quiere eso), puede verse como
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
como reemplazo directo sleep
.
Si el recuento no es una variable, puede usar la expansión de llaves:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Si el recuento es una variable, puede usar el 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!
aunque test -e file && exit
es más flexible
exists1
o similar , todavía imprime un montón de errores si / cuando no se encuentra un archivo coincidente. (También se produce un error si hay varias coincidencias.) Cualquier otro shell que probé parece dar errores en cualquier caso ...
done 2<>/dev/null
. hace bash
eso guionizado? Pensé que solo se -i
desvanecía en un contexto interactivo. aún así, exists?
es tanto como un nombre de relleno como file
. Pero sí, odio citando en redirecciones - si los tornillos de manera mucho más arriba.
test -e
.