Consulta sobre script BASH

Estoy haciendo unos scripts para ir cogiendo un poco de soltura programando con BASH y me encuentro con una duda en los if.

La situación es que el script recorre todas las carpetas con fotos a partir del directorio que contiene el script y de cada foto que encuentra genera una miniatura y una imagen a 800x640. Todas las imágenes son jpg pero algunas tienen la extensión en mayúsculas, así que para solucionar esto en mi script hago:

      archivos=*.jpg
      echo archivos contiene ${archivos}
      if [ "${archivos}" = "*.jpg" ]; then
         archivos=*.JPG
      fi
      echo archivos contiene ${archivos}


Si un directorio no tiene ninguna imagen con extensión .jpg, ${archivos} se queda con el valor *.jpg (sin expandirse a nada) y puedo decirle entonces que coja las imágenes con extensión .JPG , por esta parte funciona correctamente.

El problema me surge cuando existen archivos .jpg en el directorio. En este caso ${archivos} pasa a ser varios archivos distintos, sin embargo me da la evaluación como verdadera, es decir, pasa justo lo contrario de lo que esperaba:

archivos contiene crnvl0201.jpg crnvl0202.jpg crnvl0203.jpg
archivos contiene *.JPG

¿Por qué hace mal "crnvl0201.jpg crnvl0202.jpg crnvl0203.jpg" = "*.jpg"

¿Alguien puede indicarme qué estoy haciendo mal? ein? A ver si podeis aclararme este problema.

Un saludo.
Respondiendo estrictamente a tu pregunta:

Si haces a=*.jpg, a vale *.jpg:

Por ejemplo:
$ ls *.jpg
tia_macizorra.jpg
tia_macizorra2.jpg
$ fotos=*.jpg
$ echo "$fotos"
*.jpg


Ves, no se expande. Del mismo modo que no se expande si hago directamente:

$ echo "*.jpg"
*.jpg


Si observas tu script verás que haces la comparación [ "$archivos" = "*.jpg" ] y, eso. evidentemente, es siempre cierto. Sobran las comillas de $archivos.

De todos modos, el script (no te lo tomes a mal), no tiene ni pies ni cabeza: presupones que o todas las extensiones son .jpg o todas son .JPG. ¿No es bastante probable que pueda haberlas mezcladas?

Yo haría simplemente:

archivos=*.[Jj][pP][gG]
echo $archivos


Y aún así estoy presuponiendo que no habrá ninguna extensión jpeg.
Gracias por la porción de código auxiliar. Como bien dices eso tiene mucho más sentido, pero no había pensado en resolverlo así. Estoy muy verde [burla2].

El usar comillas es porque algunos nombres de carpetas e imágenes contienen espacios, así que quería que se tratasen correctamente.
Por otra parte, también lo ponía en ${archivos}
if [ "${archivos}" = "*.jpg" ]; then

porque si no lo hacía el if me da error de demasiados parámetros...

Por otro lado, las imagenes tienen todas extensión .jpg o .JPG, no están mezcladas (lo tengo comprobado [666]). En el caso de las últimas todos los nombres así como la extensión están en mayúsculas porque en su día las grabé en un cd sin darle las opciones de permitir caracteres en minúsculas... [+risas]

Como he dicho estoy empezando a hacer scripts en BASH y realmente todas estas complicaciones me vienen bien para aprender [burla2] de forma que todas las críticas y sugerencias que hagais al script serán bien recibidas y agradecidas.

Cuando lo tenga completo pego el código por si alguien tiene curiosidad :). Saludos y gracias de nuevo.
2 respuestas