मैं दोहरे उद्धरणों के अंदर एक दोहरे उद्धरण से कैसे बच सकता हूं?


286

मैं बैश में एक डबल स्ट्रिंग के अंदर दोहरे उद्धरणों से कैसे बच सकता हूं?

उदाहरण के लिए, मेरी शेल स्क्रिप्ट में

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

मैं ENCLOSED BY '\"'सही ढंग से बचने के लिए दोहरे उद्धरण के साथ नहीं मिल सकता । मैं अपने चर के लिए एकल उद्धरण का उपयोग नहीं कर सकता, क्योंकि मैं चर का उपयोग करना चाहता हूं $dbtable




2
@kenorb उस प्रश्न के डुप्लिकेट की तरह नहीं दिखता ...
मार्क

यह भी देखें stackoverflow.com/questions/10067266/…
tripleee

@Daenyth इस प्रकार का आदेश नहीं है जिससे आप अंत उपयोगकर्ताओं को किसी भी एक्सेस की उम्मीद करेंगे। थोक लोड स्क्रिप्ट आमतौर पर विश्वसनीय उपयोगकर्ताओं (जैसे सिस्टम व्यवस्थापक या डेवलपर्स) द्वारा सर्वर पर चलाई जाती हैं । हां, यदि अंतिम उपयोगकर्ता इसके मूल्य को नियंत्रित करते हैं $dbtable, तो एक जोखिम है। यह बहुत असामान्य होगा, हालांकि, अंत उपयोगकर्ताओं के रूप में आम तौर पर अपने डेटा को लोड करने के लिए एक मशीन में SSH नहीं है।
jpmc26

जवाबों:


285

एक बैकस्लैश का उपयोग करें:

echo "\""     # Prints one " character.

9
काम नहीं कर रहा। x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;टूटा हुआ ... [ -f "$(which $x)" ]; ...या ... [ -f $(which "$x") ]; ...ठीक काम करता है। किसी स्थान या अन्य विशेष वर्ण के साथ कुछ भी देने पर $xपरिणाम या तो समस्याएँ उत्पन्न होती हैं $(which "$x")। वर्कअराउंड एक परिणाम का आयोजन करने के लिए एक चर का उपयोग कर रहा है which, लेकिन क्या वास्तव में एक बोली से बचने में असमर्थ है या मैं कुछ गलत कर रहा हूं?
ल्यूक

मैं grep -oh "\"\""$counter"\""\w*" एक बैश सिंटैक्स के हिस्से के रूप में निम्नलिखित का उपयोग करने की कोशिश कर रहा हूं जहां $counterएक चर है। यह किसी भी विचार को पसंद नहीं करता है
Jay D

82

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

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

यह पहले से ही खोले गए एक ( ') को खत्म करके , बचा हुआ एक ( \') रखकर , और फिर दूसरे को खोलने के द्वारा किया जाता है '

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

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

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

अधिक उदाहरण: एकल-उद्धृत स्ट्रिंग्स के भीतर एकल-उद्धरण से बचना


1
मैंने sh -c "echo '{" key ":" value "}" "और यहां तक ​​कि sh -c" echo' {'' '' 'key' '' '': '' '' '' value '' '' '' '' '' '' '' '' '' '' 's' की कोशिश की। '}' 'शब्दों और शब्दों को दोहरे उद्धरण चिह्नों में शामिल करने के प्रयास में, लेकिन दोनों ही मामलों में मुझे {key: value} मिली
इगोर यगोलनीटेर

1
यह दोहरे उद्धरण चिह्नों के लिए अनावश्यक रूप से जटिल लगता है: पीटर उत्तर में echo "abc\"abc"उत्पादन करने के लिए पर्याप्त है abc"abc
दिव्यांग

2
वास्तव में इस सरल उदाहरण में, लेकिन नेस्टेड कोट्स के जटिल मामलों में, ऐसा करना आवश्यक हो सकता है और @ kenorb के उदाहरण से मुझे यह पता लगाने में मदद मिली कि उन मामलों से कैसे निपटा जाए।
प्रोजिटोस

63

मुझे नहीं पता कि इस पुराने मुद्दे को आज बैश टैग लिस्ट में क्यों पॉप अप किया गया है, लेकिन सिर्फ भविष्य के शोधकर्ताओं के मामले में, इस बात का ध्यान रखें कि आप उन चार वर्णों के ASCII कोड का उपयोग करके बच निकलने से बच सकते हैं जिनकी आपको गूंज की जरूरत है।

उदाहरण:

 echo -e "This is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"
 This is "'"'"text"'"'"

\x22डबल कोट्स के लिए और \x27सिंगल कोट्स के लिए ASCII कोड (हेक्स में) है । इसी तरह आप किसी भी पात्र को प्रतिध्वनित कर सकते हैं।

मुझे लगता है कि अगर हम बैकस्लैश के साथ उपरोक्त स्ट्रिंग को प्रतिध्वनित करने की कोशिश करते हैं, तो हमें एक गन्दी दो पंक्तियों की आवश्यकता होगी जो पीछे की ओर गूंजती है ... :)

चर असाइनमेंट के लिए यह समतुल्य है:

 $ a=$'This is \x22text\x22'
 $ echo "$a"
 This is "text"

