একক উদ্ধৃত স্ট্রিংয়ের মধ্যে কীভাবে একক উদ্ধৃতি থেকে রক্ষা পাওয়া যায়


1015

ধরা যাক, আপনার aliasমতো বাশ রয়েছে:

alias rxvt='urxvt'

যা ভাল কাজ করে।

যাহোক:

alias rxvt='urxvt -fg '#111111' -bg '#111111''

কাজ করবে না, এবং করবে না:

alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''

আপনি যখন উদ্ধৃতিগুলি রক্ষা পেয়েছেন তখন আপনি স্ট্রিংয়ের ভিতরে খোলার এবং সমাপ্ত কোটগুলির সমাপ্তি কীভাবে করবেন?

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''

কুরুচিপূর্ণ বলে মনে হচ্ছে যদিও এটি যদি একই স্ট্রিংকে উপস্থাপন করে তবে আপনি যদি তাদের মতো করে মনোযোগ দেওয়ার অনুমতি পান।


16
আপনি কি বুঝতে পেরেছেন যে আপনার নিজের নামের জন্য একক উদ্ধৃতি ব্যবহার করার দরকার নেই? ডাবল উদ্ধৃতি অনেক সহজ।
টেকনোপল


3
নেস্টেড ডাবল কোটগুলি পালাতে পারা যায়, "\""তাই যখনই সম্ভব সম্ভব @ লিওরির উত্তরের পক্ষে এগুলি ব্যবহার করা উচিত।
অ্যালান

7
ডাবল কোটগুলি * নিক্সের একক উদ্ধৃতি (ব্যাস সহ এবং পার্লের মতো সম্পর্কিত সরঞ্জামগুলি) থেকে একেবারেই আলাদা আচরণ করে, সুতরাং যখনই একক উদ্ধৃতিতে কোনও সমস্যা হয় তখন ডাবল কোট স্থাপন করা ভাল সমাধান নয়। ডাবল উদ্ধৃতিগুলি নির্দিষ্ট করে execution ... ভেরিয়েবলগুলি কার্যকর করার আগে প্রতিস্থাপন করা হয়, যখন একক উদ্ধৃতিগুলি $ ... নির্দিষ্ট করে আক্ষরিকভাবে চিকিত্সা করা উচিত।
চক কলার্স

যদি আপনি ভাবছেন, আমি ডাবল উদ্ধৃতি ব্যবহার করেছি তবে এটি এখনও কাজ করছে না , আবার আপনার স্ক্রিপ্টের উত্স।
সামি বেঞ্চেরিফ

উত্তর:


1452

আপনি যদি সত্যিই বাইরেরতম স্তরের একক উক্তি ব্যবহার করতে চান তবে মনে রাখবেন যে আপনি উভয় প্রকারের উদ্ধৃতিকে আঠালো করে রাখতে পারেন। উদাহরণ:

 alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
 #                     ^^^^^       ^^^^^     ^^^^^       ^^^^
 #                     12345       12345     12345       1234

'"'"'ঠিক যেমন ব্যাখ্যা করা হয় তার ব্যাখ্যা ':

  1. ' প্রথম কোটেশন শেষ করুন যা একক উদ্ধৃতি ব্যবহার করে।
  2. " ডাবল-কোট ব্যবহার করে দ্বিতীয় উদ্ধৃতি শুরু করুন।
  3. ' উদ্ধৃত চরিত্র।
  4. " ডাবল-কোট ব্যবহার করে দ্বিতীয় উদ্ধৃতি শেষ করুন।
  5. ' একক উদ্ধৃতি ব্যবহার করে তৃতীয় উদ্ধৃতি শুরু করুন।

আপনি যদি (1) এবং (2), বা (4) এবং (5) এর মধ্যে কোনও শ্বেত স্পেস স্থাপন না করেন, শেলটি সেই স্ট্রিংটিকে একটি দীর্ঘ শব্দ হিসাবে ব্যাখ্যা করবে।


5
alias splitpath='echo $PATH | awk -F : '"'"'{print "PATH is set to"} {for (i=1;i<=NF;i++) {print "["i"]",$i}}'"'"এটি উবার স্ট্রিংয়ে উভয় একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি থাকলে এটি কাজ করে!
চলাচল_ কি 1

17
আমার ব্যাখ্যা: বাশ সুস্পষ্টভাবে পৃথকভাবে উদ্ধৃত স্ট্রিং এক্সপ্রেশনকে সম্মিলিত করে।
বেনিয়ামিন আতকিন

2
আমার পক্ষে কাজ করেছেন, ডাবল পলাতক একক উদ্ধৃতি উদাহরণ:alias serve_this_dir='ruby -rrack -e "include Rack;Handler::Thin.run Builder.new{run Directory.new'"'"''"'"'}"'
জামেস্টোনেকো

2
অবশ্যই সর্বাধিক পঠনযোগ্য সমাধান নয়। এটি একক কোটগুলিকে অতিরিক্ত ব্যবহার করে যেখানে তাদের সত্যই প্রয়োজন হয় না।
ওবরলিস

26
আমি প্রার্থনা করি যে '\''তুলনায় বেশিরভাগ প্রসঙ্গে এটি আরও বেশি পঠনযোগ্য '"'"'। প্রকৃতপক্ষে, পূর্ববর্তীটি প্রায়শই স্পষ্টভাবে একক-উদ্ধৃত স্ট্রিংয়ের মধ্যে স্বতন্ত্র এবং এইভাবে এটি "এটি একটি পালিয়ে যাওয়া উক্তি" অর্থের সাথে অর্থ ম্যাপিংয়ের অর্থ, যেমনটি \"ডাবল-কোটেড স্ট্রিংয়ের সাথে হয়। যদিও উত্তরোত্তরগুলি কোট টিকের এক লাইনে মিশে যায় এবং সঠিকভাবে পার্থক্য করার জন্য অনেক ক্ষেত্রে সতর্কতার সাথে পরিদর্শন করা প্রয়োজন needs
mtraceur

263

আমি সবসময় কেবল প্রতিটি এম্বেড করা একক উদ্ধৃতিটিকে সিকোয়েন্সের সাথে প্রতিস্থাপন করি: '\''(এটি: কোট ব্যাকস্ল্যাশ উদ্ধৃতি উদ্ধৃতি) যা স্ট্রিংটি বন্ধ করে, একটি পালিয়ে যাওয়া একক উদ্ধৃতি সংযোজন করে স্ট্রিংটি আবার খোলে।


আমার প্রায়শই এটি করার জন্য আমি প্রায়শই আমার পার্ল স্ক্রিপ্টগুলিতে একটি "কোটাইফাই" ফাংশনটি হুইপ করি। পদক্ষেপগুলি হবে:

s/'/'\\''/g    # Handle each embedded quote
$_ = qq['$_']; # Surround result with single quotes.

এটি বেশিরভাগ ক্ষেত্রেই যত্ন নেয়।

আপনি যখন evalশেল-স্ক্রিপ্টগুলিতে প্রবেশ করান তখন জীবন আরও মজা পায় । আপনাকে অবশ্যই পুনরায় সমস্ত কিছু আবার উদ্ধৃত করতে হবে!

