शेल में विशेष वर्णों को लपेटने के लिए एकल उद्धरण का उपयोग करते समय `एकल उद्धरण` कैसे प्रतिध्वनित करें?


26

मैं आज http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm से शेल ट्यूटोरियल पढ़ रहा हूं

जिसमें इसका उल्लेख है:

यदि कोई एकल उद्धरण आउटपुट के स्ट्रिंग के भीतर दिखाई देता है, तो आपको पूरे स्ट्रिंग को सिंगल कोट्स के भीतर नहीं रखना चाहिए बजाय इसके कि आप पहले से बताएं कि बैकस्लैश () का उपयोग इस प्रकार है:

echo 'It\'s Shell Programming'

मैंने अपने सेंटोस सर्वर पर यह कोशिश की, यह काम नहीं करता है, >मुझे संकेत देता है कि मुझे अधिक टाइप करें।

मैं सोच रहा था के बाद से दो एकल उद्धरण सामान्य अक्षर, जो भागने प्रतीक शामिल में हर विशेष वर्ण बदलना, \,, लेकिन बाहर करते ही ',
कैसे मैं एक ही एकल उद्धरण का प्रतिनिधित्व करना चाहिए 'एक एकल उद्धृत वाक्यांश में?


1
क्यों नहीं इस्तेमाल करते हैं echo It\'s Shell Programmingया echo "It's Shell Programming"?
congonglm

@cuonglm, क्योंकि मैं वाक्यांश का उपयोग कर सकता हूं जैसेecho Wow, I'm going to have lots of $$$$$$ now
Zen

2
तो आप दोहरे उद्धरण चिह्नों का उपयोग करें, और बच $भी जाना चाहिए । कुछ ऐसा ही echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowया सिर्फecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm

@ क्यूंग्लम, हां, मैं यह कर सकता हूं, और मुझे पता है कि मैं इसे कैसे कर सकता हूं। लेकिन मैं जिस ट्यूटोरियल को पढ़ रहा हूं, वह इस बारे में आश्वस्त है कि एकल-उद्धृत वाक्यांशों के अंदर एकल उद्धरण से बचने का एक तरीका है, लेकिन ट्यूटोरियल का दिया गया उदाहरण काम नहीं करता है। इसलिए मैं सोच रहा हूं कि कोई व्यक्ति इसका समाधान जान सकता है।
ज़ेन

1
इस बारे में कैसा है? echo 'It'"'"'s Shell Programming'। मैं इसे 3 स्ट्रिंग्स के रूप में विभाजित करता हूं, पहला और अंतिम सिंगल कोट्स से घिरा हुआ है, लेकिन बीच में एक सिंगल कोट्स दोहरे कोट्स से घिरा हुआ है।
jcbermu

जवाबों:


49

ट्यूटोरियल गलत है।

POSIX कहता है:

एकल-उद्धरण एकल-उद्धरण के भीतर नहीं हो सकता।

यहाँ कुछ विकल्प दिए गए हैं:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

आगे पढ़े: उद्धरण - ग्रेग का विकी


4
एक और: echo 'It''s Shell Programming'- rc_quotesविकल्प सेट के साथ zsh (और आरसी शेल भी) - एकल उद्धरण के अंदर एकल उद्धरणों की एक जोड़ी एक एकल उद्धरण का प्रतिनिधित्व करती है।
मिशैल पोलितोव्स्की

5
मैं कभी-कभी उपयोग करता हूं q="'"और qq='"'इस क्लीनर को बनाने के लिए। इसके बाद अनुमति देता है echo "It${q}s ${qq}Shell Programming${qq}"(घुंघराले कोष्ठकों को अनुगामी अक्षर दिए जाते हैं)। POSIX सुरक्षित। बाहरी परत डबल-कोटेड होनी चाहिए।
एडम काटज़

1

आप उपयोग कर सकते हैं:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

सुरक्षित रूप से शेल के लिए प्रति पंक्ति एक मूल्य रेखा बोली।

शेल के आधार पर, आपके पास करने का विकल्प भी हो सकता है:

printf %q\\n "$arbitrary_value"

हालांकि मैं आमतौर पर करना पसंद करता हूं:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

एक अधिक मैनुअल दृष्टिकोण की तरह लग सकता है:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... जो है, कम से कम, कांटा-मुक्त।


1
मुझे पूरी तरह से इस बारे में कोई जानकारी नहीं है कि आप किस बारे में बात कर रहे हैं, वाक्यांश को छोड़कर printf %q\\n "$arbitrary_value", अन्य बहुत जटिल हैं।
झेन

1

यदि कोई व्यक्ति किसी फ़ाइल में सिंगल और डबल कोट्स का मिश्रण डालने के लिए आता है, तो यह भी काम कर रहा है:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

सब कुछ एक चर के रूप में देख सकता है, हालांकि एक बैकस्लैश द्वारा बच जाना चाहिए:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.