शेल में उद्धरण से कैसे बचें?


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

फॉर्म $ 'स्ट्रिंग' के शब्दों को विशेष रूप से व्यवहार किया जाता है। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है। बैकस्लैश एस्केप सीक्वेंस, यदि मौजूद हैं, तो निम्नानुसार डिकोड किए जाते हैं:

          \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

POSIX शेल में, यह मानते हुए कि आपके स्ट्रिंग में कोई चर, कमांड या इतिहास का विस्तार नहीं है, और कोई नई रेखा नहीं है, इन मूल नुस्खों का पालन करें:

  1. एकल उद्धरण के साथ एक सामान्य स्ट्रिंग को उद्धृत करने के लिए, निम्नलिखित क्रियाएं करें:

    1. जोड़े गए अग्रणी और अनुगामी एकल उद्धरणों के साथ समान अनुक्रम वाले गैर-एकल-उद्धरण वर्णों के किसी भी क्रम को प्रतिस्थापित करें: 'aaa' ==> ''aaa''

    2. बैकप्लैश के साथ हर preexisting एकल उद्धरण वर्ण से बच : ' ==> \'
      विशेष रूप से,''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

गूंज 'I \ _' मा छात्र 'काम नहीं करता है। लेकिन निम्नलिखित काम करता है:

इको $ 'I \' मा स्टूडेंट 'बैश के मैन पेज से:

एकल उद्धरण के बीच एक एकल उद्धरण नहीं हो सकता है, तब भी जब एक बैकस्लैश द्वारा पूर्ववर्ती हो। .... फॉर्म $ 'स्ट्रिंग' के शब्दों को विशेष रूप से व्यवहार किया जाता है। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है।


6
यह मौजूदा उत्तरों में कुछ नहीं जोड़ता है।
जसोनव्रीयन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.