বাশ: কীভাবে বিশেষ অক্ষর সমন্বিত কমান্ড লাইন আর্গুমেন্ট পাস করবেন


31

আমি নিজেকে একটি লিনাক্স প্রোগ্রাম লিখেছি programযার ইনপুট হিসাবে নিয়মিত প্রকাশ দরকার।

আমি bashশেলটিতে প্রোগ্রামটি কল করতে এবং প্রোগ্রামটির একটি কমান্ড লাইন আর্গুমেন্ট হিসাবে সেই নিয়মিত অভিব্যক্তিটি পাস করতে চাই (অন্যান্য কমান্ড লাইন আর্গুমেন্টগুলিও রয়েছে)। একটি সাধারণ নিয়মিত মত প্রকাশের মতো লাগে

[abc]\_[x|y]

দুর্ভাগ্যক্রমে চরিত্রগুলি [, ]এবং |এর মধ্যে বিশেষ চরিত্র bash। এইভাবে, কলিং

program [abc]\_[x|y] anotheragument

কাজ করে না কিছু বাছাই অক্ষর বা উদ্ধৃতি চিহ্ন ইত্যাদি ব্যবহার করে অভিব্যক্তিটি পাশ করার কোনও উপায় আছে কি?

(কলিং কোনওভাবেই program "[abc]\_[x|y] anotheragument"কাজ করছে না, কারণ এটি দুটি আর্গুমেন্টকে এক হিসাবে ব্যাখ্যা করে))

উত্তর:


27

অপরপক্ষে তুমি

  1. ব্যাকস্ল্যাশ (যেমন হিসাবে \[abc\]_\[x\|y\]) বা দিয়ে প্রতিটি একক বিশেষ প্রতীকটি এড়িয়ে চলুন
  2. পুরো যুক্তি (যেমন হিসাবে "[abc]_[x|y]") ডাবলকোট করুন ।

সম্পাদনা করুন: হিসাবে কিছু নির্দিষ্ট করেছি, dobleqouting পরিবর্তনশীল সম্প্রসারণ কিংবা কমান্ড প্রতিকল্পন বাধা দেয় না। অতএব যদি আপনার রেজেক্সে এমন কিছু রয়েছে যা ব্যাশ দ্বারা সেগুলির মধ্যে একটি হিসাবে ব্যাখ্যা করা যায়, পরিবর্তে একক উদ্ধৃতি ব্যবহার করুন।


4
ব্যাশে, ডাবল-উদ্ধৃতি প্রসারিত চলক বা পরামিতিগুলিকে বাইপাস করে না , কমান্ড প্রতিস্থাপনকে কোনও রূপে বা , পাটিগণিতের সম্প্রসারণ , ইতিহাসের সম্প্রসারণ বা ব্যাকস্ল্যাশ এড়িয়ে যাওয়া । পরিবর্তে একক উদ্ধৃতি ব্যবহার করুন। বাশ ম্যানুয়ালটির ম্যান পৃষ্ঠা দেখুন, "উদ্ধৃতি" শিরোনামে বিভাগটি। "$HOME""${USER:-root}""$(date)""`date`""$((1 + 2))""!!""\\"
ফ্লিম

25

একক উদ্ধৃতি ব্যবহার করুন। একক উদ্ধৃতি নিশ্চিত করে যে কোনও অক্ষরই ব্যাখ্যা করা যায় না।

$ printf %s 'spaces  are  not  interpreted away
neither are new lines
nor variable names $TESTING
nor square brackets [TESTING]
nor pipe characters or redirection symbols | > <
nor the semicolon ;
nor backslashes \a \b \c \\
the only thing that does not work is the single quote itself
'

আপনার যদি একটি একক উদ্ধৃতি এম্বেড করা দরকার তবে দুটি সমাধান রয়েছে:

$ printf '%s\n' '[ Don'"'"'t worry, be happy! ]'
[ Don't worry, be happy! ]
$ printf '%s\n' '[ Don'\''t worry, be happy! ]'
[ Don't worry, be happy! ]

তুমি সঠিক. +1
এন্টিক্রিস

6

প্রতি man bash

এখানে তিনটি উদ্ধৃতি ব্যবস্থা রয়েছে: পালানোর চরিত্র , একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি।

একটি অ-উদ্ধৃত ব্যাকস্ল্যাশ ( \ ) হ'ল পালাবার চরিত্র । এটি << নিউলাইন> ব্যতীত পরবর্তী অক্ষরটির আক্ষরিক মান সংরক্ষণ করে। একটি এমন \ নিজেই না, উদ্ধৃত <সম্পর্কে newline> যুগল প্রদর্শিত হবে, এবং ব্যাকস্ল্যাশ হয় \ <সম্পর্কে newline> একটি লাইন ধারাবাহিকতা হিসাবে গণ্য হবে (হয়, এটা ইনপুট স্ট্রিম থেকে মুছে ফেলা হবে এবং কার্যকরভাবে উপেক্ষিত)।

একক উদ্ধৃতিতে অক্ষরগুলি বদ্ধ করা প্রতিটি উদ্ধৃতিগুলির মধ্যে অক্ষরের আক্ষরিক মান সংরক্ষণ করে। ব্যাকস্ল্যাশ এর আগেও, একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতি নাও উপস্থিত হতে পারে।

উদ্ধৃতি মধ্যে উদ্ধৃতি চিহ্ন সংরক্ষণ অক্ষর আবদ্ধ সমস্ত অক্ষর আভিধানিক মান, বাদ দিয়ে $ , ` , \ , এবং, যখন ইতিহাস সম্প্রসারণ সক্ষম হলে, ! । অক্ষরগুলি $ এবং ` ডাবল উদ্ধৃতিতে তাদের বিশেষ অর্থ ধরে রাখে। ব্যাকস্ল্যাশ কেবল তখনই তার বিশেষ অর্থ ধরে রাখে যখন নিম্নলিখিত অক্ষরগুলির একটি অনুসরণ করা হয়: $ , ` , " , \ , বা <নিউলাইন> একটি ব্যাকস্ল্যাশ এর পূর্বে ডাবল উদ্ধৃতিতে উদ্ধৃতি দেওয়া যেতে পারে enabled সক্ষম করা থাকলে ইতিহাসের সম্প্রসারণ না করা হলে সম্পাদিত হবে! ডাবল উদ্ধৃতিতে উপস্থিত হওয়া ব্যাকস্ল্যাশ ব্যবহার করে পালিয়ে যায়। এর আগের দিকের ব্যাকস্ল্যাশ ! অপসারণ করা হয় না।

ডাবল উদ্ধৃতিতে ( নীচে নীচে PARAMETERS দেখুন) বিশেষ প্যারামিটারগুলির * এবং @ এর বিশেষ অর্থ রয়েছে ।

ফর্মের শব্দগুলি ' স্ট্রিং ' বিশেষভাবে বিবেচিত হয়। শব্দটি স্ট্রিংয়ে প্রসারিত হয় , এএনএসআই সি স্ট্যান্ডার্ড অনুসারে ব্যাকস্ল্যাশ-পলায়নযুক্ত অক্ষর প্রতিস্থাপন করা হয়েছিল। ব্যাকস্ল্যাশ এস্কেপ সিকোয়েন্সগুলি যদি উপস্থিত থাকে তবে নিম্নলিখিতভাবে ডিকোড করা হয়েছে:

       \ একটি      সতর্কতা (ঘণ্টা)
        \ b হল      ব্যাকস্পেস
        \ ই 
       \ ই      একটি এস্কেপ অক্ষর
        \ চ      ফর্ম ফিড
        \ N      নতুন লাইন
        পান \ r      গাড়ি ফেরত
        \ T      অনুভূমিক ট্যাব
        \ বনাম      উল্লম্ব ট্যাব
        \\      ব্যাকস্ল্যাশ
        \ '      একক উদ্ধৃতি
        \ "      ডাবল উদ্ধৃতি
        \ NNN    আট-বিট অক্ষর যার মান অকটাল মান nnn
              (এক থেকে তিন অঙ্ক)
       \ x এইচ এইচ    -বিট অক্ষর যার মান হেক্সাডেসিমাল মান এইচএইচ
              (এক বা দুটি হেক্স সংখ্যা)
       \ তোমার দর্শন লগ করা ছবি চার আইটেম সং ইউনিকোড (আইএসও / আইইসি 10646) চরিত্র যার মান
              হেক্সাডেসিমাল মান HHHH (এক থেকে চার হেক্স ডিজিট)
        H ইউ এইচএইচএইচএইচএইচএইচএইচএইচএইচ
              ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর যার মান
              হেক্সাডেসিমেল মান HHHHHHHH (এক থেকে আট হেক্স সংখ্যার)
        \ গ এক্স     একটি নিয়ন্ত্রণ- এক্স চরিত্র

প্রসারিত ফলাফলটি একক-উদ্ধৃত, যেন ডলারের সাইন উপস্থিত ছিল না।

একটি ডবল উদ্ধৃত পংক্তি একটি ডলার চিহ্ন (পূর্বে $ " স্ট্রিং " ) স্ট্রিং বর্তমান লোকেল অনুযায়ী অনুবাদ করা কারণ হবে। যদি বর্তমান লোকেল সি বা পোসিক্স হয় তবে ডলারের চিহ্নটি উপেক্ষা করা হবে। যদি স্ট্রিংটি অনুবাদ ও প্রতিস্থাপন করা হয় তবে প্রতিস্থাপনটি ডাবল-কোটেড হয়।


2

\এগুলি থেকে বাঁচতে আপনি বিশেষ অক্ষরের সামনে একটি ব্যাকস্ল্যাশ ( ) ব্যবহার করতে পারেন :

জন @ অসাধারণ: ~ # প্রতিধ্বনি \ &
&

2

যদিও এটি একটি রেজেক্স হিসাবে কার্যকর নাও হতে পারে, কিছু চরিত্রের ক্রমগুলি ব্যাশ ভেরিয়েবলের নাম হিসাবে ব্যাখ্যা করা যেতে পারে। এটির প্রবণতা থেকে রক্ষা পেতে এবং এগুলি প্রসারিত করা এড়াতে ডাবল কোটের পরিবর্তে একক উদ্ধৃতি ব্যবহার করুন:

program '[abc]_[x|y]' anotherargument

প্রতিটি যুক্তি পৃথকভাবে উদ্ধৃত করুন (যদি তাদের উদ্ধৃতি প্রয়োজন হয়) তাই তাদের স্বাধীন আর্গুমেন্ট হিসাবে ব্যাখ্যা করা হয়। আপনি কিছু ক্ষেত্রে অ্যারে ব্যবহার করতে পারেন:

param_array=('[abc]_[x|y]' anotherargument)    # create an array
param_array+=(yetanother)     # append another element to the array
program "${param_array[@]}"   # use the array elements as arguments to program



0

প্যাটার্নটি কোথা থেকে আসে? এটি স্থির বা কোনও ব্যবহারকারীর কাছ থেকে? স্থানীয় ব্যবহারকারী সিস্টেমে স্ক্রিপ্টটি ব্যবহার করা ব্যবহারকারী বা দূরবর্তী কেউ?

শেলটির ব্যাখ্যা থেকে নিরীক্ষণের জন্য আপনি ডেটা মোড়ানোর জন্য কোট ব্যবহার করেন। দুটি বিকল্প রয়েছে:

  1. ডাবল-কোটস, যা এখনও কিছু ব্যাখ্যার অনুমতি দেয় ($ প্রসারিত এবং `ব্যাকটিক্স)
  2. একক উদ্ধৃতি, যা আক্ষরিক অর্থে সমস্ত কিছু পাস করে

