पैरेंट शेल में उपलब्ध सबस्क्रिप्शन से वैरिएबल कैसे बनाएं


11

मैंने एक वेब सेवा से कुछ रिपोर्टों के लिए समय-समय पर एक त्वरित और गंदी स्क्रिप्ट लिखी है:

BASE_URL='http://example.com/json/webservice/'
FIRST=1
FINAL=10000

for report_code in $(seq 1 $FINAL); do
  (time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time

  echo $response  # <------- this is out of scope!  How do I fix that?
  if [[ $response = '404' ]]; then
    echo "Deleting report # ${report_code}!"
    rm ${report_code}
  else
    echo "${report_code} seems to be good!"
  fi
done

मुझे timeकमांड को एक उपखंड में लपेटने की आवश्यकता है ताकि मैं इसके आउटपुट को पुनर्निर्देशित कर सकूं, लेकिन यह $responseमूल शेल के लिए अनुपलब्ध का मूल्य बनाता है । मैं इस समस्या के आसपास कैसे पहुँचूँ?

जवाबों:


11

आप एक चर के मान को उसके अभिभावक के उपखंड से नहीं ला सकते हैं, बिना कुछ त्रुटि-प्रवण मार्शलिंग और बोझिल संचार किए बिना।

सौभाग्य से, आपको यहां एक उपधारा की आवश्यकता नहीं है। पुनर्निर्देशन केवल आवश्यकता है समूहीकरण आदेश के साथ { … }, नहीं एक subshell।

{ time -p response=$(curl --write-out '%{http_code}' --silent -O "${BASE_URL}/${report_code}"); } 2> "${report_code}.time"

( चर प्रतिस्थापन के आसपास दोहरे उद्धरण मत भूलना ।)


यह मजेदार है कि हर प्रोग्रामिंग भाषा ऐसा कर सकती है। मैं पहले से ही खोल में कोई संभव समाधान के साथ 1h googling बिताया। im निराश।
को

1
@ToKra No. कोई प्रोग्रामिंग भाषा ऐसा नहीं कर सकती है। (लगभग) कोई भी प्रोग्रामिंग भाषा अपने माता-पिता के लिए एक सबरूटीन या इंस्ट्रक्शन ब्लॉक से एक वैरिएबल का मान ला सकती है , और ठीक यही है जो मैं अपने उत्तर में समझाता हूं: { … }एक सबडेल के बजाय कमांड ग्रुपिंग का उपयोग करें ( … )
गाइल्स का SO- बुराई पर रोक '17

4

Fellow U & L उपयोगकर्ता: main()फ़ंक्शन के साथ C- शैली का उपयोग करने के लिए मेरे उत्तर को अस्वीकार करने से पहले , कृपया इस लिंक पर जाएं : https://unix.stackexchange.com/a/313561/85039 लिपियों में मुख्य कार्यों का उपयोग करना एक आम बात है, कई पेशेवरों द्वारा उपयोग किया जाता है मैदान में।


जैसा कि गिल्स ने बताया, सब-वे अपने वातावरण के बाहर चर उपलब्ध नहीं करा सकते। लेकिन इस समस्या को दूसरे कोण से देखें - यदि आप अपनी स्क्रिप्ट को कार्यों में लिखते हैं, तो चर को घोषित करना संभव है localऔर इसे संपादित किया जा सकता है।

बैश 4.3 के मैनुअल से, localविवरण:

... जब किसी फ़ंक्शन के भीतर स्थानीय का उपयोग किया जाता है, तो यह चर नाम के कारण उस फ़ंक्शन और उसके बच्चों तक सीमित दृश्यमान गुंजाइश होती है ...

उदाहरण:

#!/bin/bash

outter()
{
    for i in $(seq 1 3)
    do
        var=$i
    done
}

main()
{
    local var=0
    outter
    echo $var
}
main "$@"
$ ./testscript.sh                                                                                                        
3

जैसा कि आप लूपिंग फ़ंक्शन के 3 पुनरावृत्तियों के बाद देख सकते हैं, चर को संशोधित किया गया है।


हम्म, सी प्रोग्रामर के लिए अनपेक्षित व्यवहार। मैं आमतौर पर outterवैश्विक उदाहरण का उल्लेख करना चाहता हूं var
रुस्लान

इस जवाब में कुछ खामियां हैं। "$var"कॉल आउट में आवश्यक नहीं है outter। यह कुछ भी नहीं करता है। और local var=0कुछ करता भी नहीं; जैसा कि आपने कहा था कि outterक्या कॉल ओवरराइट करता है var
गोल्लर रामबलर

@ GolarRamblar को मैंने "$var"स्थिति-संबंधी तर्क के रूप में हटा दिया है outter; निष्पक्ष होना, यह एक आदत से बाहर है। क्या आप local var=0 भाग के रूप में विस्तृत कर सकते हैं ?
सर्गी कोलोडियाज़नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.