একক উদ্ধৃতিগুলির মধ্যে কীভাবে ভেরিয়েবলগুলি ব্যবহার করবেন


11

আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা একক উদ্ধৃতিতে এমবেডড ডাবল কোটসে একটি ইনপুট বৈশিষ্ট্য হিসাবে গ্রহণ করে। উদাহরণস্বরূপ এই ডান কমান্ডটি ধরুন:

command -p 'cluster="cl1"'

এটি স্বয়ংক্রিয় করার জন্য, আমি $CLUSTERএকটি ভেরিয়েবল হিসাবে ব্যাশ ফাইল তৈরি করেছি । আমার আদেশ কেমন হবে? অন্য কথায়, cl1 এর পরিবর্তে আমার কী রাখা উচিত?

দয়া করে নোট করুন, আমি যদি উপরের কমান্ডটি সংশোধন করি তবে তা গৃহীত হবে না। উদাহরণস্বরূপ: command -p "cluster=cl1"গৃহীত হয় না


2
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
মাইক্রজারভ

আরেকটি সম্ভাবনা (আপনি যদি ভেরিয়েবলের cliভিতরে কোট না দিয়ে সঞ্চয় করতে চান CLUSTER):CLUSTER='cl1'; command -p 'cluster="'"$CLUSTER"'"'
জিম্মিজ

অবশেষে, আমি সঠিক উত্তর খুঁজে পেয়েছি। ধন্যবাদ @ জিম্মিজ
মোহামাদ-জাফর NEHME

উত্তর:


8

দেখে মনে হচ্ছে আপনার কমান্ড সম্ভবত কমান্ড-লাইনে প্রদত্ত আর্গুমেন্টের ভিত্তিতে পরিবেশ পরিবর্তনশীল সেট করছে। এটি আপনি করতে পারেন হতে পারে:

CLUSTER=cl1; cluster=$CLUSTER command

... এবং অনুরোধের জন্য এর পরিবেশ নির্ধারণ করুন।

অন্যথায়, শেল উদ্ধৃতিগুলি সাধারণত আর্গুমেন্টগুলি সীমাবদ্ধ করে দেয় বা শেল ব্যাখ্যা থেকে অন্যান্য বিশেষ শেল অক্ষরগুলি এড়ায়। আপনি বিভিন্ন নিয়মের ভিত্তিতে অন্যান্য ধরণের মধ্যে বিভিন্ন ধরণের শেল-কোট ধারণ করতে (এবং তাই পালাতে পারেন) :

  • "''''" - একটি সফট-কোটেড স্ট্রিংয়ে অনেকগুলি হার্ড-কোট থাকতে পারে।
  • "\""- একটি \ব্যাকস্ল্যাশ "একটি "নরম-উদ্ধৃত স্ট্রিংয়ের মধ্যে একটি সফট- কোট থেকে রক্ষা পেতে পারে ।
    • এই প্রসঙ্গে একটি \\ব্যাকস্ল্যাশও নিজেকে ছেড়ে যায়, \$প্রসারণের টোকেন এবং \nনীচে উল্লিখিত হিসাবে ewlines, তবে অন্যথায় আক্ষরিকভাবে চিকিত্সা করা হয়।
  • "${expand} and then some"- একটি নরম-উদ্ধৃত স্ট্রিংটিতে একটি ব্যাখ্যা শেল $সম্প্রসারণ থাকতে পারে ।
  • '"\'- একটি 'হার্ড-কোটযুক্ত স্ট্রিংয়ে একটি 'হার্ড-কোট ব্যতীত অন্য কোনও অক্ষর থাকতে পারে ।
  • \- একটি অনাকাক্সিক্ষত ব্যাকস্ল্যাশ আক্ষরিক ব্যাখ্যার জন্য নিম্নলিখিত যে কোনও অক্ষর - এমনকি একটি অন্য ব্যাকস্ল্যাশ - একটি ই- \nলাইন বাদে পালিয়ে যাবে।
    • একটি \\newline ক্ষেত্রে \ব্যাকস্ল্যাশ এবং 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"

1

ভালো লেগেছে mikeserv লিখেছিলেন:

 CLUSTER='"cl1"'; command -p "cluster=$CLUSTER" 

"ডাবল উদ্ধৃতি" প্রত্যেক আক্ষরিক যে স্পেস / metacharacters এবং ধারণ করে যে সম্প্রসারণ: "$var", "$(command "$var")", "${array[@]}", "a & b"। ব্যবহার করুন 'single quotes'কোড বা আক্ষরিক জন্য $'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'। দেখুন
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words


আপনি ঠিক বলেছেন, ধন্যবাদ। কিন্তু, অটোমেশন সম্পর্কে কী? মনে করুন আমি ক্লাস্টার পড়তে চাই? আমি আবার একই সমস্যার সাথে আটকে যাব: একক উদ্ধৃতিগুলির মধ্যে পরিবর্তনশীল
মোহাম্মদ-জাফর NEHME

@ মাই - অটোমেশন কোনও বড় বিষয় নয়, যদিও আপনাকে "অক্ষরের পরিবর্তনশীলটি স্যানিটাইজ করতে হবে - কেবল প্রথম এবং শেষটি যথেষ্ট হওয়া উচিত। এখানে আসল সমস্যাটি হ'ল আপনার অ্যাপ্লিকেশনটি একটি আর্গটিতে উদ্ধৃতিগুলি ব্যাখ্যা করে। একটি যুক্তির মাধ্যমে একটি উদ্ধৃতিটির অর্থ ব্যাখ্যা করা প্রায়শই ভাল ধারণা নয় কারণ একটি উক্তিটি কেবল একটি যুক্তি সীমাবদ্ধ করার মাধ্যম হওয়া উচিত - এবং অনুরোধ করলে যে \0NULপ্রতিটি ক্ষেত্রেই সীমানাটি পরিচালনা করা হয় । সম্ভবত আপনি অ্যাপটিতে চান তথ্য পাস করার আরও ভাল উপায় আছে? একটি command --'script=/path/to/some/file'বা কিছু পছন্দ ?
মাইক্রজারভের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.