উদ্ধৃত বনাম আনকোটেড স্ট্রিং এক্সপেনশন


11
  1. for i in $(xrandr); do echo "$i" ; done
  2. for i in "$(xrandr)"; do echo "$i"; done
  3. for i in "$(xrandr)"; do echo $i; done

আমি বুঝতে পারি কেন 1 টি 2 থেকে আলাদা হয় তবে 3 কেন 2 থেকে আলাদা আউটপুট দেয়? অনুগ্রহ করে আউটপুটটিও ব্যাখ্যা করুন। উদ্ধৃতিগুলি কীভাবে নতুন লাইনে কাজ করে?



উত্তর:


19

বোর্ন-জাতীয় শেলস- এ স্প্লিট + গ্লোব অপারেটরটি একটি অব্যক্ত ভেরিয়েবল (যেমন হিসাবে $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আউটপুট, আপনি সেট প্রয়োজন চাই $IFSnewline অক্ষর হবে:

IFS='
'

4

উদ্ধৃত নিউলাইন একটি নতুন লাইন। তাই echo "$1"প্রতিধ্বনি করতে একটি একক কমান্ড লাইন আর্গুমেন্ট দেয় যা পরে সরাসরি নতুন লাইনের মুদ্রণ করে।

একটি অব্যক্ত নিউলাইন হ'ল সাদা স্থান। তাই echo $1প্রতিধ্বনিত করতে অনেক কমান্ড লাইন আর্গুমেন্ট দেয় যা এগুলি একের পর এক স্পেস দিয়ে আলাদা করে প্রিন্ট করে।


আইমো -র আচরণের ব্যাখ্যা হিসাবে সত্যই কার্যকর হওয়ার জন্য একটি অচিহ্নযুক্ত নিউলাইন হ'ল স্পটস স্পট স্পেস a
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.