কারণ $রিজেক্স্পসে একটি বৈধ চরিত্র (লাইন-অফ-লাইন / বাফার) আপনি সম্ভবত একক-উদ্ধৃতি ব্যবহার করতে চান রেজিএক্সপ্যাকটি ধরে রাখতে, যদি না আপনি কোনও ভেরিয়েবলের মধ্যে সঞ্চয় করে থাকেন। যদি আপনি অবিশ্বস্ত কারও কাছ থেকে যথেচ্ছ ডেটা নিচ্ছেন তবে আপনাকে এর 'সাথে প্রতিস্থাপন করতে হবে '"'"'এবং তারপরে একক-কোটায় মোড়ানো দরকার ।

নোট করুন যা [abc]_[x|y]দেখে মনে হচ্ছে আপনি মিল করতে চান xবা y, যখন এটি আসলে তিনটি অক্ষরের একটির সাথে মিলছে xy|। বর্গাকার বন্ধনী অক্ষরের মধ্যে এবং কেবলমাত্র -রেঞ্জের সাথে এবং ^অবহেলার জন্য শুরুতে মেলে । সুতরাং, [abc]_(x|y)আপনি যা বোঝাতে চেয়েছিলেন তা হতে পারে এবং বন্ধনীগুলি হ'ল অক্ষর যা শেল বিশেষ। স্কোয়ার-বন্ধনী শেল করার জন্য বিশেষ নয় , এটি দেখতে ঠিক তেমন দেখাচ্ছে। ডাবল-স্কোয়ার বন্ধনী [[ ... ]]বিশেষ।