উদাহরণস্বরূপ, উপরের বিবৃতি সম্বলিত কোটিফাই নামে একটি পার্ল স্ক্রিপ্ট তৈরি করুন:

#!/usr/bin/perl -pl
s/'/'\\''/g;
$_ = qq['$_'];

তারপরে সঠিকভাবে উদ্ধৃত স্ট্রিং উত্পন্ন করতে এটি ব্যবহার করুন:

$ quotify
urxvt -fg '#111111' -bg '#111111'

ফলাফল:

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

যার পরে অনুলিপি কমান্ডে অনুলিপি / আটকানো যাবে:

alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

(যদি আপনাকে কোনও কমান্ডটি evোকাতে হয়,

 $ quotify
 alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

ফলাফল:

'alias rxvt='\''urxvt -fg '\''\'\'''\''#111111'\''\'\'''\'' -bg '\''\'\'''\''#111111'\''\'\'''\'''\'''

যা অনুলিপি / অনুলিপি করা যায়:

eval 'alias rxvt='\''urxvt -fg '\''\'\'''\''#111111'\''\'\'''\'' -bg '\''\'\'''\''#111111'\''\'\'''\'''\'''

1
তবে এটা ভ্রান্ত নয়। স্টিভ বি উপরে উল্লিখিত হিসাবে, "gnu রেফারেন্স ম্যানুয়াল" তার উল্লেখ সহ, আপনি একই ধরণের উদ্ধৃতিতে বাশ উদ্ধৃতি এড়াতে পারবেন না। এবং প্রকৃতপক্ষে, বিকল্প উদ্ধৃতিগুলির মধ্যে এগুলি এড়াতে হবে না, যেমন "" "একটি বৈধ একক-উদ্ধৃতি স্ট্রিং এবং '"' কোনও অব্যাহতি ছাড়াই বৈধ ডাবল-উদ্ধৃতি স্ট্রিং
নিকোরোবট

8
@ নীরবোট: আমি একটি উদাহরণ যুক্ত করে দেখিয়েছি যে: 1) আমি একই ধরণের উদ্ধৃতিতে উদ্ধৃতিগুলি রক্ষা করার চেষ্টা করি না, ২) অথবা বিকল্প উদ্ধৃতিগুলিতেও নেই, এবং 3) পার্ল একটি বৈধ উত্পাদন প্রক্রিয়া স্বয়ংক্রিয় করতে ব্যবহৃত হয় ইম্যাশড কোটে কনট্রাক করে বাশ স্ট্রিং
অ্যাড্রিয়ান প্রানক

18
নিজেই প্রথম অনুচ্ছেদটি আমি উত্তরটি খুঁজছিলাম।
ডেভ কজেই

9
এই ব্যাশ পাশাপাশি টাইপ নেই set -xএবং echo "here's a string"এবং আপনি সেই ব্যাশ, executes দেখতে পাবেন echo 'here'\''s a string'। ( set +xস্বাভাবিক আচরণ ফিরে আসতে)
arekolek

195

যেহেতু বাশ ২.০৪ সিনট্যাক্স $'string'(ন্যায়বিচারের পরিবর্তে 'string'; সতর্কতার পরিবর্তে : বিভ্রান্ত করবেন না $('string')) হ'ল আরেকটি উদ্ধৃতি ব্যবস্থা যা এএনএসআই সি-এর মতো পালানোর সিকোয়েন্সগুলি অনুমতি দেয় এবং একক-উদ্ধৃত সংস্করণে প্রসারিত করতে পারে।

সাধারণ উদাহরণ:

  $> echo $'aa\'bb'
  aa'bb

  $> alias myvar=$'aa\'bb'
  $> alias myvar
  alias myvar='aa'\''bb'

আপনার ক্ষেত্রে:

$> alias rxvt=$'urxvt -fg \'#111111\' -bg \'#111111\''
$> alias rxvt
alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

সাধারণ পালানোর ক্রমগুলি প্রত্যাশা অনুযায়ী কাজ করে:

\'     single quote
\"     double quote
\\     backslash
\n     new line
\t     horizontal tab
\r     carriage return

নীচে কপির সাথে সম্পর্কিত সম্পর্কিত ডকুমেন্টেশন man bash(সংস্করণ 4.4) দেওয়া হয়েছে:

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

    \a     alert (bell)
    \b     backspace
    \e
    \E     an escape character
    \f     form feed
    \n     new line
    \r     carriage return
    \t     horizontal tab
    \v     vertical tab
    \\     backslash
    \'     single quote
    \"     double quote
    \?     question mark
    \nnn   the eight-bit character whose value is the octal 
           value nnn (one to three digits)
    \xHH   the eight-bit character whose value is the hexadecimal
           value HH (one or two hex digits)
    \uHHHH the Unicode (ISO/IEC 10646) character whose value is 
           the hexadecimal value HHHH (one to four hex digits)
    \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value 
               is the hexadecimal value HHHHHHHH (one to eight 
               hex digits)
    \cx    a control-x character

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


দেখুন কোট এবং পলায়নের: ANSI সি স্ট্রিং মত bash-hackers.org উইকি আরও বিশদের জন্য। এছাড়াও নোট করুন যে "বাশ পরিবর্তনসমূহ" ফাইল ( এখানে ওভারভিউ ) $'string'উদ্ধৃতি ব্যবস্থার সাথে সম্পর্কিত পরিবর্তন এবং বাগ ফিক্সগুলির জন্য অনেক উল্লেখ করেছে ।

Unix.stackexchange.com অনুসারে কীভাবে একটি বিশেষ চরিত্রটিকে সাধারণ চরিত্র হিসাবে ব্যবহার করবেন? এটি ব্যাশ, zsh, mksh, ksh93 এবং ফ্রিবিএসডি এবং ব্যস্তবক্সে sh (কিছু পরিবর্তনের সাথে) কাজ করা উচিত।


ব্যবহার করা যেতে পারে তবে এখানে একক উদ্ধৃত স্ট্রিংটি সত্যিকারের একক উদ্ধৃত এক নয়, এই স্ট্রিংয়ের সামগ্রীটি শেল দ্বারা ইন্টারপ্রেস হতে পারে: echo $'foo\'b!ar'=> !ar': event not found
রেজিলিও

2
আমার মেশিনে > echo $BASH_VERSION 4.2.47(1)-release > echo $'foo\'b!ar' foo'b!ar
mj41

1
হ্যাঁ, এটি "মে" এর কারণ, আমার এটি একটি রেড টুপি 6.4 এ ছিল, অবশ্যই এটি একটি পুরানো বাশ সংস্করণ।
রেজিলিও

বাশ চেঞ্জলগের সাথে সম্পর্কিত প্রচুর বাগ সংশোধন রয়েছে $'তাই সম্ভবত সবচেয়ে সহজ উপায় হ'ল এটি নিজেকে পুরানো সিস্টেমে চেষ্টা করা।
এমজে 41

সচেতন থাকুন: tiswww.case.edu/php/chet/bash/CHANGESe. Bash no longer inhibits C-style escape processing ($'...') while performing pattern substitution word expansions. থেকে নেওয়া । এখনও 4.3.42 এ কাজ করে তবে 4.3.48 এ নয় 8
stiller_leser

