কীভাবে শেলের উদ্ধৃতি থেকে বাঁচবেন?


65

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

'single quote phrase' "double quote phrase"

আমি যদি অন্য কোনও ব্যবহারকারীর কাছেও যেতে পারি তবে আমি কীভাবে সমস্ত বিশেষ অক্ষর থেকে বাঁচতে পারি:

sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""

অবশ্যই, এটি সঠিক ফলাফল দেয় না।


"অবশ্যই, এটি সঠিক ফলাফল দেয় না" এর জন্য +1। bashআমাকে পাগল করার পথে ঠিক আছে।
রোল্ফ

উত্তর:


88

আপনি নিম্নলিখিত স্ট্রিং আক্ষরিক বাক্য গঠন ব্যবহার করতে পারেন:

> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

থেকে man bash

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

          \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
          \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)
          \cx    a control-x character

5
Overkill। বেশিরভাগ ক্ষেত্রে আপনার স্ট্রিং আক্ষরিক সিনট্যাক্স ব্যবহার করার দরকার নেই।
fpmurphy

আরো বিস্তারিত এখানে stackoverflow.com/a/16605140/149221
mj41

12

একটি পসিক্স শেল-এ, আপনার স্ট্রিং ধরে ধরে নেওয়া যায় যে কোনও ভেরিয়েবল, কমান্ড বা ইতিহাস সম্প্রসারণ নেই, এবং কোনও নতুন লাইন নেই, এই বেসিক প্রেসক্রিপশনগুলি অনুসরণ করুন:

  1. একক উদ্ধৃতি সহ একটি জেনেরিক স্ট্রিং উদ্ধৃত করতে, নিম্নলিখিত ক্রিয়া সম্পাদন করুন:

    1. যোগ করা শীর্ষস্থানীয় এবং অনুগামী একক উদ্ধৃতি সহ একই ক্রমযুক্ত অ-একক-উদ্ধৃতি অক্ষরের যে কোনও ক্রমকে প্রতিস্থাপন করুন: 'aaa' ==> ''aaa''

    2. প্রতিটি প্রাক্কলিত একক উদ্ধৃতি চরিত্রের একটি ব্যাকস্ল্যাশ দিয়ে পালানো : ' ==> \'
      বিশেষত,''aaa'' ==> \''aaa'\'

  2. ডাবল উদ্ধৃতি সহ একটি জেনেরিক স্ট্রিং উদ্ধৃত করতে, নিম্নলিখিত ক্রিয়া সম্পাদন করুন:

    1. শীর্ষস্থানীয় এবং পিছনে ডাবল উদ্ধৃতি যুক্ত করুন: aaa ==> "aaa"

    2. প্রতিটি ডাবল উদ্ধৃতি অক্ষর এবং প্রতিটি ব্যাকস্ল্যাশ অক্ষর একটি ব্যাকস্ল্যাশ সঙ্গে পালাতে: " ==> \", \ ==> \\

উদাহরণ দুটি:

''aaa""bbb''ccc\\ddd''  ==>  \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
                        ==>  "''aaa\"\"bbb''ccc\\\\ddd''"

যাতে আপনার উদাহরণটি নিম্নলিখিতগুলির সাথে প্রসারিত হতে পারে:

#!/bin/sh

echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""

sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'

sudo su enzotib -c "echo \\''aaa'\\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\\"bbb\\\"\""

10

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

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

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

বিকল্পভাবে:

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

এটি ইতিমধ্যে একটি খোলা ( ') শেষ করে অন্য কোট ( "'")) এ উদ্ধৃতি রেখে অন্য একটি ( ) খোলার মাধ্যমে শেষ হয়েছে '

সম্পর্কিত: একক-উদ্ধৃত স্ট্রিংয়ের মধ্যে কীভাবে একক উদ্ধৃতিগুলি থেকে বাঁচবেন? স্ট্যাকওভারফ্লো এসই তে


1

গৃহীত উত্তর সরল (এক স্তর) উদ্ধৃতি হিসাবে কাজ করে:

$ echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

কমান্ডটি কাজের উপস্থাপিত হওয়ার জন্য, আপনাকে দুবার উদ্ধৃতি দিতে হবে।
এই স্ক্রিপ্টটি সমস্ত কাজ করতে পারে:

#!/bin/bash

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

read -r line <<-\_line_to_quote_
'single quote phrase' "double quote phrase"
_line_to_quote_

quote "$line"; echo
quote "echo $(quote "$line")"; echo

পাওয়ার জন্য স্ক্রিপ্টটি কার্যকর করুন:

$ script
''\''single quote phrase'\'' "double quote phrase"'
'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''

প্রথম লাইনটি সহজ প্রতিধ্বনির জন্য কাজ করে:

$ echo ''\''single quote phrase'\'' "double quote phrase"'
'single quote phrase' "double quote phrase"

দ্বিতীয় লাইনটি ডাবল উদ্ধৃত কমান্ডের জন্য কাজ করবে:

sudo su USER -c 'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''

-3

প্রতিধ্বনি 'আমি ma' মা ছাত্র 'কাজ করে না। কিন্তু নিম্নলিখিত কাজ করে:

ইকো I 'আমি ma' মা ছাত্র 'বাশের ম্যান পৃষ্ঠা থেকে:

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


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