বোর্ন-জাতীয় শেলস- এ স্প্লিট + গ্লোব অপারেটরটি একটি অব্যক্ত ভেরিয়েবল (যেমন হিসাবে $var
) বা কমান্ড প্রতিস্থাপন (যেমন $(cmd)
বা হিসাবে রয়েছে `cmd`
) ।
অর্থাৎ, তাদের বিষয়বস্তু $IFS
বিশেষ ভেরিয়েবলের বর্তমান মান অনুসারে বিভক্ত হয় (যার মধ্যে ডিফল্টরূপে স্থান, ট্যাব এবং নিউলাইন অক্ষর থাকে)
এবং তারপরে এই বিভাজনের ফলে প্রাপ্ত প্রতিটি শব্দই ফাইলের নাম প্রজন্মের (যা গ্লোব্বিং বা ফাইলের নাম সম্প্রসারণ হিসাবেও পরিচিত ) সাপেক্ষে , সেগুলি নিদর্শন হিসাবে বিবেচনা করা হয় এবং সেই ধরণের সাথে মেলে এমন ফাইলের তালিকায় প্রসারিত হয়।
সুতরাং for i in $(xrandr)
, এটি $(xrandr)
, কারণ এটি উদ্ধৃতিগুলির মধ্যে নয়, স্থান, ট্যাব এবং নিউলাইন অক্ষরের ক্রমগুলিতে বিভক্ত। এবং সেই বিভাজনের ফলে প্রাপ্ত প্রতিটি শব্দ ফাইলের নামের সাথে মিলে যায় (বা এটি কোনও ফাইলের সাথে মেলে না এমন হিসাবে রেখে দেওয়া হয়), এবং সেগুলির for
উপরে লুপ করে।
ইন for i in "$(xrandr)"
, আমরা বিভক্ত + + উল্লিখিত glob অপারেটর ব্যবহার করছেন না যেমন কমান্ড প্রতিকল্পন উদ্ধৃত হয়, তাই সেখানে লুপ এক পাস এর এক আউটপুট: VALUE xrandr
(trailing সম্পর্কে newline অক্ষর যা ছাড়া কমান্ড প্রতিকল্পন রেখাচিত্রমালা)।
তবে এর মধ্যে echo $i
, $i
পুনরায় উদ্ধৃত হয় না, সুতরাং আবার বিষয়বস্তু $i
বিভক্ত হয় এবং ফাইল নাম উত্পন্ন হয় এবং সেগুলি echo
কমান্ডের পৃথক যুক্তি হিসাবে প্রেরণ করা হয় (এবং echo
এর যুক্তিগুলিকে ফাঁকা ফাঁকে আলাদা করে দেয়)।
সুতরাং পাঠ শিখেছি:
- আপনি যদি শব্দ বিভাজন বা ফাইলের নাম তৈরি করতে না চান তবে সর্বদা পরিবর্তনশীল বিস্তৃতি এবং কমান্ডের বিকল্পগুলি উদ্ধৃত করুন
- আপনি যদি শব্দ বিভাজন বা ফাইলের নাম তৈরি করতে চান তবে এগুলিকে উদ্ধৃত করুন না তবে সে
$IFS
অনুযায়ী সেট করুন এবং / অথবা প্রয়োজন হলে ফাইল নেম উত্পাদন সক্ষম বা অক্ষম করুন ( set -f
, set +f
)।
সাধারণত আপনার উপরের উদাহরণে, যদি আপনি আউটপুটে শব্দের ফাঁকা পৃথক তালিকার উপরের লুপটি করতে চান xrandr
, আপনার প্রয়োজন হবে:
$IFS
ফাঁকা জায়গায় বিভক্ত করতে তার ডিফল্ট মান (বা এটি আনসেট করুন) এ ছেড়ে দিন
- ব্যবহারের
set -f
নিষ্ক্রিয় ফাইলের নাম প্রজন্মের যদি না আপনি নিশ্চিত যে xrandr
কোনো আউটপুট কখনো *
বা ?
বা [
অক্ষর (যা ওয়াইল্ডকার্ড ফাইলের নাম প্রজন্ম নিদর্শন ব্যবহার করা হয়)
এবং তারপরে লুপের in
অংশে কেবল স্প্লিট + গ্লোব অপারেটর (কেবলমাত্র কমান্ড প্রতিস্থাপন বা ভেরিয়েবল সম্প্রসারণ অব্যর্থ ছেড়ে দিন) ব্যবহার করুন for
:
set -f; unset -v IFS
for i in $(xrandr); do whatever with "$i"; done
আপনি (অ খালি) উপর লুপ করতে চান লাইন এর xrandr
আউটপুট, আপনি সেট প্রয়োজন চাই $IFS
newline অক্ষর হবে:
IFS='
'