Odpowiedzi:
FILE=$(basename "${1/%.jpeg/.jpg}")
pracował dla mnie.
test:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
zawartość skryptu:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Nie możesz zagnieżdżać rozszerzeń w bash (ani w ksh, ash i innych powłokach oprócz zsh). Jest to jedynie ograniczenie kosmetyczne, ponieważ jak zilustrujesz, możesz przypisać wyrażenie pośrednie do zmiennej tymczasowej. Jest to trochę denerwujące dla jedno-liniowych, ale w skryptach jest prawdopodobnie lepsze dla czytelności.
Można uniknąć używania zewnętrznego narzędzia basename
i zamiast tego użyć konstrukcji do manipulacji ciągiem:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Tutaj zdarza się, że możesz przepisać skrypt, aby umieścić podstawienie polecenia na zewnątrz . To nie jest ogólne zjawisko, ani nie zyskujesz nic innego niż pewne poczucie jednowarstwowości.
Zsh, na dobre lub na złe, pozwala zagnieżdżać rozszerzenia:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Lub możesz użyć wbudowanej konstrukcji zsh zamiast basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Linia
FILE=$(basename "${1/%.jpeg/.jpg}")
można go skrócić i uczynić bardziej przenośnym
FILE=$(basename "${1%.jpeg}.jpg")
sed
, na pewno będzie to potrzebne.