49

আমি তার ব্লগে এন্ট্রিটি দেখতে পাচ্ছি না (লিঙ্ক প্লেস?) তবে gnu রেফারেন্স ম্যানুয়াল অনুসারে :

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

সুতরাং বাশ বুঝতে পারবেন না:

alias x='y \'z '

যাইহোক, আপনি যদি ডাবল উদ্ধৃতি দিয়ে ঘিরে থাকেন তবে আপনি এটি করতে পারেন:

alias x="echo \'y "
> x
> 'y


ডাবল উদ্ধৃতিতে অন্তর্ভুক্ত সামগ্রীগুলি মূল্যায়ন করা হচ্ছে সুতরাং লাইওরির পরামর্শ অনুসারে ডাবল উদ্ধৃতিতে কেবল একক উদ্ধৃতি আবদ্ধ করা যথাযথ সমাধান বলে মনে হচ্ছে।
পাইওটর ডব্রোগস্ট

3
এটিই প্রশ্নের আসল উত্তর। যদিও গৃহীত উত্তর একটি সমাধান সরবরাহ করতে পারে, এটি প্রযুক্তিগতভাবে এমন প্রশ্নের উত্তর দিচ্ছে যা জিজ্ঞাসা করা হয়নি।
ম্যাথু জি

3
ম্যাথিউ, প্রশ্নটি ছিল একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতিগুলি রক্ষা করার বিষয়ে। এই উত্তরটি ব্যবহারকারীকে তাদের আচরণ পরিবর্তন করতে বলে, এবং যদি আপনার দ্বিগুণ উদ্ধৃতি ব্যবহার করতে বাধা থাকে (যেমন প্রশ্নের শিরোনাম অনুসারে), এই উত্তরটি সাহায্য করবে না। এটি যদিও বেশ কার্যকর (যদিও তা সুস্পষ্ট), এবং যেমন একটি উত্সাহের দাবিদার, তবে গৃহীত উত্তরটি ওপি সম্পর্কে সুনির্দিষ্ট সমস্যার সমাধান করেছে।
ফার্নান্দো কর্ডেরিও

ডাবল উদ্ধৃতি স্ট্রিংয়ে একক উদ্ধৃতি উদ্ধৃত করার দরকার নেই।
ম্যাথু ডি। শোলফিল্ড

32

আমি নিশ্চিত করতে পারি যে '\''একক উদ্ধৃতিযুক্ত স্ট্রিংয়ের অভ্যন্তরে একক উদ্ধৃতি ব্যবহার করা বাশের ক্ষেত্রে কাজ করে, এবং এটি থ্রেডের আগের থেকে "আঠালো" যুক্তি হিসাবে একইভাবে ব্যাখ্যা করা যেতে পারে। ধরুন আমাদের কাছে একটি উদ্ধৃত স্ট্রিং রয়েছে: 'A '\''B'\'' C'(এখানে সমস্ত উদ্ধৃতি একক উদ্ধৃতি)। এটা প্রতিধ্বনি প্রেরণ করা, তবে এটিতে নিম্নোক্ত ছাপে: A 'B' C। প্রত্যেকটিতে '\''প্রথম উদ্ধৃতিটি বর্তমান একক-উদ্ধৃত স্ট্রিংটি বন্ধ করে দেয়, নিম্নলিখিত স্ট্রিংয়ের জন্য নিম্নোক্ত \'একক উদ্ধৃতিটিকে আটকানো হয় ( \'উদ্ধৃত স্ট্রিংটি শুরু না করেই একক উদ্ধৃতি নির্দিষ্ট করার উপায়) এবং শেষ উদ্ধৃতিটি অন্য একক-উদ্ধৃত স্ট্রিংটি খোলে।


2
এটি বিভ্রান্তিকর, এই বাক্য গঠন '\' 'একক উদ্ধৃত স্ট্রিং "ভিতরে" যায় না। এই বিবৃতিতে 'এ' '' 'বি' '' 'সি' আপনি 5 \ অব্যাহতি এবং একক উদ্ধৃতি স্ট্রিংগুলি আলোচনা করছেন
টেকনোপল

1
@ টেকনোপল অ্যাসাইনমেন্টটি একটি একক স্ট্রিং হওয়ার alias something='A '\''B'\'' C'ফলস্বরূপ something, সুতরাং যদিও কার্যভারের ডান হাতটি প্রযুক্তিগতভাবে কোনও একক স্ট্রিং নয়, তবে আমি এটি খুব বেশি গুরুত্বপূর্ণ বলে মনে করি না।
তিমু লেইস্তি

এই আপনার উদাহরণে কাজ করে, তাই নয় কি টেকনিক্যালি কিভাবে একটি একক উদ্ধৃতি ঢোকানোর জন্য একটি সমাধান প্রদানের ভিতরে একটি একক উদ্ধৃত পংক্তি। আপনি ইতিমধ্যে এটি ব্যাখ্যা করেছেন, তবে হ্যাঁ এটি করছে 'A ' + ' + 'B' + ' + ' C'। অন্য কথায়, একটি একক-উদ্ধৃত স্ট্রিংয়ের ভিতরে একক উদ্ধৃতি অক্ষর সন্নিবেশ করার জন্য একটি সমাধান আমাকে নিজেই একটি স্ট্রিং তৈরি করতে এবং এটি মুদ্রণের অনুমতি দেয়। তবে এই সমাধানটি এই ক্ষেত্রে কাজ করবে না। STR='\''; echo $STR। নকশা হিসাবে, BASH সত্যই এটি অনুমতি দেয় না।
krb686

@ মিখাইল_ বি, হ্যাঁ, বাশের '\''পক্ষে কাজ করে। আপনি gnu.org/software/bash/manual/bashref.html এর কোন বিভাগটি এমন আচরণকে নির্দিষ্ট করতে পারেন?
জিংগুও ইয়াও

20

