जवाबों:
FILE=$(basename "${1/%.jpeg/.jpg}")
मेरे लिए काम किया।
परीक्षा:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
स्क्रिप्ट सामग्री:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
आप बश में विस्तार नहीं कर सकते हैं (न ही ksh, राख और zsh के अलावा अन्य गोले में)। यह केवल एक कॉस्मेटिक सीमा है, जैसा कि आप स्पष्ट करते हैं कि आप एक अस्थायी चर के लिए एक मध्यवर्ती अभिव्यक्ति प्रदान कर सकते हैं। यह वन-लाइनर्स के लिए थोड़ा कष्टप्रद है, लेकिन स्क्रिप्ट में यह पठनीयता के लिए यकीनन बेहतर है।
आप बाहरी उपयोगिता का उपयोग करने से बच सकते हैं basename
और इसके बजाय एक स्ट्रिंग हेरफेर निर्माण का उपयोग कर सकते हैं:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
यहां, ऐसा होता है कि आप अपनी स्क्रिप्ट को फिर से बाहर ले जाने के लिए कमांड की जगह ले सकते हैं । यह एक सामान्य घटना नहीं है, न ही आप एक निश्चित एक-लाइनर महसूस के अलावा कुछ भी हासिल नहीं करते हैं।
Zsh, बेहतर या बदतर के लिए, आपको घोंसले का विस्तार करने देता है:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
या आप इसके बजाय zsh के अंतर्निहित निर्माण का उपयोग कर सकते हैं basename
:
FILE=${${1:t}/%.jpeg/.jpg}
रेखा
FILE=$(basename "${1/%.jpeg/.jpg}")
के साथ छोटा किया जा सकता है और अधिक पोर्टेबल बनाया जा सकता है
FILE=$(basename "${1%.jpeg}.jpg")
sed
, तो निश्चित रूप से इस अनुमान की आवश्यकता होगी।