এইভাবে আমি আপনাকে পরামর্শ দিচ্ছি যে এটি করা উচিত, এবং আমি কেন তা ব্যাখ্যা করব, তবে প্রথমে আমি অন্য কিছু সম্পর্কে কথা বলতে চাই ...
set -- 'Arg 1: Line 1.' \
'Arg 2: Line 2.' \
'and so on for' \
'as long as you might like.'
var="$*"
এখানে অন্যান্য প্রচলিত সমাধানগুলি মনে করে যে আপনি কোনওভাবে শেল ভেরিয়েবলের বিষয়বস্তুগুলিকে প্রসারিত করার পদ্ধতি পরিবর্তন করে প্রভাবিত করতে পারেন। আমি আপনাকে আশ্বস্ত করতে পারি এটি এমন নয়।
string="some stuff here \
some more stuff here."
echo $string ${#string}
echo "$string" "${#string}"
আউটপুট
some stuff here some more stuff here. 53
some stuff here some more stuff here. 53
উপরে আপনি যা দেখছেন তা হ'ল প্রথমে ক্ষেত্র-বিভক্ত সম্প্রসারণ, তারপরে বিস্তারের উত্স পরিবর্তনশীলের জন্য বাইট-কাউন্টের একটি প্রতিবেদন, তারপরে একটি উদ্ধৃতি-বিস্মৃত সম্প্রসারণ এবং একই বাইট-গণনা। যদিও আউটপুট শেল ভেরিয়েবলের বিষয়বস্তু আলাদা হতে পারে $string
তবে অ্যাসাইনমেন্ট ব্যতীত কখনই পরিবর্তন হয় না।
আরও কী, যদি আপনি এটি বুঝতে না পারেন তবে এটির পরে, আপনি খুব শীঘ্রই কিছু খুব বাজে আশ্চর্যর মুখোমুখি হতে বাধ্য। আসুন এটি আবার চেষ্টা করুন, তবে কিছুটা ভিন্ন পরিস্থিতিতে।
IFS=sf
echo $string ${#string}
echo "$string" "${#string}"
একই $string
- বিভিন্ন পরিবেশ।
আউটপুট
ome tu here ome more tu here. 53
some stuff here some more stuff here. 53
ক্ষেত্র বিভাজনে সংজ্ঞায়িত ফিল্ড ডিলিমেটারগুলির উপর ভিত্তি করে ঘটে $IFS
। দুটি ধরণের ডিলিমিটার রয়েছে - $IFS
হোয়াইটস্পেস এবং $IFS
অন্য কিছু। ডিফল্টরূপে $IFS
মান স্পেস ট্যাবকে নতুন লাইন বরাদ্দ করা হয় - এটি তিনটি সম্ভাব্য $IFS
হোয়াইটস্পেসের মান। এটি সহজেই পরিবর্তিত হয়েছে, যদিও আপনি উপরে দেখতে পারেন এবং ক্ষেত্র-বিভক্ত বিস্তৃতিতে কঠোর প্রভাব ফেলতে পারে।
$IFS
হোয়াইটস্পেস একক ক্ষেত্রের ক্রম অনুসারে এল্ড করবে - এবং এ কারণেই echo
কোনও স্থান ফাঁকা রাখলে কোনও স্থানের ক্রমযুক্ত একটি সম্প্রসারণ $IFS
কেবলমাত্র একটি স্থানের জন্য মূল্যায়ন করবে - কারণ echo
স্পেসগুলির সাথে তার যুক্তিগুলি সংযুক্ত করে। কিন্তু কোনো অ হোয়াইটস্পেস মান একই ভাবে উচ্চারণ না করা হবে না, এবং প্রতিটি ঘটছে বিভেদক সবসময় নিজেই কাছে একটি ক্ষেত্র পায় - যেমন দেখা যায় কাপড় উপরে সম্প্রসারণ।
এটি এর মধ্যে সবচেয়ে খারাপ নয়। এটি অন্য বিবেচনা করুন $string
।
IFS=$space$tab$newline
cd emptydir
string=" * * * \
* * * "
echo $string ${#string}
echo "$string" "${#string}"
আউটপুট
* * * * * * 30
* * * * * * 30
ঠিক আছে, ঠিক আছে? ঠিক আছে, আসুন পরিবেশটি আবার পরিবর্তন করা যাক।
touch file1 file2 file3 file4 file5
echo $string ${#string}
echo "$string" "${#string}"
আউটপুট
file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 30
* * * * * * 30
ওহো।
ডিফল্টরূপে শেল ফাইলের নাম গ্লোবগুলি প্রসারিত করতে পারে যদি সেগুলির সাথে এটি মেলে। এটি তার পার্স-অর্ডারে প্যারামিটার বিস্তৃতি এবং ফিল্ড-বিভক্ত হওয়ার পরে ঘটে এবং সুতরাং কোনও উদ্ধৃত স্ট্রিং এইভাবে ঝুঁকিপূর্ণ। আপনি set -f
যদি চান তবে আপনি এই আচরণটি টগল করতে পারেন তবে কোনও পসিক্স-সামঞ্জস্যপূর্ণ শেল ডিফল্টরূপে সর্বদা গ্লোব করবে।
আপনি আপনার ইনডেন্টেশন পছন্দগুলি অনুসারে বিস্তৃতিতে উদ্ধৃতিগুলি ফেলে দিলে আপনি যে ধরণের জিনিসগুলির বিরুদ্ধে যাচ্ছেন তা এই is এবং তবুও, প্রতিটি ক্ষেত্রে, এর সম্প্রসারণ আচরণ নির্বিশেষে, এর জন্য আসল মান $string
সর্বদা এখনও যখনই আপনি এটিকে নির্ধারিত করেছিলেন তখনই থাকে is সুতরাং প্রথম জিনিস ফিরে আসা যাক।
set -- 'Arg 1: Line 1.' \
'Arg 2: Line 2.' \
'and so on for' \
'as long as you might like.'
var="$*"
echo "$var" "${#var}"
আউটপুট
Arg 1: Line 1. Arg 2: Line 2. and so on for as long as you might like. 70
আমি বিশ্বাস করি এটি আপনার ইনডেন্টেশন পছন্দগুলিতে শেল সিনট্যাক্সটিকে অভিযোজিত করার একটি সুদূরতর উপায়। আমি উপরে যা করছি তা প্রতিটি পৃথক স্ট্রিংকে পজিশনাল প্যারামিটারে অর্পণ করা হয় - যা প্রতিটি যেমন $1
বা ${33}
- এর মতো সংখ্যার দ্বারা উল্লেখ করা যেতে পারে এবং তারপরে $var
বিশেষ শেল প্যারামিটারটি ব্যবহার করে তাদের সংক্ষিপ্ত মানগুলি নির্ধারণ করে $*
।
এই পদ্ধতির $IFS
পক্ষেও অনাক্রম্য নয় । তবুও, আমি এর সম্পর্কটিকে $IFS
এই ক্ষেত্রে একটি অতিরিক্ত বেনিফিট হিসাবে বিবেচনা করি। বিবেচনা:
IFS=\ ;space_split="$*"
IFS=/; slash_split="$*";IFS='
';new_line_split="$*"
echo "$space_split"
echo "$slash_split"
echo "$new_line_split"
আউটপুট
Arg 1: Line 1. Arg 2: Line 2. and so on for as long as you might like.
Arg 1: Line 1./Arg 2: Line 2./and so on for/as long as you might like.
Arg 1: Line 1.
Arg 2: Line 2.
and so on for
as long as you might like.
যেমন আপনি দেখতে পাচ্ছেন, $*
প্রতিটি আর্গোনেট "$@"
প্রথম বাইটে প্রবেশ করে $IFS
। সুতরাং $IFS
আলাদাভাবে নির্ধারিত হওয়ার সময় এর মানটি সংরক্ষণ করা প্রতিটি সংরক্ষিত মানের জন্য আলাদা ক্ষেত্রের ডিলিমিটার পায় উপরে আপনি যা দেখেন তা হ'ল উপায় হিসাবে প্রতিটি চলকটির আক্ষরিক মান। আপনি যদি কোনও ডিলিমিটার না চান তবে আপনি যা করবেন:
IFS=;delimitless="$*"
echo "$delimitless" "${#delimitless}"
আউটপুট
Arg 1: Line 1.Arg 2: Line 2.and so on foras long as you might like. 67