आपको लोअरकेस में चर का उपयोग करना चाहिए (यह सबसे अच्छा अभ्यास है)।
तो, मैं FILENAME और EXTENSION के बजाय फ़ाइल नाम और एक्सटेंशन का उपयोग करूंगा
जैसा कि आप कहते हैं कि "फ़ाइल नाम फ़ाइल से पढ़ा जाता है", मैं मानूंगा कि स्क्रिप्ट है:
read -r filename <file.txt
extension=World.txt
और यह कि आप एक अंडरस्कोर के साथ दोनों चर $ फ़ाइल नाम और $ एक्सटेंशन को संक्षिप्त करना चाहते हैं _
।
आपके द्वारा दिए गए उदाहरण (कोई भी दोहराव नहीं) यहां सही तरीके से काम करते हैं:
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
कुछ अन्य के रूप में:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
तो, आपकी समस्या यह नहीं है कि चर एक साथ कैसे चिपके हुए हैं, बल्कि चर की सामग्री के साथ। ऐसा सोचना उचित प्रतीत होता है:
read -r filename <file.txt
\r
अगर एक विंडोज़ फ़ाइल से पढ़ने के लिए एक पीछे चलने वाली गाड़ी वापसी पढ़ेगी ।
एक सरल समाधान (ksh, bash, zsh के लिए) को पढ़ने के चर से सभी नियंत्रण वर्णों को हटाना है:
filename=${filename//[[:cntrl:]]/}
यह एक मूल्य के साथ सिम्युलेटेड हो सकता है जिसमें गाड़ी वापसी है:
$ filename=$'Hello\r'
$ echo "starting<$filename>end"
>endting<Hello ### note the return to the start of line.
$ echo "starting<${filename//[[:cntrl:]]/}>end"
starting<Hello>end
या, का मान बदल रहा है filename
:
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
निष्कर्ष।
तो यह:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
name
भले ही अन्य vars नियंत्रण वर्णों के लिए सही मान प्राप्त करेंगे ।