@ গিলসের উত্তর সত্যই দুর্দান্ত, তিনি একটি জটিল বিষয় (বিশদভাবে) ব্যাখ্যা করেছেন।
তবে, আমি বিশ্বাস করি যে এই আদেশটির উত্তর:
$ IFS=. printf "%s\n" $var
a.b.c
এটি যেমন কাজ করে তেমন সহজ ধারণাটি হ'ল পুরো কমান্ড লাইনটি কার্যকর হওয়ার আগে পার্স করা হয়। এবং প্রতিটি "শব্দ" শেল দ্বারা একবার প্রক্রিয়া করা হয়। বরাদ্দকরণ, মত , বিলম্বিত হয় (পদক্ষেপ 4 শেষ এক):
IFS=.
৪.- প্রতিটি পরিবর্তনশীল দায়িত্ব বাড়ানো হবে ...
কমান্ড কার্যকর হওয়ার আগে এবং আর্গুমেন্টের সমস্ত বিস্তৃতকরণ কার্যকর করার আগে এই নির্বাহযোগ্য লাইনটি তৈরি করার আগে প্রক্রিয়া করা হয়:
$ IFS=. printf "%s\n" a.b.c ## IFS=. goes to the environment.
a.b.c
এর মান $varথেকে 'পুরানো' IFS সঙ্গে প্রসারিত হয় a.b.cকমান্ড সামনে printfআর্গুমেন্ট দেওয়া হয় "%s\n"এবং a.b.c।
Eval
এক স্তরের বিলম্ব এর দ্বারা প্রবর্তিত হতে পারে eval:
$ IFS=. eval printf "'%s\n'" \$var
a
b
c
লাইনটি পার্স করা হয়েছে (প্রথমবার) এবং 'আইএফএস ='। পরিবেশ হিসাবে এই হিসাবে সেট করা হয়:
$ printf '%s\n' $var
তারপরে এটি আবার বিশ্লেষণ করা হয়েছে:
$ printf '%s\n' a b c
এবং এটি কার্যকর করা:
a
b
c
এর মান $var(এবিসি) ব্যবহারে IFS মান বিভক্ত হল: .।
পরিবেশ
জটিল এবং কৌতুকপূর্ণ অংশটি যখন পরিবেশে কার্যকর হয় তখন !!!
গিলস উত্তরের প্রথম অংশে এটি খুব ভালভাবে ব্যাখ্যা করা হয়েছে।
একটি অতিরিক্ত বিশদ সহ।
যখন এই আদেশটি কার্যকর করা হয়:
$ IFS=. arr=($var)
আইএফএসের মান বর্তমান পরিবেশে ধরে রাখা হয়, হ্যাঁ:
$ printf '<%s> ' "${arr[@]}" "$IFS"
<a> <b> <c> <.>
একক বিবৃতি জন্য আইএফএস।
তবে এটি এড়ানো যায়: একক বিবৃতি দেওয়ার জন্য আইএফএস সেট করা
$ IFS=. command eval arr\=\(\$var\)
$ printf '<%s> ' "${arr[@]}" "$IFS"
<a> <b> <c> <
>
IFSEec এ সেট থাকা."। প্রথম অংশটি পড়ার পরে, এটি বোঝা যায়, তবে আমি এই প্রশ্নটি পোস্ট করার আগে, আমি এটি আশা করি না।