क्या शेल में एकल-उद्धरण से बचने का एक तरीका है?


11

ई। जी। मैं कहना चाहता हूँ

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

वहाँ यह करने के लिए एक कम अजीब तरीका है, जैसे एकल उद्धरण बच?

हां, मुझे पता है कि मैं लिख सकता हूं

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

लेकिन यह प्रश्न शेल में उद्धृत करने के बारे में है, न कि पर्ल में।

मुझे इसमें bashऔर cshपहली जगह में करने का शौक है।

जवाबों:


9

डेनिस अपने जवाब में सामान्य विकल्पों को इंगित करता है (सिंगल-इन-डबल, डबल-इन-सिंगल, सिंगल कोटेड स्ट्रिंग्स को बच गए सिंगल कोट्स के साथ; आपने पहले ही पर्ल के अनुकूलन योग्य उद्धरण ऑपरेटरों का उल्लेख किया है), लेकिन शायद यह सीधा जवाब है जिसे आप देख रहे थे। के लिये।

बॉर्न जैसे गोले (श, क्श, राख, पानी का छींटा, बाश, ज़श, आदि) में एकल उद्धृत तार पूरी तरह से शाब्दिक हैं। इससे उन पात्रों को शामिल करना आसान हो जाता है जो शेल अन्यथा उन्हें बचने के लिए विशेष रूप से व्यवहार करेंगे, लेकिन इसका मतलब यह है कि एकल उद्धरण वर्ण स्वयं को एकल उद्धृत स्ट्रिंग्स में शामिल नहीं किया जा सकता है।

मैं csh- प्रकार के गोले के बारे में सोचने से भी इनकार करता हूं क्योंकि वे अन्य संबंध में पूरी तरह से टूट गए हैं (देखें Csh प्रोग्रामिंग कंसीडरेड हार्मफुल )।


धन्यवाद। "यह असंभव है" - यह वह उत्तर है जिसकी मुझे उम्मीद थी :) हालाँकि मुझे हमेशा उम्मीद थी कि यह यहाँ दस्तावेज हैं जो इस भूमिका को निभाने के लिए समर्पित हैं।
कोडहॉल

पर्ल के विपरीत, बॉर्न-जैसे शेल यहां दस्तावेज़ केवल स्टड के माध्यम से इनपुट प्रदान करने के लिए सीधे उपयोगी हैं। आप निश्चित रूप से, उनमें एकल उद्धरण डाल सकते हैं। आप शब्द को उद्धृत करके यहां दस्तावेज़ के "शाब्दिक मोड" को भी सक्षम कर सकते हैं: (उदाहरण के लिए) blah <<\EOF … EOF। तुम भी उपयोग कर सकते हैं <<'EOF'और <<"EOF। वे सभी शाब्दिक अर्थ यहाँ दस्तावेजों (पर्ल के विपरीत)। यदि आप वास्तव में निर्धारित थे, तो आप कर सकते हैं blah "$(cat<<\EOF … EOF )" other args(newlines का उपयोग करते हुए जहां मैंने कमांड प्रतिस्थापन में रिक्त स्थान लिखा है; ksh और zsh बिल्ली के बिना कर सकते हैं , दूसरों को इसकी आवश्यकता है)। लेकिन क्या यह वास्तव में इसके लायक होगा?
क्रिस जॉन्सन

बस यह नोट करना चाहते हैं कि zsh सिंगल कोट्स काफी शाब्दिक नहीं हैं। Zsh एक एकल-उद्धृत स्ट्रिंग में कहीं भी '\ U' को वर्ण कोड के रूप में व्याख्या करने का प्रयास करेगा, उदाहरण के लिए echo '\U0000068\U000069''hi'। यकीन नहीं है, हालांकि जब तक यह खोल में एक बग नहीं है।
मत्ती

1
@ मैथ्यू: \Uउस मामले की व्याख्या बिल्ट-इन इको कमांड द्वारा की जा रही है (इस व्यवहार -Eको BSD_ECHO विकल्प या द्वारा नियंत्रित किया जा सकता है -e)। आप देख सकते हैं कि शाब्दिक स्ट्रिंग को अन्य आदेशों में पारित किया गया है (और अन्यथा व्याख्या नहीं की गई है); उदा printf %s\\n '\U0000068\U000069'
क्रिस जॉन्सन

@ क्रिसहॉन्सेन धन्यवाद, मैं zsh में नया हूँ और यह महसूस नहीं किया लेकिन आप सही हैं। मैन पेज ने मुझे बताया -e डिफॉल्ट है लेकिन zsh को ओवरराइड करना चाहिए।
मत्ती

5

मेरे लिए, आपके सभी उदाहरण प्रस्तुत करते हैं:

नमस्ते दुनिया!

और ऐसा करता है:

perl -e 'print "Hello, world!", "\n";'

और इस:

perl -e 'print '\''Hello, world!'\'', "\n";'

क्या आप स्पष्ट कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?

शेल में, जैसे कि बैश, यदि आप स्ट्रिंग के हिस्से के रूप में उद्धरण चिह्नों को प्रिंट करना चाहते हैं, तो एक प्रकार का उद्धरण दूसरे से बच जाता है।

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

संपादित करें:

यहाँ एक और तरीका है:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

विस्मयादिबोधक बिंदु के बाद का स्थान एक इतिहास विस्तार त्रुटि से बचा जाता है। मैं set +Hइसके बजाय कर सकता था ।


1

सुनिश्चित नहीं है कि पिछले उत्तर पर मेरा संपादन दिखाई देगा:

एक नए उत्तर के रूप में समान पेस्ट करना:

वैकल्पिक दृष्टिकोण:

जब मैंने आपके समाधान की कोशिश की तब भी मुझे 'प्रिंट' नहीं मिला।

लेकिन मैंने आपके समाधान से क्यू लिया और निम्नलिखित की कोशिश की:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

ASCII का मान 39 है।

मुझे रुचि के स्थान पर इनलाइन फ़ाइलों को जोड़ने के लिए इनलाइन एडिट करने के लिए इसकी आवश्यकता थी।


1

यहां दस्तावेज़ बचने का सबसे अच्छा तरीका है:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

यहां दिए गए दस्तावेज़ का उपयोग करके आप सभी विस्तार को पूरी तरह से रोक सकते हैं:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

यदि आप इसे इनपुट के बजाय तर्क के रूप में पास करना चाहते हैं, तो आप xargs का उपयोग कर सकते हैं:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

मुझे नहीं पता कि क्या कोई विकल्प बैश में है, लेकिन zsh के साथ आप विकल्प को ''चालू करने के बाद उपयोग कर सकते हैं RC_QUOTES। (मैं ज़ीश आज़माने की सलाह दूंगा; यह ज्यादातर बैश-संगत है और अधिक अनुकूलता के लिए बैश का अनुकरण कर सकता है।)

बैश के साथ (और अभी भी अधिकांश समय zsh के साथ), मैं सिर्फ '\''इसलिए उपयोग करता हूं क्योंकि यह पढ़ने में आसान है '"'"'

मुझे बिल्कुल पता नहीं है कि इसे कैसे करना है।


-1

यदि आप आंतरिक रूप से एक पर्ल स्क्रिप्ट के भाग के रूप में उपयोग किए जाते हैं, तो आप पर्ल के साथ उद्धरण से बचने के लिए \ 'और \ "का उपयोग कर सकते हैं। मुझे यकीन नहीं है कि कमांड लाइन हालांकि स्वीकार करेगी। आप इसे आज़मा सकते हैं और देखें कि क्या यह काम करता है।


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