এই এখানে সবচেয়ে সঠিক উত্তরের এক (আমি প্রতিস্থাপন জন্য বিশেষ নির্দেশ প্রশংসা 'সঙ্গে '"'"'অবশ্য এটি এখনও সঠিক নয়)। [শেলের জন্য একটি বিশেষ চরিত্র, পথ-সম্প্রসারণ করার সময় এটি ওয়াইল্ডকার্ডগুলিতে ব্যবহৃত হয় (যা শেল অব্যক্ত সমস্ত কিছুর জন্য করে)।
jpalecek

এটি কিছু প্রসঙ্গে যেমন ভেরিয়েবল সাবস্ক্রিপ্টিং বা গ্লোব্বিংয়ের জন্য বিশেষ, তবে আপনি এখনও টাইপ করতে পারেন foo=a[b]এবং তারপরে echo $fooদেখতে পারেন যে স্ট্রিংটির উদ্ধৃতি দেওয়ার প্রয়োজন নেই। আপনি ঠিক বলেছেন, আমি খুব সংক্ষিপ্ত ছিল।
ফিল পি

আপনি যদি দুর্ভাগ্য abহন তবে বর্তমান ডিরেক্টরিতে একটি ফাইল রয়েছে এবং তারপরে fooএটির abপরিবর্তে থাকবে a[b]। লোক, আপনার বর্গাকার বন্ধনী উদ্ধৃত করুন।
ক্লেক

(স্পষ্টতার জন্য: আমি উদ্ধৃতিটি দিই (মূল উত্তরটি পরিষ্কার হয়ে গেছে, যেখানে আমি উদ্ধৃতি দেওয়ার জন্য চাপ দিচ্ছিলাম)), এবং এটি একটি দিক-অবরুদ্ধ যা আমি সম্বোধন করছি। এই দাবিটি আমাকে অবাক করেছিল, তাই আমি এটি পরীক্ষা করে দেখলাম। এটি zsh বা বাশে সত্য নয়, তবে BSD / bin / sh এ সত্য। এটি পসিক্সের বিরোধী এবং মানহীন আচরণ, তাই এটি পরিচালনা করার জন্য আপনাকে উদ্ধৃতি দিতে হবে। Zsh এ, আপনি setopt glob_assignএই আচরণটি সক্ষম করতেও পারেন , সুতরাং উদ্ধৃতি দেওয়া সবচেয়ে নিরাপদ উত্তর।
ফিল পি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.