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
bash
shell-script
Rocky86
fuente
fuente
Respuestas:
Hay muchas formas de hacer este ciclo.
Con
ksh93
sintaxis (también compatible conzsh
ybash
):Para cualquier shell similar a POSIX:
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 conEsto 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 consleep 10
si no quiere eso), puede verse comofuente
inotifywait
como reemplazo directosleep
.Si el recuento no es una variable, puede usar la expansión de llaves:
Si el recuento es una variable, puede usar el
seq
comando:fuente
$(seq $count)
aunque
test -e file && exit
es más flexiblefuente
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
. hacebash
eso guionizado? Pensé que solo se-i
desvanecía en un contexto interactivo. aún así,exists?
es tanto como un nombre de relleno comofile
. Pero sí, odio citando en redirecciones - si los tornillos de manera mucho más arriba.test -e
.