आप बैश में एकल उद्धृत स्ट्रिंग में एपोस्ट्रोफ से कैसे बच सकते हैं?


16

मुझे समझ में नहीं आता कि कैसे बैश एकल उद्धृत तारों में एपोस्ट्रोफ वर्णों के भागने का मूल्यांकन करता है।

यहाँ एक उदाहरण है:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

मैं इस के लिए स्पष्टीकरण की कोशिश कर रहा हूँ, लेकिन कुछ भी नहीं मिल सका। बैश यहाँ क्या कर रहा है?


echo \''Hello World'\'
मैथ

जवाबों:


17

एकल उद्धरणों में, कोई बचना संभव नहीं है। एकल उद्धरण को एकल उद्धरण में शामिल करने का कोई तरीका नहीं है। मैन बैश में कोटेशन देखें ।


1
आप सही हे। यह ट्रिक उस लाइन में है 'एक सिंगल कोट्स एक बिटवॉयन सिंगल कोट्स तब भी नहीं हो सकता है जब बैकस्लैश से पहले हो' तो यह शायद इसे अलग-अलग हिस्सों में विभाजित करता है।
किबेट

@ कोलिन जैसे ही एक एकल उद्धरण दो अन्य एकल उद्धरण (लेकिन बैकस्लेस्ड) के अंदर होता है, उद्धृत उद्धरण अब कोई वास्तविक उद्धरण नहीं है। यह सिर्फ एक विशेष आकर्षण जोड़ी नहीं है।
जीरो

1
@ zero2cx: सही नहीं है:echo '\''
choroba

@ zero2cx: मैं "अंदर" के बजाय "बाहर" कहूंगा।
चोराबा

3
@choroba नहीं "पूरी तरह से" सच है, पार्टी में आप कर सकते हैंecho $'\'hello world\''
bufh

8

POSIX- समर्थित एकल- और दोहरे-उद्धरण के bashअलावा , उद्धृत स्ट्रिंग में एक छोटे से वर्ग के पात्रों (एकल उद्धरण सहित) की अनुमति देने के लिए एक अतिरिक्त प्रकार की आपूर्ति करता है:

$ echo $'\'Hello World\''
'Hello World'

अनुभाग bashके अंत के पास मैन पेज में क्वोटिंग अनुभाग देखें । ("एएनएसआई सी" के लिए खोज करें।)


3

आपके बच गए प्रेरितों के साथ क्या हो रहा है, यह समझाने के लिए, हम आपके दूसरे उदाहरण की जाँच करेंगे ( एकल उद्धरण या मजबूत उद्धरण भी देखें ):

$ echo '\'Hello World\''
>     # expects you to continue input

जैसा कि आपने कहा है, यहाँ, आपने उद्धरण को लटका दिया है। अब अंत ट्रिम करें और इसे इसमें बदलें:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

"हैलो वर्ल्ड" उप-स्ट्रिंग यहां उद्धृत नहीं की गई थी, लेकिन यह ऐसा व्यवहार करती थी मानो यह मजबूत उद्धरण हो। अपने उदाहरण का उपयोग करके, इस बार अंत को अलग तरह से ट्रिम करें

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

"हैलो वर्ल्ड" उप-स्ट्रिंग फिर से व्यवहार करता है जैसे कि यह मजबूत उद्धरण था, अंत में केवल जोड़ा एपोस्ट्रोफ (बच गया, इसलिए अब एक भी उद्धरण नहीं)।

जब एक और एकल उद्धरण अंत में जोड़ा जाता है (आपका मूल उदाहरण) स्ट्रिंग लटका हुआ है और एक करीबी-उद्धरण के लिए इंतजार कर रहा है।


3

शेल में उद्धरण से बचने का सरल उदाहरण:

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

यह पहले से ही खोले 'गए एक ( \') को बंद करने के लिए किया गया है , एक को भागने के लिए ( ) प्रिंट करने के लिए, फिर दूसरे को खोलने के लिए ( ')।

वैकल्पिक रूप से:

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

यह पहले से ही खोले गए एक ( '), एक और उद्धरण ( "'") में रखकर , फिर एक और खोलने ( ') को पूरा करने के द्वारा किया जाता है ।

आपने क्या किया ( '\'Hello World\''), है:

  1. पहला एपोस्ट्रोफ खोला ':।
  2. इसके ठीक बाद बंद \'हो जाता है, इसलिए स्ट्रिंग बन जाता है '\':।
  3. Hello World उद्धरण नहीं है।
  4. \'इसे खोलने के बिना स्टैंडअलोन एपोस्ट्रोफ ( ) रखा ।
  5. अंतिम एपोस्ट्रोफ ( ') स्ट्रिंग खोल रहा है, लेकिन कोई समापन नहीं है जो अपेक्षित है।

तो सही उदाहरण होगा:

$ echo \'Hello World\'
'Hello World'

संबंधित: एकल-उद्धृत स्ट्रिंग्स के भीतर एकल-उद्धरण से कैसे बचें?

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