यदि चर पहले से ही किसी अन्य प्रोग्राम द्वारा सेट किया गया है, तो आप अभी भी sed या समान टूल के साथ डबल / सिंगल कोट्स लागू कर सकते हैं।

उदाहरण:

 $ b="Just another text here"
 $ echo "$b"
 Just another text here
 $ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
 Just another "0" here #this is not what i wanted to be
 $ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
 Just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.

1
+1 क्योंकि इससे PS1 वैरिएबल को ~ / .profile में जोड़ने की समस्या हल हो गई echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
Yassine ElBadaoui

1
यह जवाब है! आई लव यू सर।
मिगुएल रोजास कोर्टेस

28

बैश आपको आसन्न तारों को लगाने की अनुमति देता है, और वे बस एक साथ चिपके हुए समाप्त हो जाएंगे।

तो यह:

$ echo "Hello"', world!'

पैदा करता है

Hello, world!

ट्रिक को आवश्यकतानुसार सिंगल और डबल-कोटेड स्ट्रिंग्स के बीच वैकल्पिक करना है। दुर्भाग्य से, यह जल्दी से बहुत गड़बड़ हो जाता है। उदाहरण के लिए:

$ echo "I like to use" '"double quotes"' "sometimes"

पैदा करता है

I like to use "double quotes" sometimes

आपके उदाहरण में, मैं इसे कुछ इस तरह से करूंगा:

$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload

जो निम्नलिखित उत्पादन का उत्पादन करता है:

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

यह देखना मुश्किल है कि यहां क्या हो रहा है, लेकिन मैं यूनिकोड उद्धरणों का उपयोग करके इसे एनोटेट कर सकता हूं। निम्नलिखित बाश में काम नहीं करेगा - यह सिर्फ दृष्टांत के लिए है:

dbload=' load data local infile "' ' 'gfpoint.csv'' ' " into' ' table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '' ' "' ' ' LINES' ' TERMINATED BY "' ' '\n'' ' " IGNORE 1 LINES' ' ' ' ' ' '

उपरोक्त में "''" जैसे उद्धरण बैश द्वारा व्याख्यायित किए जाएंगे। जैसे उद्धरण " 'परिणामी चर में समाप्त हो जाएंगे।

यदि मैं पहले उदाहरण के लिए एक ही उपचार देता हूं, तो यह इस तरह दिखता है:

$ echo" I like to use" ' "double quotes"' " sometimes"


4
बेनाम: Oof ... यह कुछ बदसूरत सामान है।
मैजिक ऑक्टोपस Urn

17

की जाँच करें printf ...

#!/bin/bash
mystr="say \"hi\""

बिना प्रिंट का उपयोग किए

echo -e $mystr

आउटपुट: "हाय" कहें

प्रिंटफ का उपयोग करना

echo -e $(printf '%q' $mystr)

आउटपुट: \ "हाय \" कहें


2
ध्यान दें कि printfअधिक वर्णों से बच जाता है, जैसे कि ', (और)
डेविड पियर्सन

printf %qके लिए तैयार evalनहीं, तार तैयार करता है echo -e
चार्ल्स डफी

2
के बेकार उपयोग केprintf साथ लपेटने का कोई कारण नहीं हैecho । आपके दोनों उदाहरणों ने उद्धृत करना तोड़ दिया है। वैरिएबल को डबल-कोट करने के लिए उचित फिक्स है।
त्रिकाल

15

चर के रूप में दोहरे उद्धरण वर्ण को संग्रहीत करें:

dqt = '' '
"डबल उद्धरण स्ट्रिंग के अंदर" डबल उद्धरण $ {dqt} X $ {dqt}

आउटपुट:

डबल उद्धरण "X" एक डबल उद्धृत स्ट्रिंग के अंदर

39
बैश सही मायने में सबसे खराब भाषा है
एंडी रे

@ 12oclocker, आपका उत्तर मूर्खतापूर्ण है: डी! विशेष रूप से "sed" कमांड के साथ प्रयोग करने पर यह मेरे दिन को बचाता है!
आर्टानिस ज़ेरतुल

11

$ "स्ट्रिंग" का उपयोग करें।

इस उदाहरण में, यह होगा,

dbload = $ "लोड डेटा स्थानीय शिशु \" 'gfpoint.csv' \ "तालिका में $ dbtable FIELDS TERMINATED द्वारा ',' ENCLOSED BY '\" LINES TERMINATED BY "" \ n "\" IGNORE 1 LINES "

नोट ( मैन पेज से ):

डॉलर चिह्न ($ "स्ट्रिंग") से पहले एक डबल-उद्धृत स्ट्रिंग वर्तमान स्थानीय के अनुसार स्ट्रिंग का अनुवाद करने का कारण होगा। यदि वर्तमान स्थान C या POSIX है, तो डॉलर चिह्न को अनदेखा कर दिया जाता है। यदि स्ट्रिंग का अनुवाद और प्रतिस्थापित किया जाता है, तो प्रतिस्थापन डबल-उद्धृत होता है।


3
अच्छा, वह एक नहीं जानता था।
डेविड कीयरंस

-5

"\"इसके बजाय बचने के लिए दोहरे उद्धरण से पहले जोड़ें\

#! /bin/csh -f

set dbtable = balabala

set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES"

echo $dbload
# load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES

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