আপনার ছোট হাতের অক্ষরে পরিবর্তনগুলি ব্যবহার করা উচিত (এটি সর্বোত্তম অনুশীলন)।
সুতরাং, আমি ফাইলের নাম এবং এক্সটেনশনটি FILENAME এবং এক্সটেনশনের পরিবর্তে ব্যবহার করব
আপনি যেমনটি বলেন যে "ফাইলের নাম ফাইল থেকে পড়া হয়", আমি ধরে নেব স্ক্রিপ্টটি হ'ল:
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, বাশ, 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
অন্যান্য ভার্সে নিয়ন্ত্রণের অক্ষর রয়েছে এমন কিছুর জন্য সঠিক মানটি পাবেন ।