ऐसा लगता है कि आपकी कमांड संभवतः कमांड-लाइन पर दिए गए तर्कों के आधार पर पर्यावरण चर निर्धारित कर रही है। यह आप कर सकते हैं:
CLUSTER=cl1; cluster=$CLUSTER command
... और आह्वान पर इसके लिए अपना वातावरण निर्धारित किया।
अन्यथा, शेल उद्धरण आमतौर पर तर्क वितर्क करते हैं या शेल व्याख्या से अन्य विशेष शेल वर्णों से बच जाते हैं। आप विभिन्न नियमों के आधार पर अन्य प्रकारों के भीतर विभिन्न प्रकार के शेल-कोट्स (और इसलिए बच सकते हैं ) :
"''''"
- एक सॉफ्ट-कोटेड स्ट्रिंग में किसी भी संख्या में हार्ड-कोट्स हो सकते हैं।
"\""
- एक \
बैकस्लैश "
एक "
नरम-उद्धृत स्ट्रिंग के भीतर एक नरम- उद्धरण से बच सकता है ।
- इस संदर्भ में एक
\\
बैकस्लैश भी खुद से बच जाता है, \$
विस्तार टोकन, और \n
नीचे बताए अनुसार ईवलाइन, लेकिन अन्यथा शाब्दिक रूप से व्यवहार किया जाता है।
"${expand} and then some"
- एक नरम-उद्धृत स्ट्रिंग में एक व्याख्या किए गए शेल $
विस्तार हो सकते हैं ।
'"\'
- '
हार्ड-कोटेड स्ट्रिंग में हार्ड-कोट के अलावा कोई भी चरित्र हो सकता है '
।
\
- एक अयोग्य बैकस्लैश शाब्दिक व्याख्या के लिए किसी भी निम्नलिखित चरित्र से बच जाएगा - यहां तक कि एक अन्य बैकस्लैश - एक \n
ईवालाइन को छोड़कर ।
- एक
\\n
ewline केस में, \
बैकस्लैश और ewline दोनों \n
को पूरी तरह से परिणामी व्याख्या की गई कमांड से हटा दिया जाता है।
${parameter+expand "$parameter"}
- शेल विस्तार से उत्पन्न उद्धरण कुछ विशेष मामलों को छोड़कर लगभग कभी भी सीमांकक मार्कर के रूप में काम नहीं करते हैं। मैं यहाँ इनका वर्णन करने का उपक्रम नहीं करूँगा।
मैं इसे अजीब मानता हूं कि कोई भी एप्लिकेशन अपने कमांड-लाइन आर्ग में उद्धरण की व्याख्या करेगा। इस तरह का अभ्यास बहुत मायने नहीं रखता है - गोले के लिए, कम से कम - एक उद्धरण का प्राथमिक उद्देश्य आम तौर पर एक तर्क को परिसीमित करना है। आह्वान पर, हालांकि, तर्कों को हमेशा पहले ही\0NUL
पात्रों के साथ सीमांकित किया जाता है और इसलिए एक उद्धरण बहुत उद्देश्य से काम नहीं कर सकता है।
यहां तक कि एक शेल आम तौर पर केवल एक आह्वान तर्क में उद्धरण की व्याख्या करने के लिए परेशान करेगा जब इसे एक -c
स्विच के साथ कहा जाता है - जो यह दर्शाता है कि इसका पहला ऑपरेंड वास्तव में एक शेल स्क्रिप्ट है जिसे इसे आह्वान पर चलना चाहिए। यह दो बार मूल्यांकन किए गए इनपुट का मामला है ।
सभी ने कहा, आप कमांड-लाइन पर तर्कों के माध्यम से शाब्दिक उद्धरण पारित करने के लिए कई चीजें कर सकते हैं। उदाहरण के लिए:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
जैसा कि मैंने पहले एक टिप्पणी में उल्लेख किया है, आप "
एक विस्तार के भीतर उद्धरणों को समाहित कर सकते हैं जो स्वयं "
उद्धृत है।
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
आप उद्धृत स्ट्रिंग के भीतर "
एक \
बैकस्लैश के साथ बच सकते हैं "
।
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
आप अपने इच्छित अंतिम परिणाम के लिए @jimmij नोट के रूप में आने के लिए शैलियों को वैकल्पिक और संक्षिप्त कर सकते हैं ।
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
आप फ़ाइल नाम पीढ़ी और $IFS
विभाजन दोनों को अक्षम कर सकते हैं - जिससे $expansion
सभी को उद्धृत करने की आवश्यकता से बचा जा सकता है - और इसलिए केवल उद्धरण उद्धृत करें। यह शायद ओवरकिल है।
अंत में, एक और प्रकार का शेल-उद्धरण है जिसका उपयोग किया जा सकता है। जैसा कि मैंने उल्लेख किया है कि sh -c "$scriptlet"
शेल मंगलाचरण के रूप में अक्सर कमांड-लाइन पर शेल की स्क्रिप्ट प्रदान करने के लिए उपयोग किया जाता है। जब $scriptlet
इस तरह के जब उद्धरण अन्य उद्धरण शामिल होना चाहिए के रूप में - - हालांकि जटिल हो जाता है यह अक्सर एक यहाँ-दस्तावेज़ और प्रयोग करने में फायदेमंद हो सकता है sh -s
जहां खोल विशेष रूप से सभी निम्नलिखित आवंटित करने के लिए निर्देश दिया जाता है - के बजाय ऑपरेंड के रूप में यह एक में करना होगा स्थितीय मापदंडों के -c
मामले और फिर भी इसकी स्क्रिप्ट को लेना है stdin
।
यदि आपके कमांड को इस तरह से उद्धरणों की व्याख्या करनी चाहिए तो मैं इसे बेहतर समझूंगा यदि यह एक फ़ाइल इनपुट में ऐसा कर सकता है। उदाहरण के लिए:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
यदि आप <<here-document
तत्कालीन सीमांकक को उद्धृत नहीं करते हैं, तो इसकी सभी सामग्रियों का लगभग वैसा ही व्यवहार किया जाता है, जैसा कि वे "
नरम-उद्धृत किया गया था - सिवाय इसके कि "
दोहरे उद्धरणों का स्वयं विशेष रूप से व्यवहार नहीं किया जाता है। और इसलिए अगर हम इसके cat
बजाय ऊपर चलाते हैं :
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... यह प्रिंट करता है ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"