Jawaban:
FILE=$(basename "${1/%.jpeg/.jpg}")
bekerja untukku.
uji:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
isi skrip:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Anda tidak dapat membuat sarang ekspansi di bash (atau di ksh, ash, dan shell lain selain dari zsh). Ini hanya batasan kosmetik, karena seperti yang Anda ilustrasikan, Anda dapat menetapkan ekspresi perantara ke variabel sementara. Agak menyebalkan untuk one-liners, tetapi dalam skrip lebih baik dibaca.
Anda bisa menghindari menggunakan utilitas eksternal basename
dan menggunakan konstruksi manipulasi string sebagai gantinya:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Di sini, itu terjadi bahwa Anda dapat menulis ulang skrip Anda untuk menempatkan substitusi perintah di luar . Itu bukan fenomena umum, Anda juga tidak mendapatkan apa pun selain perasaan satu garis tertentu.
Zsh, baik atau buruk, membuat Anda melakukan ekspansi sarang:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Atau Anda dapat menggunakan konstruksi bawaan zsh alih-alih basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Garis
FILE=$(basename "${1/%.jpeg/.jpg}")
dapat dipersingkat dan dibuat lebih portabel dengan
FILE=$(basename "${1%.jpeg}.jpg")
sed
pasti akan diperlukan kurasa.