Respostas:
FILE=$(basename "${1/%.jpeg/.jpg}")
trabalhou para mim.
teste:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
conteúdo do script:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Você não pode aninhar expansões no bash (nem no ksh, ash e outras conchas além do zsh). Essa é apenas uma limitação cosmética, pois, como você ilustra, pode atribuir uma expressão intermediária a uma variável temporária. É um pouco chato para as falas, mas nos scripts é indiscutivelmente melhor para facilitar a leitura.
Você pode evitar o uso do utilitário externo basename
e, em vez disso, usar uma construção de manipulação de string:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Aqui, você pode reescrever seu script para colocar a substituição de comando do lado de fora . Esse não é um fenômeno geral, e você não ganha nada além de um certo sentimento de uma linha.
O Zsh, para o bem ou para o mal, permite aninhar expansões:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Ou você pode usar a construção interna do zsh em vez de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
A linha
FILE=$(basename "${1/%.jpeg/.jpg}")
pode ser reduzido e tornado mais portátil com
FILE=$(basename "${1%.jpeg}.jpg")
sed
serão definitivamente necessárias, eu acho.