উভয় সংস্করণ কাজ করে, হয় পালিয়ে যাওয়া একক উদ্ধৃতি চরিত্র (\ ') ব্যবহার করে বা একক উদ্ধৃতি অক্ষরকে ডাবল উদ্ধৃতি ("" ") দ্বারা সংযুক্ত করে কনট্যাকটেশন দিয়ে।

প্রশ্নের লেখক লক্ষ্য করেন নি যে তার শেষ পালানোর চেষ্টা শেষে একটি অতিরিক্ত একক উদ্ধৃতি (') ছিল:

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
           │         │┊┊|       │┊┊│     │┊┊│       │┊┊│
           └─STRING──┘┊┊└─STRIN─┘┊┊└─STR─┘┊┊└─STRIN─┘┊┊│
                      ┊┊         ┊┊       ┊┊         ┊┊│
                      ┊┊         ┊┊       ┊┊         ┊┊│
                      └┴─────────┴┴───┰───┴┴─────────┴┘│
                          All escaped single quotes    │
                                                       │
                                                       ?

আপনি যেমনটি ASCII / ইউনিকোড আর্টের আগের সুন্দর অংশটিতে দেখতে পাচ্ছেন, সর্বশেষ পালানো একক উদ্ধৃতি (\ ') এর পরে একটি অপ্রয়োজনীয় একক উদ্ধৃতি (') আসে। নোটপ্যাড ++ এর মতো একটি সিনট্যাক্স-হাইলাইটার ব্যবহার করা খুব সহায়ক প্রমাণ করতে পারে।

নিম্নলিখিত উদাহরণের মতো অন্য উদাহরণের ক্ষেত্রেও এটি একই:

alias rc='sed '"'"':a;N;$!ba;s/\n/, /g'"'"
alias rc='sed '\'':a;N;$!ba;s/\n/, /g'\'

উপকরণের এই দুটি সুন্দর দৃষ্টান্ত একটি ফাইলকে কীভাবে আটকানো যায় তা খুব জটিল এবং আবদ্ধ উপায়ে দেখায়। এটি হ'ল প্রচুর লাইনযুক্ত একটি ফাইল থেকে আপনি আগের রেখার বিষয়বস্তুগুলির মধ্যে কমা এবং ফাঁকা স্থানের সাথে কেবল একটি লাইন পান get পূর্ববর্তী মন্তব্যটি বোঝার জন্য, নিম্নলিখিতটি একটি উদাহরণ:

$ cat Little_Commas.TXT
201737194
201802699
201835214

$ rc Little_Commas.TXT
201737194, 201802699, 201835214

3
ASCII সারণী চিত্রের জন্য উত্সাহিত :)
php-dev

16

শেলের মধ্যে উদ্ধৃতি অবলম্বনের সহজ উদাহরণ:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

এটি ইতিমধ্যে একটি খোলার শেষ করে শেষ হয়েছে ( '), একজনকে পালিয়ে ( \') রেখে , তারপর অন্যটি ( ) খুলুন '। এই সিনট্যাক্সটি সমস্ত কমান্ডের জন্য কাজ করে। এটি প্রথম উত্তরটির সাথে খুব অনুরূপ পন্থা।


15

আমি উদ্ধৃত ইস্যুটিকে বিশেষভাবে সম্বোধন করছি না কারণ ভাল, কখনও কখনও বিকল্প পদ্ধতির বিষয়টি বিবেচনা করা ঠিক যুক্তিযুক্ত।

rxvt() { urxvt -fg "#${1:-000000}" -bg "#${2:-FFFFFF}"; }

যা আপনি এরপরে কল করতে পারেন:

rxvt 123456 654321

ধারণাটি হ'ল আপনি এখন উক্তিটি ব্যতিরেকে উদ্বেগ ছাড়াই এটিকে উপনাম করতে পারেন:

alias rxvt='rxvt 123456 654321'

বা, যদি #কোনও কারণে আপনাকে সমস্ত কলগুলিতে অন্তর্ভুক্ত করতে হয়:

rxvt() { urxvt -fg "${1:-#000000}" -bg "${2:-#FFFFFF}"; }

যা আপনি এরপরে কল করতে পারেন:

rxvt '#123456' '#654321'

তাহলে অবশ্যই একটি উপনাম হ'ল:

alias rxvt="rxvt '#123456' '#654321'"

(ওফস, আমি অনুমান করি যে আমি এক প্রকারের উদ্ধৃতিটিকে সম্বোধন করেছি)


1
আমি একক উদ্ধৃতিতে এমন কিছু রাখার চেষ্টা করছিলাম যা ডাবল কোটে ছিল যা পরিবর্তিতভাবে একক উদ্ধৃতিতে ছিল। বাবা। "একটি ভিন্ন পদ্ধতির চেষ্টা করুন" এর উত্তরের জন্য আপনাকে ধন্যবাদ। যে পার্থক্য তৈরি।
ক্লিন্টন ব্ল্যাকমোর

1
আমি 5 বছর দেরী করে ফেলেছি, কিন্তু আপনি কি আপনার শেষ উপন্যাসের একটি উদ্ধৃতি মিস করছেন না?
জুলিয়েন

1
@ জুলিয়েন আমি কোনও সমস্যা দেখতে পাচ্ছি না ;-)
নিকেরোবট

11

যেহেতু কেউ একক উদ্ধৃত স্ট্রিংয়ের মধ্যে একক উদ্ধৃতি রাখতে পারে না, তাই সবচেয়ে সহজ এবং সর্বাধিক পঠনযোগ্য বিকল্পটি হেরডোক স্ট্রিং ব্যবহার করা হয়

command=$(cat <<'COMMAND'
urxvt -fg '#111111' -bg '#111111'
COMMAND
)

alias rxvt=$command

উপরের কোডে, HEREDOC catকমান্ডে প্রেরণ করা হয় এবং এর আউটপুট একটি পরিবর্তনশীলকে কমান্ড প্রতিস্থাপন স্বরলিপি দ্বারা নির্ধারিত হয়$(..)

হেরডোকের চারপাশে একক উক্তি স্থাপন করা প্রয়োজন কারণ এটি একটির মধ্যে রয়েছে within $()


আমি আশা করি আমি আগে এটিকে স্ক্রোল করে রেখেছি - আমি এই পদ্ধতির পুনর্নবীকরণ এবং এটি পোস্ট করতে এখানে এসেছি! এটি অন্যান্য পরিষ্কারের সমস্ত পদ্ধতির চেয়ে অনেক পরিষ্কার এবং আরও পঠনযোগ্য। এটি কিছু নন-ব্যাশ শেলগুলিতে কাজ করবে না যেমন dashউবুন্টু আপস্টার্ট স্ক্রিপ্ট এবং অন্য কোথাও ডিফল্ট শেল।
কর্নি

ধন্যবাদ! যেটা আমি চেয়েছিলাম, কমান্ডকে হেরডোকের মাধ্যমে সংজ্ঞায়িত করার উপায় এবং অটো পলায়ন কমান্ডকে ssh এ পাস করার উপায়। বিটিডাব্লু বিড়াল << কমেন্ট ব্যতীত কম্যান্ড কমান্ডের অভ্যন্তরে ভেরিয়েবলগুলি বিভক্ত করতে দেয় এবং এই পদ্ধতির জন্য কাজ করে।
ইগোর টেরদোভস্কি

10

আমি কেবল শেল কোডগুলি ব্যবহার করি .. যেমন \x27বা \\x22প্রযোজ্য হিসাবে। কোন ঝামেলা নেই, সত্যিই।


আপনি কি এটির একটি উদাহরণ চালু করতে পারেন? আমার জন্য এটি কেবল একটি আক্ষরিক মুদ্রণ করে x27(সেন্টোস 6.6 এ)
শেপার্ড

6

এই উত্তরগুলির বেশিরভাগটি আপনি যে নির্দিষ্ট ক্ষেত্রে জিজ্ঞাসা করছেন তাতে আঘাত করে। একটা সাধারণ পদ্ধতির এক বন্ধুর কাছে এবং আমি গড়ে তুলেছে যে অবাধ ক্ষেত্রে উদ্ধৃত আপনার যা দরকার জন্য করতে পারবেন করার উদ্ধৃতি ব্যাশ কমান্ড শেল সম্প্রসারণ, যেমন একাধিক স্তরের, SSH মাধ্যমে মাধ্যমে su -c, bash -cইত্যাদি এক কোটি আদিম আপনার যা দরকার, এখানে নেই নেটিভ ব্যাশে:

quote_args() {
    local sq="'"
    local dq='"'
    local space=""
    local arg
    for arg; do
        echo -n "$space'${arg//$sq/$sq$dq$sq$dq$sq}'"
        space=" "
    done
}

এটি যা বলেছে ঠিক এটি করে: এটি প্রতিটি যুক্তি পৃথকভাবে শেল-কোট করে (অবশ্যই বাশ প্রসারণের পরে):

$ quote_args foo bar
'foo' 'bar'
$ quote_args arg1 'arg2 arg2a' arg3
'arg1' 'arg2 arg2a' 'arg3'
$ quote_args dq'"'
'dq"'
$ quote_args dq'"' sq"'"
'dq"' 'sq'"'"''
$ quote_args "*"
'*'
$ quote_args /b*
'/bin' '/boot'

এটি এক স্তরের সম্প্রসারণের জন্য সুস্পষ্ট কাজটি করে:

$ bash -c "$(quote_args echo a'"'b"'"c arg2)"
a"b'c arg2

(দ্রষ্টব্য যে চারপাশে দ্বৈত উদ্ধৃতিগুলি $(quote_args ...)একক যুক্তিতে ফলাফল তৈরি করার জন্য প্রয়োজনীয় bash -c)) এবং এটি প্রসারণের একাধিক স্তরগুলির মাধ্যমে সঠিকভাবে উদ্ধৃতি দেওয়ার জন্য আরও সাধারণভাবে ব্যবহার করা যেতে পারে:

