एक हेरेडोक में चर को स्थापित करना और स्थापित करना


18

मेरे पास एक स्क्रिप्ट है जिसमें कई अलग-अलग रिमोट मशीनों पर कई अलग-अलग काम करने हैं। मैंने सोचा था कि एक हियरडॉक इस के लिए काम करेंगे, लेकिन मैं एक चर स्क्रिप्ट में कहीं परिभाषित का उपयोग करने में सक्षम नहीं हूँ और एक हियरडॉक में परिभाषित किया।

यहाँ कुछ कोड है:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

यह केवल निम्नलिखित प्रिंट करता है:

foo =

बार = बार

यदि, हालांकि, मैं ईओएफ लाइन को इस तरह उद्धृत करता हूं: ssh some.remote.host << "EOF" तो यह केवल निम्नलिखित प्रिंट करता है:

FOO = foo

बार =

किसी भी संकेत पर कि मैं हेरेडोक के अंदर दोनों चर का उपयोग कैसे कर सकता हूं ?

धन्यवाद।

जवाबों:


27

संक्षेप में, उपयोग करें:

  • निर्विवाद वंशानुगत खोजशब्द, जैसे, EOF
  • बाहरी (यानी स्थानीय ) चर के लिए नियमित रूप से डॉलर चार , जैसे,$FOO
  • इनर (यानी दूरस्थ ) चर के लिए डॉलर के चार भाग , जैसे\$BAR

आप हियरडॉक कीवर्ड छोड़ देते हैं (यानी EOF) तो गैर उद्धृत हियरडॉक शरीर स्थानीय रूप से संसाधित किया जाता है, ताकि $FOOकरने के लिए विस्तारित किया गया है fooऔर BARरिक्त स्ट्रिंग के लिए विस्तार किया गया है। तब आपकी sshआज्ञा बन जाती है:

BAR="bar"
echo "FOO=foo"
echo "BAR="

यदि आप heredoc कीवर्ड को उद्धृत करते हैं तो चर विस्तार को दबा दिया जाता है, ताकि आपकी sshकमांड इसके बजाय बन जाए:

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

चूंकि FOOसंभवतः दूरस्थ शेल वातावरण में परिभाषित नहीं किया गया है, इसलिए अभिव्यक्ति "FOO=$FOO"का मूल्यांकन किया जाता है "FOO=''", अर्थात FOOखाली स्ट्रिंग पर सेट किया गया है।

यदि आप दोनों चर का उपयोग करना चाहते हैं, तो आपको heredoc कीवर्ड को निर्विघ्न छोड़ने की आवश्यकता होगी, ताकि चर विस्तार स्थानीय रूप से परिभाषित चर के लिए हो, और फिर (बैकस्लैश के साथ) उस चर से बच जाएं जिसे आप दूरस्थ रूप से विस्तारित करना चाहते हैं, अर्थात :

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=\$BAR"
EOF

इस स्थिति में आपका ssh कमांड (दूरस्थ सर्वर द्वारा प्राप्त) निम्नलिखित होगा:

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"

1
यह बहुत अच्छा है! मैंने यह पता लगाने के लिए उम्र बिताई है। इस समाधान के लिए बहुत-बहुत धन्यवाद।
trubliphone
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.