Pregunta:
¿Cómo hago correctamente un bucle for
en orden inverso?
for f in /var/logs/foo*.log; do
bar "$f"
done
Necesito una solución que no se rompa por los caracteres extravagantes en los nombres de los archivos.
Respuesta:
En bash o ksh, coloque los nombres de los archivos en una matriz e itere sobre esa matriz en orden inverso.
files=(/var/logs/foo*.log)
for ((i=${#files[@]}-1; i>=0; i--)); do
bar "${files[$i]}"
done
El código anterior también funciona en zsh si la opción ksh_arrays
está configurada (está en modo de emulación ksh). Hay un método más simple en zsh, que consiste en invertir el orden de las coincidencias mediante un calificador glob:
for f in /var/logs/foo*.log(On); do bar $f; done
POSIX no incluye matrices, por lo que si desea ser portátil, su única opción para almacenar directamente una matriz de cadenas son los parámetros posicionales.
set -- /var/logs/foo*.log
i=$#
while [ $i -gt 0 ]; do
eval "f=\${$i}"
bar "$f"
i=$((i-1))
done