Yanıtlar:
FILE=$(basename "${1/%.jpeg/.jpg}")
benim için çalıştı.
Ölçek:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
script içeriği:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Bash (veya ksh, kül ve zsh dışında diğer kabuklarda) genişletmeleri yuvalayamazsınız. Bu sadece kozmetik bir sınırlamadır, çünkü gösterdiğiniz gibi geçici bir değişkene bir ara ifade atayabilirsiniz. Tek satırlar için biraz can sıkıcıdır, ancak komut dosyalarında okunabilirlik için tartışmasız daha iyidir.
Harici yardımcı programı basename
kullanmaktan kaçınabilir ve bunun yerine bir dize düzenleme yapısı kullanabilirsiniz:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Burada, komut değiştirme işlemini dışarıya koymak için komut dosyanızı yeniden yazabilirsiniz . Bu genel bir fenomen değil, belirli bir tek katmanlı duygudan başka bir şey kazanmıyorsunuz.
Zsh, daha iyisi ya da daha kötüsü, genişlemeleri iç içe geçirmenize izin veriyor:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Veya aşağıdakiler yerine zsh'ın yerleşik yapısını kullanabilirsiniz basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Çizgi
FILE=$(basename "${1/%.jpeg/.jpg}")
ile kısaltılabilir ve daha taşınabilir hale getirilebilir
FILE=$(basename "${1%.jpeg}.jpg")
sed
kullanılamazsa kesinlikle gerekli olacaktır.