bash – ¿Cómo invierto un bucle for?

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

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım