कमांड लाइन के तर्क सिस्टम के कमांड शेल द्वारा व्याख्या के अधीन हैं, कमांड के व्यवहार को बदलने या तर्कों के मूल्य को बदलने से पहले उन्हें बुलाया कार्यक्रम में पारित किया जाता है।
जब एक तर्क (जैसे मान के लिए --password
) में एक वर्ण होता है जो शेल की व्याख्या कर सकता है, तो उन्हें या तो उद्धृत करने की आवश्यकता होती है (आमतौर पर विंडोज में एकल उद्धरण '
या दोहरे उद्धरण में संलग्न "
) या व्यक्तिगत रूप से बच गए (आमतौर पर किसी मेटाकाचर \
से पहले बैकस्लैश के साथ) ) खोल द्वारा व्याख्या से बचने के लिए।
हालांकि विशिष्ट वर्ण सिस्टम-विशिष्ट हैं, कुछ वर्णों को शामिल करने के लिए बाहर देखने के लिए:
$ & ! \ [ ] < > `
यदि पासवर्ड, वास्तव में खराब उदाहरण के लिए, पर सेट किया गया था pa$$word
...
mysql --password=pa$$word # does not work
mysql --password='pa$$word' # works
mysql --password=pa\$\$word # works, but slightly unclear what's going on at first glance
आगे की पढाई:
अद्यतन: पासवर्ड में '
एकल या "
दोहरे उद्धरण चिह्नों से बचने के लिए , आप या तो उन्हें एक प्रमुख बैकस्लैश से बच सकते हैं, या उद्धरण के विपरीत शैली में पूरे तर्क को संलग्न कर सकते हैं यदि कोई अन्य वर्ण नहीं हैं जो उद्धृत करने की चुनी हुई शैली संगत नहीं है। साथ में।
mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle
यदि आपके पास एक ही उद्धरण और अन्य विशेष वर्ण हैं, तो आप बैकस्लैश से बचकर भाग रहे हैं क्योंकि, यूनिक्स में, दोहरे उद्धरण एक उद्धरण से "कमजोर" हैं और कई मेटाचैटर अभी भी विस्तारित हैं जब दोहरे उद्धरणों में संलग्न हैं, लेकिन एकल नहीं उद्धरण।
यह MySQL-specific नहीं है, लेकिन कमांड लाइन तर्कों के साथ किसी भी चीज़ पर लागू होता है।
आप आमतौर पर echo
कमांड का उपयोग यह देखने के लिए कर सकते हैं कि शेल आपके तर्कों की व्याख्या कैसे कर रहा है।
$ echo foo$bar
foo # literal 'foo' plus the (empty) shell variable $bar
$ echo foo\$bar
foo$bar # backslash prevents expansion of $bar as a variable
$ echo "foo$$bar" # weaker double quote doesn't prevent expansion so
foo9691bar # the $$ expands to the unix process id (pid) of the current shell
$ echo 'foo$$bar'
foo$$bar # "stronger" single quote prevents shell expansion
$ echo "foo'bar"
foo'bar # double quote allows single quote within the literal
फॉलो-अप: बैश शेल (और संभवतः कुछ अन्य) एकल-उद्धृत स्ट्रिंग्स के भीतर एकल उद्धरण से बचने की अनुमति देता है, हालांकि सम्मेलन विचित्र है (शायद कुछ लंबे समय से भूल गए निर्णय पर आधारित है जो अब समय के क्षणों में खो गए हैं)
पूरे स्ट्रिंग को सिंगल कोट्स में लपेटने से पहले '
स्ट्रिंग के अंदर प्रत्येक को बदलें '\''
... इसलिए शाब्दिक स्ट्रिंग foo'bar
को व्यक्त किया जाता है 'foo'\''bar'
।
जैसा मैंने कहा, विचित्र। इसकी आवश्यकता इसलिए है क्योंकि एक बैकस्लैश एक एकल उद्धरण स्ट्रिंग के बाहर एक एकल उद्धरण से बच जाता है, एक बैकस्लैश बैश में एकल-उद्धृत स्ट्रिंग के अंदर कुछ भी नहीं बचता है , और एकल उद्धृत स्ट्रिंग्स को बंद किया जा सकता है और कई उद्धरणों द्वारा फिर से खोला जा सकता है जब तक कि कोई भी अनपेक्षित न हों। ऐसे पात्रों का हस्तक्षेप करना जिनके विशेष अर्थ हैं। तो '\''
स्ट्रिंग के उद्धरण को बंद कर देता है, फिर बच गए शाब्दिक की आपूर्ति करता है, फिर स्ट्रिंग के उद्धरण को फिर से खोल देता है।