$ bash -c "$(quote_args bash -c "$(quote_args echo a'"'b"'"c arg2)")"
a"b'c arg2

উপরের উদাহরণ:

  1. প্রতিটি আর্গুমেন্টকে শেল- quote_argsস্বতন্ত্রভাবে কোট করে কোট করে এবং তারপরে ফলাফলটি আউটপুটটিকে একক যুক্তিতে অভ্যন্তরীণ ডাবল উদ্ধৃতিগুলির সাথে একত্রিত করে।
  2. শেল-কোট bash, -c, এবং ধাপে 1 থেকে ইতিমধ্যে একসময়ের উদ্ধৃত ফলাফলের করুন, এবং তারপর বাইরের উদ্ধৃতি চিহ্ন সঙ্গে একটি একক যুক্তি মধ্যে ফলাফলের সম্মিলন।
  3. বাইরের থেকে আর্গুমেন্ট হিসাবে যে জগাখিচুড়ি পাঠায় bash -c

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

$ (cd /tmp; bash -c "$(quote_args cd /; pwd 1>&2)")
/tmp
$ (cd /tmp; bash -c "$(quote_args cd /; [ -e *sbin ] && echo success 1>&2 || echo failure 1>&2)")
failure

প্রথম উদাহরণে, ব্যাশটি তত্ক্ষণাত quote_args cd /; pwd 1>&2দুটি পৃথক কমান্ডে প্রসারিত হয় quote_args cd /এবং pwd 1>&2তাই কমান্ডটি কার্যকর /tmpহওয়ার পরে CWD এখনও থাকে pwd। দ্বিতীয় উদাহরণটি গ্লোব্বিংয়ের জন্য একই ধরণের সমস্যার চিত্র তুলে ধরে। প্রকৃতপক্ষে, সমস্ত ব্যাশ বিস্তারে একই বুনিয়াদি সমস্যা দেখা দেয়। এখানে সমস্যাটি হ'ল কমান্ড প্রতিস্থাপনটি কোনও ফাংশন কল নয়: এটি আক্ষরিকভাবে একটি ব্যাশ স্ক্রিপ্টকে মূল্যায়ন করে এবং এর আউটপুটটিকে অন্য ব্যাশ স্ক্রিপ্টের অংশ হিসাবে ব্যবহার করে।

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

$ (cd /tmp; echo "$(quote_args cd /\; pwd 1\>\&2)")
'cd' '/;' 'pwd' '1>&2'
$ (cd /tmp; echo "$(quote_args cd /\; \[ -e \*sbin \] \&\& echo success 1\>\&2 \|\| echo failure 1\>\&2)")
'cd' '/;' '[' '-e' '*sbin' ']' '&&' 'echo' 'success' '1>&2' '||' 'echo' 'failure' '1>&2'

এখানে সমস্যা হ'ল আপনি অতিরিক্ত উদ্ধৃতি দিচ্ছেন। অপারেটরদের এনকোলেটিংয়ের ইনপুট হিসাবে অকেজো হওয়া bash -cমানে যা আপনার প্রয়োজন তা হ'ল $(quote_args ...)কমান্ড প্রতিস্থাপনের বাইরে থাকা ।

ফলস্বরূপ, আপনাকে সবচেয়ে সাধারণ অর্থে যা করতে হবে তা হ'ল কমান্ডের প্রতিটি শব্দ পৃথকভাবে কমান্ড প্রতিস্থাপনের সময় প্রসারিত করার উদ্দেশ্যে নয়, এবং শেল অপারেটরদের জন্য কোনও অতিরিক্ত উদ্ধৃতি প্রয়োগ না করা:

$ (cd /tmp; echo "$(quote_args cd /); $(quote_args pwd) 1>&2")
'cd' '/'; 'pwd' 1>&2
$ (cd /tmp; bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")
/
$ (cd /tmp; echo "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")
'cd' '/'; [ -e *'sbin' ] && 'echo' 'success' 1>&2 || 'echo' 'failure' 1>&2
$ (cd /tmp; bash -c "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")
success

একবার এটি হয়ে গেলে, সম্পূর্ণ স্ট্রিংটি মূল্যায়নের স্বেচ্ছাসেবী স্তরের উদ্ধৃতি দেওয়ার জন্য ন্যায্য খেলা:

$ bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")"
/
$ bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")")"
/
$ bash -c "$(quote_args bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")")")"
/
$ bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")"
success
$ bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); [ -e *sbin ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")")"
success
$ bash -c "$(quote_args bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")")")"
success

প্রভৃতি

এই উদাহরণগুলি অতিমাত্রায় উত্তেজিত দেওয়া মনে হতে পারে যে শব্দ পছন্দ success, sbinএবং pwdশেল-উদ্ধৃত করা প্রয়োজন হবে না, কিন্তু মূল বিষয়টা যখন একটি স্ক্রিপ্ট নির্বিচারে ইনপুট গ্রহণ লেখার মনে রাখা উচিত যে আপনি সবকিছু আপনি একেবারে নিশ্চিত না হন উদ্ধৃত করা চাই ফেলে না ' টি उद्धृत করা দরকার, কারণ আপনি কখনই বুঝতে পারবেন না যে কখন ব্যবহারকারী একটি এ ফেলবে Robert'; rm -rf /

কভারগুলির আওতায় কী চলছে তা আরও ভালভাবে বুঝতে, আপনি দুটি ছোট সহায়িকার কার্যকারিতা নিয়ে খেলতে পারেন:

