bash - बैश में कमांड में सिंगल कोट्स के अंदर परिवर्तनीय का विस्तार




shell variables (4)

मैं एक बैश खोल स्क्रिप्ट से एक कमांड चलाने के लिए चाहता हूं जिसमें सिंगल कोट्स और एक अन्य चर के अंदर सिंगल कोट्स और कुछ अन्य कमांड हों।

उदाहरण के लिए repo forall -c '....$variable'

इस प्रारूप में, $ बच निकला है और चर का विस्तार नहीं किया गया है।

मैंने निम्नलिखित बदलावों की कोशिश की लेकिन उन्हें अस्वीकार कर दिया गया:

repo forall -c '...."$variable" '

repo forall -c " '....$variable' "

" repo forall -c '....$variable' "

repo forall -c "'" ....$variable "'"

यदि मैं चर के स्थान पर मान को प्रतिस्थापित करता हूं तो आदेश को ठीक से निष्पादित किया जाता है।

कृपया मुझे बताएं कि मैं गलत कहां जा रहा हूं।


क्या यह आपके लिए काम करता है?

eval repo forall -c '....$variable'

नीचे मेरे लिए क्या काम किया है -

QUOTE="'" hive -e "alter table TBL_NAME set location $QUOTE$TBL_HDFS_DIR_PATH$QUOTE"


repo कमांड इस बात पर ध्यान नहीं दे सकता कि यह किस तरह के उद्धरण प्राप्त करता है। यदि आपको पैरामीटर विस्तार की आवश्यकता है, तो डबल कोट्स का उपयोग करें। यदि इसका मतलब है कि आप बहुत सारी चीजों को बैकस्लैश करने के लिए हवादार हैं, तो अधिकांश के लिए सिंगल कोट्स का उपयोग करें, और फिर उनसे बाहर निकलें और उस हिस्से के लिए युगल में जाएं जहां आपको विस्तार होने की आवश्यकता है।

repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'

यदि आप रुचि रखते हैं तो स्पष्टीकरण निम्नानुसार है।

जब आप खोल से कमांड चलाते हैं, तो वह आदेश जो तर्क के रूप में प्राप्त करता है वह शून्य-समाप्त तारों की एक सरणी है। उन तारों में बिल्कुल कोई गैर-शून्य चरित्र हो सकता है।

लेकिन जब खोल कमांड लाइन से तारों की उस सरणी का निर्माण कर रहा है, तो यह कुछ पात्रों को विशेष रूप से व्याख्या करता है; यह टाइप करने के लिए आदेशों को आसान (वास्तव में, संभव) बनाने के लिए डिज़ाइन किया गया है। उदाहरण के लिए, रिक्त स्थान सामान्य रूप से सरणी में तारों के बीच की सीमा को इंगित करते हैं; इसी कारण से, व्यक्तिगत तर्क कभी-कभी "शब्द" कहा जाता है। लेकिन फिर भी एक तर्क में रिक्त स्थान हो सकते हैं; आपको शेल को बताने के लिए बस कुछ रास्ता चाहिए जो आप चाहते हैं।

उस अक्षर का शाब्दिक रूप से इलाज करने के लिए खोल को बताने के लिए आप किसी भी चरित्र (अंतरिक्ष, या अन्य बैकस्लैश सहित) के सामने बैकस्लैश का उपयोग कर सकते हैं। लेकिन जब आप ऐसा कुछ कर सकते हैं:

echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier

... यह थकाऊ हो सकता है। तो खोल एक विकल्प प्रदान करता है: उद्धरण चिह्न। ये दो मुख्य किस्मों में आते हैं।

डबल-कोटेशन अंक को "ग्रुपिंग कोट्स" कहा जाता है। वे वाइल्डकार्ड और उपनामों को विस्तारित होने से रोकते हैं, लेकिन ज्यादातर वे एक शब्द में रिक्त स्थान शामिल हैं। पैरामीटर और कमांड विस्तार जैसे अन्य चीजें (एक $ द्वारा संकेतित चीज के प्रकार) अभी भी होती हैं। और निश्चित रूप से यदि आप डबल-कोट्स के अंदर एक शाब्दिक डबल-कोट चाहते हैं, तो आपको इसे बैकस्लैश करना होगा:

echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"

एकल उद्धरण चिह्न अधिक draconian हैं। बैकस्लाश सहित, उनके बीच की हर चीज पूरी तरह शाब्दिक रूप से ली जाती है। सिंगल कोट्स के अंदर एक शाब्दिक सिंगल कोट प्राप्त करने का बिल्कुल कोई तरीका नहीं है।

सौभाग्य से, खोल में उद्धरण चिह्न शब्द delimiters नहीं हैं ; अपने आप से, वे एक शब्द को समाप्त नहीं करते हैं। वांछित परिणाम प्राप्त करने के लिए आप एक ही शब्द के भीतर उद्धरण (या विभिन्न प्रकार के उद्धरणों के बीच) में जा सकते हैं:

echo '"Thank you. That'\''ll be $4.96, please," said the cashier'

तो यह आसान है - बहुत कम बैकस्लाश, हालांकि क्लोज-सिंगल-कोट, बैकस्लाश-शाब्दिक-सिंगल-कोट, ओपन-सिंगल-कोट अनुक्रम कुछ उपयोग करने में आता है।

आधुनिक गोले ने एक और उद्धरण शैली जोड़ा है जो पॉज़िक्स मानक द्वारा निर्दिष्ट नहीं है, जिसमें प्रमुख एकल उद्धरण चिह्न एक डॉलर के चिह्न के साथ उपसर्ग किया गया है। इतने उद्धृत स्ट्रिंग्स एएनएसआई सी प्रोग्रामिंग भाषा में अक्षर लिखने के लिए समान सम्मेलनों का पालन करते हैं, और इसलिए उन्हें कभी-कभी "एएनएसआई स्ट्रिंग्स" और $' ... ' जोड़ी "एएनएसआई उद्धरण" कहा जाता है। ऐसे तारों के भीतर, बैकस्लाश के बारे में उपर्युक्त सलाह सचमुच लागू नहीं होती है। इसके बजाए, वे फिर से विशेष हो जाते हैं - न केवल आप इसे एक बैकस्लैश तैयार करके एक शाब्दिक एकल उद्धरण चिह्न या बैकस्लैश भी शामिल कर सकते हैं, लेकिन खोल भी एएनएसआई सी चरित्र से बच निकलता है (जैसे \n एक नई लाइन के लिए, टैब के लिए \t , और हेक्साडेसिमल कोड HH साथ चरित्र के लिए \xHH )। अन्यथा, हालांकि, वे एकल-उद्धृत तारों के रूप में व्यवहार करते हैं: कोई पैरामीटर या कमांड प्रतिस्थापन नहीं होता है:

echo $'"Thank you.  That\'ll be $4.96, please," said the cashier'

ध्यान देने योग्य महत्वपूर्ण बात यह है कि echo कमांड के लिए तर्क के रूप में प्राप्त एकल स्ट्रिंग इन सभी उदाहरणों में बिल्कुल समान है। शेल को कमांड लाइन को पार्स करने के बाद, कमांड चलाने के लिए कोई रास्ता नहीं है कि यह बताने के लिए कि क्या उद्धृत किया गया था। यहां तक ​​कि अगर यह चाहता था।


संपादित करें: (प्रश्न में टिप्पणियों के अनुसार :)

तब से मैं इसमें देख रहा हूं। मैं भाग्यशाली था कि मैं रेपो चारों ओर बिछा रहा था। फिर भी यह मुझे स्पष्ट नहीं है कि आपको बल द्वारा एकल उद्धरण के बीच अपने आदेशों को संलग्न करने की आवश्यकता है या नहीं। मैंने रेपो सिंटैक्स में देखा और मुझे नहीं लगता कि आपको इसकी आवश्यकता है। आप अपने आदेश के चारों ओर डबल कोट्स का उपयोग कर सकते हैं, और उसके बाद आपको जो भी सिंगल और डबल कोट्स की आवश्यकता होती है, बशर्ते आप दोहरे से बचें।





quotes