बश में परिवर्तनशील के लिए आउटपुट असाइन करें


165

मैं एक चर में cURL के उत्पादन को असाइन करने की कोशिश कर रहा हूँ जैसे:

#!/bin/sh
$IP=`curl automation.whatismyip.com/n09230945.asp`
echo $IP
sed s/IP/$IP/ nsupdate.txt | nsupdate

हालाँकि, जब मैं स्क्रिप्ट चलाता हूँ तो निम्न होता है:

./update.sh: 3: =[my ip address]: not found

मैं $IPसही तरीके से आउटपुट कैसे प्राप्त कर सकता हूं ?


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

धन्यवाद @ChristopherHunter, मैं यहाँ आया था बस इस की तलाश में। हालांकि यह इस तरह से व्यवहार क्यों करता है?
अमय

@Amey मैं वास्तव में यह नहीं कह सकता कि तर्क क्या था, बस यही है कि जब आप इसे एक तर्क के रूप में मल्टी-लाइन स्ट्रिंग देते हैं तो इको व्यवहार होता है।
क्रिस्टोफर हंटर

जवाबों:


288

शेल में, आप एक वेरिएबल के सामने $ नहीं डालते हैं जिसे आप असाइन कर रहे हैं। जब आप चर का जिक्र कर रहे हों तब आप केवल $ IP का उपयोग करते हैं।

#!/bin/bash

IP=$(curl automation.whatismyip.com/n09230945.asp)

echo "$IP"

sed "s/IP/$IP/" nsupdate.txt | nsupdate

2
क्या आउटपुट और प्रोग्रेस बार को दबाने का कोई तरीका है curl? -silentपत्ते जोड़ना $IPखाली ...
Dror

4
@ ड्रेड, curlअपना शोर आउटपुट स्टडर को भेजता है, इसलिए इस तरह की स्क्रिप्ट के मामले में प्रगति बार को अनदेखा किया जाना चाहिए। फिर भी, --silentया -sठीक काम करता है। यदि आपको परेशानी है, तो कृपया एक प्रश्न पूछें
घोटी

curl -sप्रगति बार और त्रुटि संदेशों को अक्षम करने के लिए उपयोग करें ।
सेरिएन

आप हमेशा पुनर्निर्देशित कर सकते हैं stderr:IP=$(curl <url> 2>/dev/null)
BallpointBen

$ () सिंटैक्स के साथ खोज करना मैं env वेरिएबल्स का उपयोग करने में सक्षम नहीं हूं, उदाहरण के लिए ईमेल को हार्ड कोडिंग के बजाय मैं $ 2, $ 3 का उपयोग करना चाहता हूं। क्यों इन अभ्यस्त प्रस्तुत करने पर कोई विचार?
इवान बर्बिज

28

कुछ और अधिक जटिल के साथ ... उदाहरण के भीतर से ec2 उदाहरण क्षेत्र हो रही है।

INSTANCE_REGION=$(curl -s 'http://169.254.169.254/latest/dynamic/instance-identity/document' | python -c "import sys, json; print json.load(sys.stdin)['region']")

echo $INSTANCE_REGION

यह वही था जो मैं अपनी बैश स्क्रिप्ट में कर रहा था और आपने मुझे एप-गेट स्थापित करने से बचा लिया!
नुंगस्टर

यह खिड़कियों पर कैसे किया जा सकता है? अगर मैं $साथ विकल्प देता हूं os.system, तो INSTANCE_REGION में आउटपुट का मूल्य नहीं है।
हेंज

उस मल्टी-लाइन को कैसे बनाया जाए?
खलील घरौई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.