2011-07-14 15 views

उत्तर

312

सिंगल कोट्स कुछ भी इंटरपोलेट नहीं करेंगे, लेकिन डबल कोट्स (उदाहरण के लिए चर, बैकटिक्स, कुछ \ भाग निकलें, आदि ...)।

उदाहरण

[email protected]:~# echo "$(echo "upg")" 
upg 
[email protected]:~# echo '$(echo "upg")' 
$(echo "upg") 

बैश मैनुअल इस में क्या कहना है:

3.1.2.2 Single Quotes

एकल उद्धरण में संलग्न वर्ण (') उद्धरण के भीतर प्रत्येक चरित्र के वस्तुतः मान बरकरार रखता है। सिंगल कोट्स के बीच एक सिंगल कोट नहीं हो सकता है, यहां तक ​​कि बैकस्लैश से पहले भी।

3.1.2.3 Double Quotes

दोहरे उद्धरण चिह्नों (") में संलग्न पात्रों उद्धरण के भीतर सभी पात्रों का शाब्दिक मूल्य को बरकरार रखता है, $, `, \ के अपवाद के, और, जब इतिहास विस्तार सक्षम किया गया है, ! साथ। पात्र $ और ` डबल कोट्स के भीतर अपना विशेष अर्थ बनाए रखें (Shell Expansions देखें)। बैकस्लैश केवल निम्नलिखित वर्णों में से एक के बाद अपना विशेष अर्थ बरकरार रखता है: $, `, ", \, या न्यूलाइन। डबल कोट्स के भीतर, इन वर्णों में से किसी एक के बाद बैकस्लाश हटा दिए जाते हैं। विशेष अर्थ के बिना वर्णों से पहले बैकस्लाश को अनमोडिफाइड छोड़ दिया जाता है। एक डबल कोट को बैकस्लैश से पहले डबल कोट्स के भीतर उद्धृत किया जा सकता है। यदि सक्षम है, तो इतिहास विस्तार तब तक किया जाएगा जब तक कि ! डबल कोट्स में दिखाई नहीं दे रहा है, बैकस्लैश का उपयोग करके बच निकला है। ! से पहले बैकस्लैश हटाया नहीं गया है।

विशेष पैरामीटर * और @ का विशेष अर्थ है जब डबल कोट्स में (Shell Parameter Expansion देखें)।

167

यदि आप कुछ गूंजते हैं तो क्या होता है इसका संदर्भ ले रहे हैं, तो सिंगल कोट्स सचमुच उनके बीच जो कुछ है, उसे प्रतिबिंबित करेंगे, जबकि डबल कोट्स उनके बीच चर का मूल्यांकन करेंगे और चर के मान को आउटपुट करेंगे।

उदाहरण के लिए, इस

#!/bin/sh 
MYVAR=sometext 
echo "double quotes gives you $MYVAR" 
echo 'single quotes gives you $MYVAR' 

इस दे देंगे:

double quotes gives you sometext 
single quotes gives you $MYVAR 
87

accepted answer महान है। मैं एक टेबल बना रहा हूं जो विषय की त्वरित समझ में मदद करता है। स्पष्टीकरण में एक साधारण चर a के साथ-साथ अनुक्रमित सरणी arr शामिल है।

अगर हम

a=apple  # a simple variable 
arr=(apple) # an array with a single element 

और फिर echo दूसरे कॉलम में अभिव्यक्ति निर्धारित करते हैं, हम परिणाम/व्यवहार तीसरे स्तंभ में दिखाया गया है मिलेगा। चौथा स्तंभ व्यवहार को बताता है।

# | Expression | Result  | Comments 
---+-------------+-------------+-------------------------------------------------------------------- 
1 | "$a"  | apple  | variables are expanded inside "" 
2 | '$a'  | $a   | variables are not expanded inside '' 
3 | "'$a'"  | 'apple'  | '' has no special meaning inside "" 
4 | '"$a"'  | "$a"  | "" is treated literally inside '' 
5 | '\''  | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting) 
6 | "red$arocks"| red   | $arocks does not expand $a; use ${a}rocks to preserve $a 
7 | "redapple$" | redapple$ | $ followed by no variable name evaluates to $ 
8 | '\"'  | \"   | \ has no special meaning inside '' 
9 | "\'"  | '   | \' is interpreted inside "" 
10 | "\""  | "   | \" is interpreted inside "" 
11 | "*"   | *   | glob does not work inside "" or '' 
12 | "\t\n"  | \t\n  | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting 
13 | "`echo hi`" | hi   | `` and $() are evaluated inside "" 
14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside '' 
15 | '${arr[0]}' | ${arr[0]} | array access not possible inside '' 
16 | "${arr[0]}" | apple  | array access works inside "" 
17 | $'$a\''  | $a'   | single quotes can be escaped inside ANSI-C quoting 
18 | '!cmd'  | !cmd  | history expansion character '!' is ignored inside single quotes 
19 | "!cmd"  | cmd args | expands to the most recent command matching "cmd" 
---+-------------+-------------+-------------------------------------------------------------------- 

यह भी देखें:

+2

कि टेबल [StackOverflow] पर कई सवालों का जवाब है (https://stackoverflow.com) । – C0deDaedalus

+1

स्वीकृत उत्तर अंत में कहता है 'विशेष पैरामीटर * और @ के पास विशेष अर्थ है जब डबल कोट्स में' तो '' * '' '' 'में कैसे आते हैं? –

संबंधित मुद्दे

 संबंधित मुद्दे