Respuestas:
FILE=$(basename "${1/%.jpeg/.jpg}")
trabajó para mi.
prueba:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
contenido del guión:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
No puede anidar expansiones en bash (ni en ksh, ash y otras conchas aparte de zsh). Esto es solo una limitación cosmética, ya que, como ilustra, puede asignar una expresión intermedia a una variable temporal. Es un poco molesto para las frases sencillas, pero en los scripts es posiblemente mejor para la legibilidad.
Podría evitar usar la utilidad externa basename
y usar una construcción de manipulación de cadenas en su lugar:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Aquí, sucede que puede reescribir su script para colocar la sustitución del comando en el exterior . Ese no es un fenómeno general, ni obtienes nada más que un cierto sentimiento de una línea.
Zsh, para bien o para mal, te permite anidar expansiones:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
O podría usar la construcción incorporada de zsh en lugar de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
La línea
FILE=$(basename "${1/%.jpeg/.jpg}")
se puede acortar y hacer más portátil con
FILE=$(basename "${1%.jpeg}.jpg")
sed
, definitivamente será necesario, supongo.