यह बहुत शेल पर निर्भर करता है। विवरण के लिए अपने शेल मैनुअल की जाँच करें।
यह भी ध्यान दें कि कुछ वर्ण केवल कुछ संदर्भों में विशेष हैं। उदाहरण के लिए, अधिकांश गोले में, *
और ?
केवल सूची संदर्भों में, POSIX या csh- जैसे गोले में ~
विशेष हैं, केवल एक शब्द की शुरुआत में या जैसे कुछ वर्णों का अनुसरण करने में विशेष है :
। के लिए एक ही =
में zsh
। कुछ गोले में, [
केवल तभी विशेष होता है जब (कुछ प्रतिबंधों के साथ) a ]
।
जैसे कुछ गोले में bash
या yash
, रिक्त टोकन के रूप में विशेष वर्ण भी लोकेल के साथ भिन्न होते हैं।
उद्धरण संचालक (उन वर्णों के विशेष अर्थ को हटाने के लिए) भी गोले के बीच बहुत भिन्न होते हैं।
बॉर्न-जैसे गोले
बॉर्न-जैसे गोले के लिए एक सारांश (वह गोले हैं जिन्हें sh
80 के दशक के बाद से किसी सिस्टम या किसी अन्य पर कॉल करने के लिए जाना जाता है :
बॉर्न शेल
विशेष वर्ण:
"\'&|;()^`<>$
, स्थान, न्यूलाइन और टैब सरल कमांड लाइनों में विशेष हैं जब उद्धृत नहीं किया जाता है।
#
(शुरुआती संस्करण को छोड़कर) एक पंक्ति की शुरुआत में या एक अनछुए स्थान, टैब या के बाद विशेष है &|()^<>;`
।
{
और }
केवल विशेष हैं कि वे शेल कीवर्ड हैं (इसलिए केवल कमांड स्थिति में शब्द)।
*?[
ग्लोबिंग ऑपरेटरों के रूप में विशेष हैं, इसलिए केवल सूची संदर्भों में। के मामले में [
, यह [...]
है कि ग्लोबिंग ऑपरेटर है, या तो [
या ]
केवल विशेष अर्थ निकालने के लिए उद्धृत किया जाना चाहिए।
=
विशेष तब होता है जब संदर्भों में जहां इसे असाइनमेंट ऑपरेटर के रूप में माना जाता है। अर्थात्, एक साधारण आदेश में, सभी शब्दों के लिए जो एक तर्क का पालन नहीं करते हैं (बाद को छोड़कर set -k
)।
संचालकों को उद्धृत करते हुए
\
न्यूलाइन को छोड़कर सभी विशेष वर्णों को उद्धृत करता है ( अगली भौतिक लाइन पर \<newline>
एक लंबी तार्किक रेखा को जारी रखने का एक तरीका है , ताकि अनुक्रम हटा दिया जाए)। ध्यान दें कि बैकटिक्स उनके भीतर अतिरिक्त जटिलता जोड़ते हैं, इसका उपयोग सबसे पहले क्लोजिंग बैकटिक से बचने और पार्सर की मदद करने के लिए किया जाता है। दोहरे उद्धरण चिह्नों के अंदर, केवल खुद से बचने के लिए इस्तेमाल किया जा सकता है , और ( यह अभी भी एक लाइन-निरंतरता है)। एक दस्तावेज़ के अंदर, सिवाय उसी के । यहाँ दस्तावेजों के अंदर पात्रों से बचने का एकमात्र तरीका है।\
\
"
$
`
\<newline>
"
\
"..."
डबल-कोट्स सभी वर्णों से बच जाते हैं लेकिन स्वयं \
, $
और `
।
'...'
एकल उद्धरण सभी वर्णों से बच जाते हैं, लेकिन स्वयं।
POSIX गोले
POSIX गोले ज्यादातर बॉर्न शेल की तरह व्यवहार करते हैं, सिवाय इसके कि:
^
अब एक विशेष चरित्र नहीं है
~
है कुछ संदर्भों में विशेष
{
विशेष होने की अनुमति है, इसलिए उद्धृत किया जाना चाहिए।
ksh
इसके अलावा POSIX की तरह:
{string}
यदि स्ट्रिंग में एक unquoted ,
(या ..
कुछ मामलों में और कुछ संस्करणों के साथ) विशेष है।
- ksh93 का एक अतिरिक्त विशेष उद्धृत ऑपरेटर है:
$'...'
जटिल नियमों के साथ। यही कारण है कि ऑपरेटर भी (कुछ रूपांतरों के साथ) पाया जाता है bash
, zsh
, mksh
और FreeBSD और बिजीबॉक्स sh
।
ksh93
इसमें एक $"..."
उद्धृत ऑपरेटर भी है "..."
जो इस तरह काम करता है सिवाय इसके कि स्ट्रिंग स्थानीयकरण के अधीन हो (कॉन्फ़िगर किया जा सकता है ताकि यह उपयोगकर्ता की भाषा में अनुवाद हो)। mksh
में अनदेखा करता $
है $"..."
।
bash
पसंद करें ksh93
लेकिन:
- एकल-बाइट वर्ण स्थानों में, सभी रिक्त (स्थान के अनुसार) वर्णों को सीमांकक (जैसे स्थान या टैब) माना जाता है। वास्तव में, इसका मतलब है कि आपको सभी बाइट्स को 8 वें बिट सेट के साथ उद्धृत करना चाहिए, यदि वे कुछ स्थान में एक खाली चरित्र हो सकते हैं।
- जब संवादात्मक उदाहरणों में csh इतिहास विस्तार सक्षम किया जाता है,
!
तो कुछ संदर्भों में विशेष होता है और दोहरे उद्धरण हमेशा इससे बचते नहीं हैं। और ^
एक कमांड की शुरुआत में विशेष है।
zsh
पसंद करें ksh93
लेकिन:
bash
csh इतिहास विस्तार के लिए के रूप में ही ध्यान दें
=
किसी शब्द के पहले वर्ण ( =ls
विस्तार में /bin/ls
) के रूप में विशेष है ।
{
और }
कमांड समूह को तब खोल और बंद कर सकते हैं जब सीमांकित नहीं किया जाता है (जैसा {echo text}
कि बॉर्न की तरह काम करता है { echo text;}
)।
[
अकेले को छोड़कर , [
अगर एक के साथ बंद नहीं है तो भी उद्धृत करने की आवश्यकता है ]
।
extendedglob
सक्षम विकल्प के साथ #
, ^
और ~
ग्लोबिंग ऑपरेटर हैं।
braceccl
विकल्प के साथ , {non-empty-string}
विशेष है।
$"..."
समर्थित नहीं है।
- एक विशेष क्विक के रूप में, एक शब्द के शुरू में (यहां तक कि उद्धृत या विस्तारित) का
?
पालन करते समय विशेष नहीं है %
( %?name
नौकरी विनिर्देशन की अनुमति देने के लिए )
- एक
rcquotes
विकल्प (डिफ़ॉल्ट रूप से सक्षम नहीं) एक एकल उद्धरण को ''
ला के अंदर के रूप में एकल उद्धरण दर्ज करने की अनुमति देता है rc
(नीचे देखें)।
yash
जैसे POSIX
, सिवाय इसके कि।
- सभी रिक्त वर्णों को सीमांकक माना जाता है।
brace-expand
विकल्प के साथ , zsh- शैली ब्रेस विस्तार लागू करता है।
सभी गोले के लिए, कुछ विशेष संदर्भ हैं जहां उद्धृत करना अलग तरीके से काम करता है। हम पहले से ही यहाँ दस्तावेजों और backticks का उल्लेख किया है, लेकिन वहाँ भी [[...]]
है ksh और कुछ अन्य गोले, POSIX $((...))
, case
constructs ...
यह भी ध्यान दें कि विस्तार (डबल-कोट्स के साथ), या जब दस्तावेज़ डेलीमिटर पर लागू किया जाता है, तो उद्धरण के अन्य दुष्प्रभाव हो सकते हैं। यह आरक्षित शब्दों को भी निष्क्रिय कर देता है और उपनाम विस्तार को प्रभावित करता है।
सारांश
!#$^&*?[(){}<>~;'"`\|=
8-बिट सेट के साथ बॉर्न-जैसे गोले, एसपीसी, टैब, NEWLINE और कुछ बाइट्स विशेष रूप से (कम से कम कुछ संदर्भों में) हो सकते हैं।
विशेष अर्थ को हटाने के लिए इसलिए उन्हें शाब्दिक रूप से व्यवहार किया जाता है, आप उद्धरण का उपयोग करते हैं।
उपयोग:
'...'
हर चरित्र का विशेष अर्थ निकालने के लिए:
printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
single arguments (without the enclosing quotes) to `printf`'
\
केवल एक वर्ण का विशेष अर्थ निकालने के लिए:
printf '<%s>\n' foo bar\ baz #comment
ऊपर, केवल एक \
से पहले के अंतरिक्ष चरित्र को शाब्दिक रूप से पारित किया जाता है printf
। अन्य लोगों को शेल द्वारा टोकन डेलिमिटर के रूप में माना जाता है।
- का उपयोग
"..."
वर्ण, जबकि अभी भी पैरामीटर विस्तार की इजाजत दी उद्धृत करने के लिए ( $var
, $#
, ${foo#bar}
...), गणित विस्तार ( $((1+1))
भी $[1+1]
कुछ गोले में) और आदेश प्रतिस्थापन ( $(...)
या पुराने प्रपत्र `...`
। वास्तव में, ज्यादातर समय, आप अंदर उन विस्तार रखना चाहते हैं किसी भी मामले में दोहरे उद्धरण चिह्नों । आप उपयोग कर सकते हैं \
के भीतर "..."
(लेकिन केवल उन) अक्षर हैं जो अभी भी विशेष कर रहे हैं के विशेष अर्थ निकालने के लिए।
यदि स्ट्रिंग '
चरित्र, आप अभी भी उपयोग कर सकते हैं '...'
आराम के लिए और अन्य के हवाले से तंत्र कि बोली कर सकते हैं का उपयोग करें '
की तरह "'"
या \'
या (जहां उपलब्ध हो) $'\''
:
echo 'This is "tricky", isn'\''t it?'
$(...)
कमांड प्रतिस्थापन के आधुनिक रूप का उपयोग करें । केवल `...`
बॉर्न शेल के साथ संगतता के लिए पुराने का उपयोग करें , जो कि बहुत पुरानी प्रणाली के लिए है, और केवल चर असाइनमेंट में, जैसे कि उपयोग न करें:
echo "`echo "foo bar"`"
जो बॉश शेल या एटी एंड टी के संस्करणों के साथ काम नहीं करेगा। या:
echo "`echo \"foo bar\"`"
जो बॉर्न और एटी एंड टी के साथ काम करेगा, लेकिन इसके साथ नहीं yash
, लेकिन उपयोग करें:
var=`echo "foo bar"`; echo "$var"
जो सभी के साथ काम करेगा।
दोहरे उद्धरण चिह्नों के साथ उन्हें चित्रित करना भी असंभव है, इसलिए फिर से, चर का उपयोग करें। विशेष बैकलैश प्रसंस्करण से भी सावधान रहें:
var=`printf '%s\n' '\\'`
विल केवल एक बैकस्लैश अंदर की दुकान $var
, (के लिए बैकस्लैश प्रसंस्करण की एक अतिरिक्त स्तर है वहाँ क्योंकि \
, `, और $
(और भी "
जब में छोड़कर उद्धृत yash
)) बैकटिक भीतर तो आप या तो जरूरत
var=`printf '%s\n' '\\\\'`
या
var=`printf '%s\n' '\\\'
बजाय।
Csh परिवार
csh और tcsh में काफी अलग सिंटैक्स होता है, हालांकि बॉर्न शेल के साथ अभी भी बहुत कुछ है क्योंकि वे एक समान विरासत साझा करते हैं।
विशेष वर्ण:
"\'&|;()^`<>$
, स्थान, न्यूलाइन और टैब हर जगह विशेष हैं जब उद्धृत नहीं किया गया है।
#
(csh वह शेल होता है जिसे #
टिप्पणी नेता के रूप में पेश किया जाता है) एक स्क्रिप्ट की शुरुआत में या एक अनछुए स्थान, टैब या न्यूलाइन का अनुसरण करने के लिए विशेष है।
*?[
ग्लोबिंग ऑपरेटरों के रूप में विशेष हैं ताकि सूची संदर्भों में
{non-empty-string}
विशेष है (csh वह शेल है जिसने ब्रेस विस्तार पेश किया है)।
!
और ^
इतिहास विस्तार (फिर से, एक csh आविष्कार) के हिस्से के रूप में विशेष हैं, और उद्धृत नियम विशेष हैं।
~
(टिल्ड विस्तार भी एक csh आविष्कार) कुछ संदर्भों में विशेष है।
संचालकों को उद्धृत करते हुए
वे बॉर्न शेल के समान हैं, लेकिन व्यवहार भिन्न होता है। tcsh वाक्य-विन्यास की दृष्टि से csh की तरह व्यवहार करता है, आप पाएंगे कि csh के कई संस्करणों में गंदे कीड़े हैं। Tsh का नवीनतम संस्करण प्राप्त करें, csh का लगभग कार्यशील संस्करण प्राप्त करने के लिए।
\
न्यूलाइन (बॉर्न शेल के लिए समान) को छोड़कर एक एकल चरित्र से बच जाता है। यह एकमात्र उद्धृत ऑपरेटर है जो बच सकता है !
। \<newline>
यह नहीं बचता है, लेकिन इसे एक कमांड विभाजक से टोकन विभाजक में बदल देता है (जैसे अंतरिक्ष)
"..."
ही है, को छोड़कर सभी पात्रों निकल जाता है $
, `
, न्यू लाइन और !
। बॉर्न शेल के विपरीत, आप \
बचने के लिए $
और `
अंदर का उपयोग नहीं कर सकते हैं "..."
, लेकिन आप \
भागने !
या न्यूलाइन (लेकिन खुद को छोड़कर नहीं जब किसी !
न्यूलाइन से पहले ) का उपयोग कर सकते हैं । एक शाब्दिक !
है "\!"
और एक शाब्दिक \!
है "\\!"
।
'...'
खुद को छोड़कर सभी पात्रों से बचता है, !
और न्यूलाइन। दोहरे उद्धरण चिह्नों की तरह, !
और बैकलाइन के साथ न्यूलाइन से बच सकते हैं।
- कमांड प्रतिस्थापन केवल
`...`
सिंटैक्स के माध्यम से होता है और इसे शायद ही मज़बूती से उपयोग किया जा सकता है।
- चर प्रतिस्थापन भी बहुत बुरी तरह से डिजाइन और त्रुटि प्रवण है। एक
$var:q
ऑपरेटर अधिक विश्वसनीय कोड लिखने में मदद करता है जिसमें चर शामिल होते हैं।
सारांश
अगर आप कर सकते हैं तो csh से दूर रहें। यदि आप उपयोग नहीं कर सकते हैं:
- अधिकांश पात्रों को उद्धृत करने के लिए एकल उद्धरण।
!
और newline अभी भी एक की जरूरत है \
।
\
अधिकांश पात्रों से बच सकते हैं
"..."
इसके भीतर कुछ विस्तार की अनुमति दे सकते हैं, लेकिन यह बहुत छोटी बात है कि अगर वे newline और / या बैकस्लैश वर्णों को एम्बेड करते हैं, तो सबसे अच्छा केवल एकल उद्धरण का उपयोग कर सकते हैं और $var:q
चर विस्तार के लिए। यदि आप किसी सरणी के तत्वों को मज़बूती से जोड़ना चाहते हैं तो आपको लूप का उपयोग करने की आवश्यकता होगी।
rc
परिवार
rc
है plan9
खोल और उसके वंश की तरह es
और akanga
यूनिक्स और यूनिक्स पसंद में पोर्ट किया गया है। यह एक बहुत क्लीनर और बेहतर वाक्यविन्यास के साथ एक खोल है और अगर हम पिछड़े संगतता के लिए बोर्न जैसे गोले के साथ फंस नहीं थे, तो हर कोई इसका उपयोग करेगा।
rc
/akanga
विशेष वर्ण
#;&|^$=`'{}()<>
, जब उद्धृत नहीं किया जाता है तो SPC, TAB और NEWLINE हमेशा विशेष होते हैं।
*?[
ग्लोबिंग ऑपरेटर हैं।
कोट करने वाला संचालक
'...'
केवल उद्धृत ऑपरेटर है। एक कोष्ठक के रूप में एकल उद्धरण के '
साथ लिखा ''
है:
echo 'it''s so simple isn''t it?'
es
es
के आधार पर एक प्रायोगिक खोल के रूप में देखा जा सकता है rc
।
हालांकि इसमें कुछ अंतर हैं। इस क्यू / ए के लिए ब्याज की एक \
यह भी एक उद्धृत ऑपरेटर है (जो न्यूलाइन को छोड़कर सभी विशेष वर्णों को उद्धृत करता है) और बैकस्लैश के \n
लिए न्यूलाइन की तरह भागने के क्रम का परिचय देने के लिए भी इस्तेमाल किया जा सकता है \b
...
मछली
मछली एक रिश्तेदार नवागंतुक है (लगभग 2005), मुख्य रूप से इंटरैक्टिव उपयोग के लिए अभिप्रेत है और अन्य गोले से काफी अलग सिंटैक्स भी है।
विशेष वर्ण
"'\()$%{}^<>;&|
हमेशा विशेष जब उद्धृत नहीं किया जाता है (ध्यान दें %
(विस्तार के लिए) अन्य गोले से एक महत्वपूर्ण अंतर के रूप में, और `
विशेष नहीं है)
#
(टिप्पणी) विशेष जब निर्विवाद स्थान, टैब, न्यूलाइन या का पालन कर रहा हो ;&|^<>
*?
(लेकिन नहीं [...]
) ग्लोबिंग ऑपरेटर
संचालकों को उद्धृत करते हुए
\
न्यू लाइन को छोड़कर एक भी विशेष वर्ण उद्धरण है, लेकिन सावधान रहना यह भी एक सी एस्केप अनुक्रम (के रूप में दोगुना हो जाता है \n
, \b
...) परिचयकर्ता। IOW, \n
एक उद्धृत नहीं n
बल्कि एक नई पंक्ति है।
"..."
सब कुछ लेकिन खुद को, $
और उन लोगों से बचने के लिए बैकस्लैश और बैकस्लैश का उपयोग किया जा सकता है। \<newline>
एक लाइन निरंतरता (हटाया) अंदर है "..."
।
'...'
सब कुछ लेकिन खुद को और \
, और आप उन से बचने के लिए बैकस्लैश का उपयोग कर सकते हैं।
=
,@
और%
कुछ संदर्भों में कुछ गोले में विशेष हैं।