debug_args() {
    for (( I=1; $I <= $#; I++ )); do
        echo -n "$I:<${!I}> " 1>&2
    done
    echo 1>&2
}

debug_args_and_run() {
    debug_args "$@"
    "$@"
}

এটি প্রতিটি আর্গুমেন্ট কার্যকর করার আগে একটি আদেশে গণনা করবে:

$ debug_args_and_run echo a'"'b"'"c arg2
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)"
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)")"
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'echo' 'a"b'"'"'c' 'arg2'> 
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)")")"
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'bash' '-c' ''"'"'debug_args_and_run'"'"' '"'"'echo'"'"' '"'"'a"b'"'"'"'"'"'"'"'"'c'"'"' '"'"'arg2'"'"''> 
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'echo' 'a"b'"'"'c' 'arg2'> 
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)")")")"
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'bash' '-c' ''"'"'debug_args_and_run'"'"' '"'"'bash'"'"' '"'"'-c'"'"' '"'"''"'"'"'"'"'"'"'"'debug_args_and_run'"'"'"'"'"'"'"'"' '"'"'"'"'"'"'"'"'echo'"'"'"'"'"'"'"'"' '"'"'"'"'"'"'"'"'a"b'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'c'"'"'"'"'"'"'"'"' '"'"'"'"'"'"'"'"'arg2'"'"'"'"'"'"'"'"''"'"''> 
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'bash' '-c' ''"'"'debug_args_and_run'"'"' '"'"'echo'"'"' '"'"'a"b'"'"'"'"'"'"'"'"'c'"'"' '"'"'arg2'"'"''> 
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'echo' 'a"b'"'"'c' 'arg2'> 
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

হাই কাইল আপনার সমাধান একটি মামলা আমার কাছে তা থাকত, যখন আমি একটি একক আর্গুমেন্ট হিসাবে আর্গুমেন্ট একটি গ্রুপ পাস করা প্রয়োজন জন্য কাজ করে মহান: vagrant ssh -c {single-arg} guest{single-arg}কারণ ভবঘুরে অতিথি নামের পরে পরবর্তী ARG লাগে চাহিদা একটি একক ARG হিসাবে গণ্য করা হবে। অর্ডার পরিবর্তন করা যায় না। তবে আমার ভিতরে একটি কমান্ড এবং তার তর্কগুলি পাস করার দরকার ছিল {single-arg}। তাই আমি আপনার ব্যবহৃত quote_args()কমান্ড ও এর args উদ্ধৃত, এবং এর ফলে প্রায় ডবল কোট করা, এবং এটি একটি যাদুমন্ত্র মত কাজ: vagrant ssh -c "'command' 'arg 1 with blanks' 'arg 2'" guest। ধন্যবাদ !!!
Andreas মাইয়ার

6

IMHO আসল উত্তরটি হ'ল আপনি একক-উদ্ধৃতিযুক্ত স্ট্রিংয়ের মধ্যে একক উদ্ধৃতিগুলি এড়াতে পারবেন না।

এটা অসম্ভব.

যদি আমরা অনুমান করি যে আমরা ব্যাশ ব্যবহার করছি।

বাশ ম্যানুয়াল থেকে ...

Enclosing characters in single quotes preserves the literal value of each
character within the quotes.  A single quote may not occur
between single quotes, even when preceded by a backslash.

আপনার অন্য একটি স্ট্রিং অব্যাহত প্রক্রিয়া ব্যবহার করতে হবে "বা \

aliasএটি একক উদ্ধৃতি ব্যবহার করার দাবি করে এমন কোনও জাদু নেই ।

বাশ নিম্নলিখিত দুটি কাজ।

alias rxvt="urxvt -fg '#111111' -bg '#111111'"
alias rxvt=urxvt\ -fg\ \'#111111\'\ -bg\ \'#111111\'

পরেরটি স্থানটির অক্ষর থেকে বাঁচতে using ব্যবহার করছে।

# 111111 সম্পর্কে এমন কোনও জাদু নেই যাগুলির জন্য একক উদ্ধৃতি প্রয়োজন।

নিম্নলিখিত দুটি বিকল্প অপর দুটি বিকল্প একই ফলাফল অর্জন করে, যেটি rxvt ওরফে প্রত্যাশা অনুযায়ী কাজ করে।

alias rxvt='urxvt -fg "#111111" -bg "#111111"'
alias rxvt="urxvt -fg \"#111111\" -bg \"#111111\""

আপনি সরাসরি # ঝামেলা থেকে বাঁচতে পারেন

alias rxvt="urxvt -fg \#111111 -bg \#111111"

"আসল উত্তরটি হ'ল আপনি একক-উদ্ধৃতিযুক্ত স্ট্রিংয়ের মধ্যে একক উদ্ধৃতিগুলি এড়াতে পারবেন না।" প্রযুক্তিগতভাবে এটি সত্য। তবে আপনার এমন একটি সমাধান হতে পারে যা একক উদ্ধৃতি দিয়ে শুরু হয়, একক উদ্ধৃতি দিয়ে শেষ হয় এবং কেবলমাত্র মাঝখানে একক উদ্ধৃতি থাকে। stackoverflow.com/a/49063038
wisbucky

পালানোর দ্বারা নয়, কেবল কনটেন্টেশন দিয়ে।
টেকনোপল

4

প্রদত্ত উদাহরণে বহিরাগত পলায়ন ব্যবস্থা হিসাবে একক উদ্ধৃতিগুলির পরিবর্তে ডাবল উদ্ধৃতিগুলি ব্যবহৃত:

alias rxvt="urxvt -fg '#111111' -bg '#111111'"

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

উদাহরণস্বরূপ, আপনি দেখতে পাবেন যে ডাবল উদ্ধৃতিগুলি স্ট্রিং রক্ষার জন্য যথেষ্ট:

$ echo "urxvt -fg '#111111' -bg '#111111'"
urxvt -fg '#111111' -bg '#111111'

4

স্পষ্টতই, ডাবল উদ্ধৃতি দিয়ে চারপাশে থাকা আরও সহজ হবে, তবে এর মধ্যে চ্যালেঞ্জটি কোথায়? এখানে কেবলমাত্র একক উদ্ধৃতি ব্যবহার করে উত্তর দেওয়া হচ্ছে। আমি পরিবর্তে একটি পরিবর্তনশীল ব্যবহার করছি aliasযাতে প্রমাণের জন্য এটি মুদ্রণ করা সহজ তবে এটি ব্যবহারের মতো alias

$ rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'
$ echo $rxvt
urxvt -fg '#111111' -bg '#111111'

ব্যাখ্যা

মূলটি হ'ল আপনি একক উদ্ধৃতিটি বন্ধ করতে পারেন এবং এটি যতবার খুশি পুনরায় খুলতে পারেন। যেমন foo='a''b'হিসাবে একই foo='ab'। সুতরাং আপনি একক উদ্ধৃতিটি বন্ধ করতে পারেন, আক্ষরিক একক উদ্ধৃতিতে ফেলে দিতে পারেন \', তারপরে পরবর্তী একক উদ্ধৃতিটি আবার খুলতে পারেন।

ব্রেকডাউন ডায়াগ্রাম

