এই আশ্চর্যরকম ঘন ঘন ক্ষেত্রে যেখানে আপনাকে আসলে কিছুটা ফ্যাশনের পরিবর্তনের পরিবর্তে সমস্ত শূন্য ফাঁকা লাইনগুলি প্রক্রিয়া করা হয় (সেগুলি গণনা সহ), আপনি আইএফএসকে কেবল একটি নতুন লাইনে সেট করতে পারেন এবং তারপরে শেলের শব্দ বিভাজন প্রক্রিয়াটি ভাঙ্গতে ব্যবহার করতে পারেন খালি খালি লাইন পৃথক।
উদাহরণস্বরূপ, এখানে একটি সামান্য শেল ফাংশন যা সমস্ত সরবরাহিত আর্গুমেন্টের মধ্যে খালি খালি লাইনগুলি যোগ করে:
lines() (
IFS='
'
set -f #disable pathname expansion
set -- $*
echo $#
)
বন্ধনীগুলির পরিবর্তে প্যারেন্টিসগুলি এখানে ফাংশন বডিটির জন্য যৌগিক কমান্ড গঠনে ব্যবহৃত হয়। এটি ফাংশনটিকে একটি সাবশেলে কার্যকর করতে সক্ষম করে যাতে এটি বাইরের বিশ্বের আইএফএস ভেরিয়েবল এবং প্রতিটি কলের প্যাথনাম এক্সপেনশন সেটিংসকে দূষিত না করে।
আপনি যদি খালি খালি লাইনে পুনরাবৃত্তি করতে চান তবে আপনি এটি একইভাবে করতে পারেন:
IFS='
'
set -f
for line in $lines
do
printf '[%s]\n' $line
done
আইএফএসকে এভাবে চালিত করা একটি প্রায়শই অবহেলিত কৌশল, যা প্যাথ-নেম পার্সিংয়ের মতো জিনিসগুলির জন্যও কার্যকর যা ট্যাব-বিসীমাবদ্ধ কলামার ইনপুট থেকে ফাঁকা স্থান থাকতে পারে। তবে আপনার সচেতন হওয়া দরকার যে স্পেস-ট্যাব-নিউলাইনটি সাধারণত আইএফএসের ডিফল্ট সেটিংসে অন্তর্ভুক্ত স্পেস ক্যারেক্টারটি ইচ্ছাকৃতভাবে মুছে ফেলা আপনি যে জায়গাগুলিতে এটি দেখতে প্রত্যাশা করবেন সে জায়গাতে শব্দ বিভাজন অক্ষম করতে পারে।
উদাহরণস্বরূপ, আপনি যদি কোনও জটিল কমান্ড লাইন তৈরির জন্য ভেরিয়েবলগুলি ব্যবহার করে থাকেন তবে ভেরিয়েবলটি কেবল কোনও শূন্য নয় এমনটিতে সেট করা থাকলে ffmpeg
আপনি অন্তর্ভুক্ত করতে চাইতে পারেন । সাধারণত আপনার সাথে এই অর্জন করতে পারে কিন্তু যদি IFS সময় এই প্যারামিটারটি সম্প্রসারণ সম্পন্ন করা হয় তার স্বাভাবিক স্থান অক্ষর অন্তর্ভুক্ত নয়, স্থান মধ্যে এবং একটি শব্দ বিভাজক হিসেবে ব্যবহার করা হবে না এবং সব পাস হবে একটি একক আর্গুমেন্ট হিসাবে, যা এটি বুঝতে পারে না।-vf scale=$scale
scale
${scale:+-vf scale=$scale}
-vf
scale=
ffmpeg
-vf scale=$scale
এটি ঠিক করার জন্য, আপনাকে নিশ্চিত IFS কাজ করার আগে আরও স্বাভাবিকভাবে হয় করতে পারেন প্রয়োজন চাই ${scale}
সম্প্রসারণ, বা দুই প্রসারণও করুন: ${scale:+-vf} ${scale:+scale=$scale}
। শেলটি কমান্ড লাইনগুলির প্রাথমিক পার্সিংয়ের প্রক্রিয়াতে শেলটি যে শব্দটি বিভক্ত করে তার বিপরীতে command কমান্ড লাইনের প্রসেসিংয়ের প্রসারণের পর্যায়ে বিভক্ত হওয়ার বিপরীতে, আইএফএসের উপর নির্ভর করে না।
আপনি যদি এই ধরণের জিনিসটি করতে যাচ্ছেন তবে অন্য কিছু যা আপনার পক্ষে মূল্যবান হতে পারে তা কেবল একটি ট্যাব এবং কেবল একটি নতুন লাইন ধরে রাখতে দুটি বৈশ্বিক শেল ভেরিয়েবল তৈরি করবে:
t=' '
n='
'
এই ভাবে আপনি কেবলমাত্র অন্তর্ভুক্ত করতে পারেন $t
এবং $n
যেখানে আপনার ট্যাব এবং নিউলাইনগুলি প্রয়োজন সেখানে বিস্তৃত হোয়াইটস্পেসের সাহায্যে আপনার সমস্ত কোড লিটারের চেয়ে। আপনি যদি কোনও পসিক্স শেলের সাথে সম্পূর্ণরূপে উদ্ধৃত শ্বেতক্ষেত্র এড়াতে চান তবে এর জন্য অন্য কোনও ব্যবস্থা নেই, printf
তবে আপনাকে সাহায্য করতে পারেন যদিও কমান্ড বিস্তারে নতুন লাইনের পথ অনুসরণের জন্য আপনাকে কিছুটা ফিডিং করতে হবে:
nt=$(printf '\n\t')
n=${nt%?}
t=${nt#?}
কখনও কখনও আইএফএস স্থাপন করে যেমন এটি প্রতি-কমান্ড পরিবেশের পরিবর্তনশীল কাজ করে vari উদাহরণস্বরূপ, এখানে এমন একটি লুপ রয়েছে যা এমন কোনও পাথের নাম পড়ে যা কোনও ট্যাব-বিস্মৃত ইনপুট ফাইলের প্রতিটি লাইন থেকে ফাঁকা স্থান এবং একটি স্কেলিং ফ্যাক্টর ধারণ করে allowed
while IFS=$t read -r path scale
do
ffmpeg -i "$path" ${scale:+-vf scale=$scale} "${path%.*}.out.mkv"
done <recode-queue.txt
এই ক্ষেত্রে read
বিল্টিন আইএফএসকে কেবল একটি ট্যাবে সেট করে দেখায়, সুতরাং এটি ফাঁকা জায়গায় পড়া ইনপুট লাইনটিকে বিভক্ত করবে না। কিন্তু কাজ IFS=$t set -- $lines
করে না : কমান্ডটি কার্যকর করার আগে বিল্টিনের যুক্তি $lines
তৈরি করার সাথে সাথে শেলটি প্রসারিত হয় , সুতরাং আইএফএসের অস্থায়ী বিন্যাসটি এমনভাবে নির্মিত যা কেবল বিল্টিনের সম্পাদনার সময় প্রযোজ্য late এই কারণেই আমি কোডগুলি স্নিপেটগুলি পৃথক ধাপে সমস্ত সেট আইএফএসের উপরে দিয়েছি এবং কেন এটি সংরক্ষণের বিষয়টি নিয়ে তাদের মোকাবেলা করতে হবে।set
wc -l
সাথে ঠিক সমান: মানটিতে<<<$foo
একটি নতুন লাইন যুক্ত করে$foo
(এমনকি$foo
শূন্য থাকলেও )। আমি আমার উত্তরে ব্যাখ্যা করেছিলাম কেন এটি যা চেয়েছিল তা নাও হতে পারে তবে এটিই যা জিজ্ঞাসা করা হয়েছিল।