El siguiente fragmento de bash funciona muy bien cuando en realidad hay *.txt
Archivos en el directorio.
for txt in *.txt
do
echo "loading data from $txt"
done
Cuando no hay, lo literal *.txt
cae en el bucle como $ txt (no es bueno).
¿Cómo cambio este código para que cuando no haya *.txt
archivos, el do ... done
bloque es omitido?
if [ "*.txt" != '*.txt' ] ; then do loop here ; fi
[ "*.txt" != '*.txt' ]
siempre es falso: ambas cadenas están entre comillas, por lo que no se comprueba ninguna coincidencia. Si eliminas las comillas de una ... tiene otros problemas.files=$(echo *.txt)
y entonces:if [ "${files}" != '*.txt' ] ; then
.Respuestas:
Parece que Google tuvo la respuesta a esta.
Pon este encantamiento mágico antes de la
for
declaración:fuente
La opción nullglob (respuesta de @kfmfe04) es mejor si está utilizando bash (no es un shell de marca X), y no tiene que preocuparse por cambiar / romper cualquier otra cosa. De lo contrario, puedes usar esta opción (un poco más desordenada):
Esto omite silenciosamente los archivos que no existen (principalmente "* .txt" si no hubo coincidencias, pero posiblemente también los archivos que se eliminaron entre cuando
for
Generé la lista y cuando el bucle llegó a ellos ...)fuente
-e
invocación y posterior procesamiento aún ...-e
reduce la ventana de tiempo donde la eliminación es un problema.