আমি এই থ্রেডটি পড়ছিলাম: কোনও ফাইলের লাইনটি কীভাবে লুপ করবেন?
কী IFS
? এবং for
-লুপগুলির প্রসঙ্গে এর ব্যবহার কী?
আমি এই থ্রেডটি পড়ছিলাম: কোনও ফাইলের লাইনটি কীভাবে লুপ করবেন?
কী IFS
? এবং for
-লুপগুলির প্রসঙ্গে এর ব্যবহার কী?
উত্তর:
IFS
এর জন্য দাঁড়িয়েছে - এটি এমন একটি চরিত্র যা ক্ষেত্রগুলি পৃথক করে। আপনি পোস্ট করেছেন উদাহরণে, এটি নতুন লাইন চরিত্রে সেট করা হয়েছে ( ); সুতরাং আপনি এটি সেট করার পরে, পাঠ্য লাইন এক এক করে প্রক্রিয়াকরণ করবে। এই উদাহরণে, আপনি (আপনার ইনপুট ফাইলে থাকা কোনও অক্ষরের কাছে) এর মান পরিবর্তন করতে পারেন এবং পাঠ্য কীভাবে বিভক্ত হবে তা পরীক্ষা করতে পারেন।Input
Internal Field Separator
\n
for
IFS
বিটিডাব্লু, আপনি যে উত্তরটি পোস্ট করেছেন দ্বিতীয় সমাধানটি হ'ল এটি প্রস্তাবিত ...
@ জেসনওয়ারিয়ান যেমন খেয়াল করেছেন, তা কিন্তু Input
নয় Internal
। নাম Input
এসেছিল awk
যা থেকে এছাড়াও আছে OFS
- Output Field Separator
।
S
ছিল বিভাজক বোর্ন শেল যেখানে এটি থেকে সম্ভূত হবে। কর্ন শেল এবং অন্যান্য বোর্নের মতো শেল যেটি এখন দ্বারা নির্দিষ্ট করা হয়েছে POSIX
তাতে S
ডিলিমিটারের জন্য রয়েছে (কেবলমাত্র আপনার কল্পনাটি কিছুটা প্রসারিত করুন) A::B:
উদাহরণস্বরূপ "এ", "" এবং "বি" তে বিভক্ত (কোনও অতিরিক্ত নেই) "")। যে থেকে আলাদা awk
'র FS
বা s
এর প্যারামিটার সম্প্রসারণ পতাকা zsh
।
IFS
লুপিংয়ের সাথে সরাসরি সম্পর্কিত নয়, এটি শব্দ বিভাজনের সাথে সম্পর্কিত। IFS
কমান্ড থেকে আউটপুট কীভাবে লুপটি পুনরায় পুনরুক্ত হয় তা টুকরো টুকরো হয়ে যায় তা পরোক্ষভাবে নির্ধারণ করে।
যখন আপনার কোনও সুরক্ষিত পরিবর্তনশীল বিকল্প $foo
বা কমান্ড প্রতিস্থাপন থাকে $(foo)
, তখন দুটি ক্ষেত্রে থাকে:
"$foo"
বা ভেরিয়েবল অ্যাসাইনমেন্টের মধ্যে থাকে x=$foo
, তবে প্রতিস্থাপনের ফলে প্রাপ্ত স্ট্রিংটি যেমন হয় তেমন ব্যবহৃত হয়।$IFS
তাকে শব্দ বিভাজক হিসাবে বিবেচনা করা হয়। উদাহরণস্বরূপ IFS=":"; foo="12:34::78"; echo $foo
প্রিন্টগুলি 12 34 78
(এর মধ্যে দুটি ফাঁকা জায়গা রয়েছে 34
এবং 78
যেহেতু খালি শব্দ রয়েছে)।foo="*"; echo $foo
বর্তমান ডিরেক্টরিতে ফাইলগুলির তালিকা মুদ্রণ করে।লুপগুলির জন্য, অন্যান্য অন্যান্য প্রসঙ্গে যেমন শব্দের একটি তালিকা আশা করে। সুতরাং
for x in $(foo); do …
$(foo)
শব্দগুলিতে বিভক্ত হয় এবং প্রতিটি শব্দকে গ্লোব প্যাটার্ন হিসাবে বিবেচনা করে। এর ডিফল্ট মান IFS
হ'ল স্থান, ট্যাব এবং নিউলাইন , সুতরাং যদি foo
দুটি লাইন প্রিন্ট করে hello world
এবং howdy
তারপরে লুপের বডিটি কার্যকর করা হয় x=hello
তবে x=world
এবং x=howdy
। যদি IFS
কেবলমাত্র একটি নতুন লাইন ধারণ করে স্পষ্টভাবে পরিবর্তিত হয় তবে লুপটি কার্যকর হয় hello world
এবং এর জন্য howdy
। যদি IFS
হতে পরিবর্তিত হয় o
, তারপর লুপ জন্য মৃত্যুদন্ড কার্যকর করা হয় hell
, w
, rldh
(যেখানে 
একটি newline চরিত্র) এবং wdy
।
"IFS indirectly determines how ..."
?
IFS
(সরাসরি) নির্ধারণ করে যে কীভাবে কমান্ড প্রতিস্থাপনের আউটপুট বিভক্ত হয়, যা পরে (অপ্রত্যক্ষভাবে) নির্ধারণ করে যে লুপটি কী আউট হবে।
থেকে man bash
আইএফএস অভ্যন্তরীণ ক্ষেত্র বিভাজক যা প্রসারণের পরে শব্দ বিভাজনের জন্য এবং পঠিত বিল্টিন কমান্ডের সাহায্যে শব্দের মধ্যে লাইনগুলি বিভক্ত করতে ব্যবহৃত হয়। ডিফল্ট মান হ'ল "<স্পেস> <ট্যাব> <নিউলাইন>"।
এটি বাশের অভ্যন্তরীণ ভেরিয়েবলগুলির মধ্যে একটি। এটি নির্ধারণ করে যে বাশ ক্ষেত্র বা শব্দের সীমা কীভাবে স্বীকৃতি দেয়, যখন এটি চরিত্রের স্ট্রিংয়ের ব্যাখ্যা করে।
এটি শ্বেতস্পেসে (স্থান, ট্যাব এবং নতুন লাইন) ডিফল্ট অবস্থায়, এটি পরিবর্তিত হতে পারে, উদাহরণস্বরূপ, কমা-বিচ্ছিন্ন ডেটা ফাইলকে পার্স করতে।
পূর্ববর্তী মহান উত্তর ছাড়াও, আমাকে শুধু যোগ যে দিন IFS সঙ্গে একযোগে সহজ ক্ষেত্রেই দক্ষ ও পোর্টেবল পার্সিং জন্য খুব উপকারী সেট । দক্ষ, কারণ গ্রিপ বা শেডের মতো সাবশেল এবং স্পোনিং সরঞ্জামগুলি ব্যবহার করা এড়ানো যায়:
resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
xxIFS=$IFS
IFS='x'
set -- $res
width=$1
height=$2
# handle width and height
IFS=$xxIFS
done;
IFS=$xIFS
শুধু মনে রাখবেন যে আমরা সঞ্চয় করি এবং পুনরুদ্ধার করতে পূর্ববর্তী মান প্রয়োজন IFS স্ক্রিপ্ট অন্যান্য অংশে অবাঞ্ছিত breakages এড়ানো।