দেখে মনে হচ্ছে আপনার কমান্ড সম্ভবত কমান্ড-লাইনে প্রদত্ত আর্গুমেন্টের ভিত্তিতে পরিবেশ পরিবর্তনশীল সেট করছে। এটি আপনি করতে পারেন হতে পারে:
CLUSTER=cl1; cluster=$CLUSTER command
... এবং অনুরোধের জন্য এর পরিবেশ নির্ধারণ করুন।
অন্যথায়, শেল উদ্ধৃতিগুলি সাধারণত আর্গুমেন্টগুলি সীমাবদ্ধ করে দেয় বা শেল ব্যাখ্যা থেকে অন্যান্য বিশেষ শেল অক্ষরগুলি এড়ায়। আপনি বিভিন্ন নিয়মের ভিত্তিতে অন্যান্য ধরণের মধ্যে বিভিন্ন ধরণের শেল-কোট ধারণ করতে (এবং তাই পালাতে পারেন) :
"''''"
- একটি সফট-কোটেড স্ট্রিংয়ে অনেকগুলি হার্ড-কোট থাকতে পারে।
"\""
- একটি \
ব্যাকস্ল্যাশ "
একটি "
নরম-উদ্ধৃত স্ট্রিংয়ের মধ্যে একটি সফট- কোট থেকে রক্ষা পেতে পারে ।
- এই প্রসঙ্গে একটি
\\
ব্যাকস্ল্যাশও নিজেকে ছেড়ে যায়, \$
প্রসারণের টোকেন এবং \n
নীচে উল্লিখিত হিসাবে ewlines, তবে অন্যথায় আক্ষরিকভাবে চিকিত্সা করা হয়।
"${expand} and then some"
- একটি নরম-উদ্ধৃত স্ট্রিংটিতে একটি ব্যাখ্যা শেল $
সম্প্রসারণ থাকতে পারে ।
'"\'
- একটি '
হার্ড-কোটযুক্ত স্ট্রিংয়ে একটি '
হার্ড-কোট ব্যতীত অন্য কোনও অক্ষর থাকতে পারে ।
\
- একটি অনাকাক্সিক্ষত ব্যাকস্ল্যাশ আক্ষরিক ব্যাখ্যার জন্য নিম্নলিখিত যে কোনও অক্ষর - এমনকি একটি অন্য ব্যাকস্ল্যাশ - একটি ই- \n
লাইন বাদে পালিয়ে যাবে।
- একটি
\\n
ewline ক্ষেত্রে \
ব্যাকস্ল্যাশ এবং ewline উভয়ই \n
ফলাফল বর্ণিত কমান্ড থেকে সম্পূর্ণ সরিয়ে দেওয়া হয়।
${parameter+expand "$parameter"}
- শেল প্রসারণের ফলে পাওয়া উদ্ধৃতিগুলি কয়েকটি বিশেষ ক্ষেত্রে বাদে প্রায়শই ডিলিমিটার চিহ্নিতকারী হিসাবে পরিবেশন করে না। আমি এখানে এগুলি আরও বর্ণনা করার উদ্যোগ নেব না।
আমি এটিকে অদ্ভুত বিবেচনা করি যে কোনও অ্যাপ্লিকেশন তার কমান্ড-লাইন আর্গগুলিতে উদ্ধৃতিগুলি ব্যাখ্যা করবে। এই জাতীয় অনুশীলনটি এর মধ্যে খুব একটা বোঝায় না - শাঁসের জন্য, কমপক্ষে - একটি উদ্ধৃতিটির প্রাথমিক উদ্দেশ্যটি সাধারণত একটি যুক্তি সীমাবদ্ধ করা। অনুরোধে, যুক্তিগুলি সর্বদা অক্ষরগুলির সাথে ইতিমধ্যে সীমিত করা হয় \0NUL
এবং সুতরাং একটি উদ্ধৃতি খুব বেশি উদ্দেশ্য অর্জন করতে পারে না।
এমনকি একটি শেল সাধারণত সাধারণত তার একটি অনুরোধ যুক্তিতে কোটগুলি ব্যাখ্যা করতে বিরত হয় যখন এটি একটি -c
স্যুইচ দিয়ে ডাকা হয় - যা বোঝায় যে এর প্রথম অপারেন্ডটি আসলে একটি শেল স্ক্রিপ্ট যা এটি অনুরোধের সময় চালানো উচিত। এটি দ্বিগুণ মূল্যায়িত ইনপুটের একটি মামলা ।
যা যা বলেছিল, আপনি কমান্ড-লাইনে আর্গুমেন্টের মাধ্যমে আক্ষরিক উক্তি পাস করার জন্য অনেকগুলি কাজ করতে পারেন। উদাহরণ স্বরূপ:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
যেমনটি আমি আগে একটি মন্তব্যে উল্লেখ করেছি, আপনি "
নিজেরাই "
উদ্ধৃত হওয়া একটি বিস্তারের মধ্যে উদ্ধৃতিগুলি রাখতে পারেন ।
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
উদ্ধৃত স্ট্রিংয়ের মধ্যে আপনি ব্যাকস্ল্যাশ "
দিয়ে পালাতে পারেন ।\
"
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
উপরের @ জিম্মিজ নোট হিসাবে আপনার পছন্দসই শেষ ফলাফলটিতে পৌঁছানোর জন্য আপনি বিকল্প এবং সংলগ্ন শৈলীগুলি উদ্ধৃত করতে পারেন ।
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
আপনি ফাইলের নাম উত্পাদন এবং $IFS
বিভাজন উভয়ই অক্ষম করতে পারেন - এর ফলে মোটেও উদ্ধৃতি দেওয়ার প্রয়োজন এড়ানো $expansion
- এবং কেবলমাত্র উদ্ধৃতিগুলি উদ্ধৃত করুন। এটি সম্ভবত ওভারকিল।
সর্বশেষে, শেল-উদ্ধৃতিতে আবার ব্যবহার করা যেতে পারে। আমি যেমন লক্ষ করেছি যে sh -c "$scriptlet"
শেল আহ্বানের ফর্মটি প্রায়শই কমান্ড-লাইনে শেলের স্ক্রিপ্ট সরবরাহ করতে ব্যবহৃত হয়। যখন $scriptlet
জটিল হয়ে ওঠে - যেমন কখন কোটগুলিতে অন্যান্য উক্তি থাকতে হবে - প্রায়শই এখানে-নথি ব্যবহার করা সুবিধাজনক হতে পারে এবং sh -s
পরিবর্তে - যেখানে শেলটি সমস্ত নিম্নলিখিতটি নির্ধারণের জন্য বিশেষভাবে নির্দেশিত হয় operands যেমন একটি করতে হবে অবস্থানগত প্যারামিটার -c
ক্ষেত্রে এবং এখনও এর স্ক্রিপ্ট থেকে নিতে stdin
।
যদি আপনার কমান্ডটি অবশ্যই এইভাবে উদ্ধৃতিগুলি ব্যাখ্যা করে তবে আমি এটি আরও ভাল বিবেচনা করব যদি এটি কোনও ফাইল ইনপুটটিতে করতে পারে। উদাহরণ স্বরূপ:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
আপনি যদি একটি এর বিভেদক উদ্ধৃত না থাকে তাহলে <<here-document
তারপর সব বিষয়বস্তু প্রায় হুবহু চিকিত্সা করা হয় মত তারা "
- নরম-উদ্ধৃত ব্যতীত যে "
ডাবল কোট নিজেদের বিশেষভাবে চিকিত্সা নেই। এবং তাই যদি আমরা cat
পরিবর্তে উপরেরটি চালিয়ে যাই :
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... এটি মুদ্রণ ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"