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


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.