Réponses:
FILE=$(basename "${1/%.jpeg/.jpg}")
travaillé pour moi.
tester:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
contenu du script:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Vous ne pouvez pas imbriquer d'extensions dans bash (ni dans ksh, ash et autres coquilles en dehors de zsh). Il ne s'agit que d'une limitation esthétique, car, comme vous l'illustrez, vous pouvez affecter une expression intermédiaire à une variable temporaire. C'est un peu ennuyeux pour les monolignes, mais dans les scripts, c'est sans doute meilleur pour la lisibilité.
Vous pouvez éviter d'utiliser l'utilitaire externe basename
et utiliser une construction de manipulation de chaîne à la place:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Ici, il arrive que vous puissiez réécrire votre script pour mettre la substitution de commandes à l'extérieur . Ce n'est pas un phénomène général, et vous ne gagnez rien d'autre qu'un certain sentiment de doublure.
Zsh, pour le meilleur ou pour le pire, vous permet d'imbriquer des extensions:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Ou vous pouvez utiliser la construction intégrée de zsh au lieu de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
La ligne
FILE=$(basename "${1/%.jpeg/.jpg}")
peut être raccourci et rendu plus portable avec
FILE=$(basename "${1%.jpeg}.jpg")
sed
elles seront définitivement nécessaires, je suppose.