একক উদ্ধৃতি কোথায় খোলা এবং বন্ধ আছে তা দেখানোর জন্য এই চিত্রটি বন্ধনী ব্যবহার করে এটি পরিষ্কার করে। বন্ধনী হতে পারে যেমন উদ্ধৃতি "নেস্টেড" নয়। আপনি রঙ হাইলাইটিংয়েও মনোযোগ দিতে পারেন, যা সঠিকভাবে প্রয়োগ করা হয়েছে। উদ্ধৃত স্ট্রিংগুলি মেরুন, অন্যদিকে \'কালো।

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'    # original
[^^^^^^^^^^] ^[^^^^^^^] ^[^^^^^] ^[^^^^^^^] ^    # show open/close quotes
 urxvt -fg   ' #111111  '  -bg   ' #111111  '    # literal characters remaining

(এটি মূলত অ্যাড্রিয়ানদের মতো একই উত্তর, তবে আমি এটি আরও ভাল ব্যাখ্যা করে অনুভব করি Also এছাড়াও তার উত্তরের শেষে দুটি অতিরিক্ত অতিরিক্ত একক উদ্ধৃতি রয়েছে))


+1 '\''পদ্ধতিটি ব্যবহার করার জন্য আমি সেই পদ্ধতির উপরে সুপারিশ করি '"'"'যা মানুষের পক্ষে পড়া প্রায়শই শক্ত।
mtraceur

3

উপরে উল্লিখিত ওয়ান ট্রু উত্তরের একটি বিশদ বিবরণ এখানে দেওয়া হল:

কখনও কখনও আমি এসএসএস-এর মাধ্যমে আরএসসিএনসি ব্যবহার করে ডাউনলোড করব এবং এতে একটি ফাইল নাম রেখে দুই টুকরো টুকরো টুকরো করে পালাতে হবে! (ওএমজি!) একবার ব্যাশের জন্য এবং একবার এসএসএসের জন্য। উদ্ধৃতি ডিলিমেটারগুলি পরিবর্তনের একই নীতিটি এখানে কাজ করছে।

উদাহরণস্বরূপ, আসুন আমরা বলি যে আমরা পেতে চাই: লুই থেরক্সের এলএ স্টোরিজ ...

  1. প্রথমে আপনি ল্যুইস থ্রোক্সকে ব্যাশের জন্য একক উদ্ধৃতিতে এবং এসএসএসের জন্য ডাবল উদ্ধৃতিতে বদ্ধ করবেন: '"লুই থ্রোক্স"'
  2. তারপরে আপনি একটি দ্বিগুণ উদ্ধৃতি '"" এড়াতে একক উদ্ধৃতি ব্যবহার করুন
  3. "" "অ্যাডোস্ট্রোফ" "" এড়ানোর জন্য ডাবল উক্তি ব্যবহার করুন
  4. তারপরে ডাবল উদ্ধৃতি '"' রক্ষা পেতে একক উদ্ধৃতি ব্যবহার করে # 2 পুনরাবৃত্তি করুন
  5. তারপরে এলএ স্টোরিগুলি ব্যাশের জন্য একক উদ্ধৃতিতে এবং এসএসএসের জন্য ডাবল উদ্ধৃতিগুলিতে আবদ্ধ করুন: '"এলএ স্টোরিজ"'

আর দেখুন! আপনি এটি দিয়ে শেষ:

rsync -ave ssh '"Louis Theroux"''"'"'"'"''"s LA Stories"'

যা একটুখানি কাজের জন্য ভয়ঙ্কর কাজ is তবে আপনি সেখানে যান


3
shell_escape () {
    printf '%s' "'${1//\'/\'\\\'\'}'"
}

বাস্তবায়ন ব্যাখ্যা:

  • ডাবল উদ্ধৃতি যাতে আমরা সহজেই একক উদ্ধৃতি মোড়কে আউটপুট দিতে পারি এবং ${...}বাক্য গঠনটি ব্যবহার করতে পারি

  • বাশের অনুসন্ধান এবং প্রতিস্থাপন দেখে মনে হচ্ছে: ${varname//search/replacement}

  • আমরা প্রতিস্থাপন করছেন 'সঙ্গে'\''

  • '\'''যেমন একটি একক এনকোড :

    1. ' একক উদ্ধৃতি শেষ

    2. \'এনকোড একটি '(ব্যাকস্ল্যাশ প্রয়োজন কারণ আমরা উদ্ধৃতিগুলির মধ্যে নেই)

    3. ' আবার একক উদ্ধৃতি শুরু

    4. বাশ স্বয়ংক্রিয়ভাবে এর মধ্যে কোনও সাদা স্থান ছাড়াই স্ট্রিংগুলি সংযুক্ত করে

  • সেখানে একটি ব্যাপার \যে সামনে \এবং 'যে কারণ জন্য পলায়নের নিয়ম এর ${...//.../...}

string="That's "'#@$*&^`(@#'
echo "original: $string"
echo "encoded:  $(shell_escape "$string")"
echo "expanded: $(bash -c "echo $(shell_escape "$string")")"

পিএস সর্বদা একক উদ্ধৃত স্ট্রিংগুলিতে এনকোড করুন কারণ তারা দ্বিগুণ উদ্ধৃত স্ট্রিংয়ের চেয়ে সহজ way


2

নেস্টেড কোটেশন-এর অনেকগুলি স্তরের সমস্যা সমাধানের আর একটি উপায়:

আপনি খুব ছোট একটি জায়গার মধ্যে খুব বেশি ক্র্যাম করার চেষ্টা করছেন, সুতরাং ব্যাশ ফাংশনটি ব্যবহার করুন।

সমস্যাটি হ'ল আপনি অনেকগুলি স্তরের বাসা বাঁধার চেষ্টা করছেন, এবং বেসিক ওরফে প্রযুক্তিটি যথেষ্ট পরিমাণে সামঞ্জস্য করতে পারে না। এটি তৈরি করতে এটির মতো ব্যাশ ফাংশনটি ব্যবহার করুন যাতে একক, ডাবল কোট ব্যাক টিক্স এবং প্যারামিটারগুলিতে পাস করা সমস্ত সাধারণভাবে পরিচালিত হয় যেমনটি আমরা প্রত্যাশা করতাম:

lets_do_some_stuff() {
    tmp=$1                       #keep a passed in parameter.
    run_your_program $@          #use all your passed parameters.
    echo -e '\n-------------'    #use your single quotes.
    echo `date`                  #use your back ticks.
    echo -e "\n-------------"    #use your double quotes.
}
alias foobarbaz=lets_do_some_stuff

তারপরে আপনি আপনার $ 1 এবং $ 2 ভেরিয়েবলগুলি এবং একক, ডাবল কোট এবং পিছনের টিকগুলি ব্যবহার করতে পারেন উচ্ছ্বাসের অখণ্ডতা সম্পর্কে সতর্কতা ছাড়াই about

এই প্রোগ্রামটি মুদ্রণ:

el@defiant ~/code $ foobarbaz alien Dyson ring detected @grid 10385
alien Dyson ring detected @grid 10385
-------------
Mon Oct 26 20:30:14 EDT 2015
-------------

2

আপনার যদি জিএনইউ সমান্তরাল ইনস্টল করা থাকে তবে আপনি এর অভ্যন্তরীণ উদ্ধৃতিগুলি ব্যবহার করতে পারেন:

$ parallel --shellquote
L's 12" record
<Ctrl-D>
'L'"'"'s 12" record'
$ echo 'L'"'"'s 12" record'
L's 12" record

20190222 সংস্করণ থেকে আপনি --shellquoteএকাধিক বার করতে পারেন :

$ parallel --shellquote --shellquote --shellquote
L's 12" record
<Ctrl-D>
'"'"'"'"'"'"'L'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'s 12" record'"'"'"'"'"'"'
$ eval eval echo '"'"'"'"'"'"'L'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'s 12" record'"'"'"'"'"'"'
L's 12" record

এটি সমস্ত সমর্থিত শেলগুলিতে স্ট্রিংটি উদ্ধৃত করবে (কেবল নয় bash)।


1

এই ফাংশন:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

'ভিতরে উদ্ধৃতি দেয় '। এটি হিসাবে ব্যবহার করুন:

$ quote "urxvt -fg '#111111' -bg '#111111'"
'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

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

#!/bin/bash

quote ()
{
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

while read line; do
    quote "$line"
done <<-\_lines_to_quote_
urxvt -fg '#111111' -bg '#111111'
Louis Theroux's LA Stories
'single quote phrase' "double quote phrase"
_lines_to_quote_

আউটপুট দেবে:

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''
'Louis Theroux'\''s LA Stories'
''\''single quote phrase'\'' "double quote phrase"'

একক উদ্ধৃতিতে সমস্ত সঠিকভাবে উদ্ধৃত স্ট্রিং।


1

যদি আপনি পাইথন 2 বা পাইথন 3 এর মধ্যে শেল স্ট্রিং তৈরি করে থাকেন তবে নিম্নলিখিতটি আর্গুমেন্টগুলি উদ্ধৃত করতে সহায়তা করতে পারে:

#!/usr/bin/env python

from __future__ import print_function

try:  # py3
    from shlex import quote as shlex_quote
except ImportError:  # py2
    from pipes import quote as shlex_quote

s = """foo ain't "bad" so there!"""

print(s)
print(" ".join([shlex_quote(t) for t in s.split()]))

এটি আউটপুট দেবে:

foo ain't "bad" so there!
foo 'ain'"'"'t' '"bad"' so 'there!'

1

এখানে আমার দুটি সেন্ট রয়েছে - ক্ষেত্রে যদি কেউ shকেবল-নির্দিষ্টযোগ্য না হয়ে-বহনযোগ্য হতে চায় তবে bash(সমাধানটি খুব কার্যকর নয়, যদিও এটি একটি বাহ্যিক প্রোগ্রাম শুরু করার সাথে সাথে sed):

  • এই রাখা quote.sh(বা শুধু quoteআপনার দিকে) কোথাও PATH:
# এটি স্ট্যান্ডার্ড ইনপুট (স্টিডিন) এর সাথে কাজ করে
উদ্ধৃতি () {
  প্রতিধ্বনি -n "'";
  সেড 's / \ ([' '' '' '] [' '' '' '] * \) /' '' '' '' \ 1 '' '' '' / জি ';
  প্রতিধ্বনি-"" "
}

কেস "$ 1" ইন
 -) উদ্ধৃতি ;;
 *) প্রতিধ্বনি "ব্যবহার: বিড়াল ... | উক্তি - বোর্ন শেল" #> & 1; # একক-উদ্ধৃতি ইনপুট;
esac

একটি উদাহরণ:

cho প্রতিধ্বনি -n "জিডে, সাথী!" | ./ Quote.sh -
'জি' '' '' দিন, সাথী! '

এবং অবশ্যই এটি পুনরায় রূপান্তর করে:

$ প্রতিধ্বনি 'জি' '' '' দিন, সাথী! '
G'day, সাথী!

ব্যাখ্যা: মূলত আমাদের ইনপুটটি কোট দিয়ে আবদ্ধ করতে হবে ', এবং তারপরে এই মাইক্রো-দানবটির সাথে কোনও একক উদ্ধৃতিও প্রতিস্থাপন করতে হবে: '"'"'(জোড়া লাগানোর সাথে উদ্বোধনী উদ্ধৃতিটি শেষ করুন ', ডাবল উদ্ধৃতি দিয়ে মোড়ক দিয়ে পাওয়া একক উদ্ধৃতিটি এড়ান - "'"এবং তারপরে অবশেষে একটি নতুন উদ্বোধনী একক উদ্ধৃতি ', বা ছদ্ম-স্বরলিপি জারি করুন ' + "'" + ' == '"'"':)

এটি করার একটি মানক উপায় sedহ'ল নিম্নলিখিত প্রতিস্থাপন আদেশটি ব্যবহার করা:

s/\(['][']*\)/'"\1"'/g 

তবে একটি ছোট সমস্যা হ'ল শেলটি ব্যবহার করার জন্য একজনকে সেড এক্সপ্রেশনে নিজেই এই সমস্ত একক উদ্ধৃতি অক্ষরগুলি থেকে বাঁচতে হবে - এর মতো কিছুর দিকে নিয়ে যায়?

sed 's/\(['"'"']['"'"']*\)/'"'"'"\1"'"'"'/g' 

(এবং এই ফলাফলটি তৈরির একটি ভাল উপায় হ'ল s/\(['][']*\)/'"\1"'/gকাইল রোজ 'বা জর্জ ভি। রিলির স্ক্রিপ্টগুলিতে মূল ভাবটি খাওয়ানো )।

অবশেষে, এ জাতীয় ইনপুটটি প্রত্যাশিত হওয়া প্রত্যাশা করে তোলে stdin- যেহেতু কমান্ড-লাইন যুক্তির মাধ্যমে এটি পাস করা ইতিমধ্যে খুব বেশি সমস্যা হতে পারে।

(ওহ, এবং আমরা সম্ভবত একটি ছোট সহায়তা বার্তা যুক্ত করতে চাই যাতে স্ক্রিপ্টটি হ্যাং না হয় যখন কেউ কেবল এটি ./quote.sh --helpকী করে তা ভাবতে ভাবতে চালায় ।)


0

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

single_quote() {
  local quoted="'"
  local i=0
  while [ $i -lt ${#1} ]; do
    local ch="${1:i:1}"
    if [[ "$ch" != "'" ]]; then
      quoted="$quoted$ch"
    else
      local single_quotes="'"
      local j=1
      while [ $j -lt ${#1} ] && [[ "${1:i+j:1}" == "'" ]]; do
        single_quotes="$single_quotes'"
        ((j++))
      done
      quoted="$quoted'\"$single_quotes\"'"
      ((i+=j-1))
    fi
    ((i++))
  done
  echo "$quoted'"
}

সুতরাং, আপনি এটি এইভাবে ব্যবহার করতে পারেন:

single_quote "1 2 '3'"
'1 2 '"'"'3'"'"''

x="this text is quoted: 'hello'"
eval "echo $(single_quote "$x")"
this text is quoted: 'hello'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.