2012-01-14 9 views
6

के बीच में बैश कर्ल और चर, मुझे कर्ल का उपयोग करके कुछ डेटा पढ़ने की आवश्यकता होगी। मैं मूल रूप से फ़ाइलयूआरएल

while read line 
do 
    curl 'https://gdata.youtube.com/feeds/api/users/'"${line}"'/subscriptions?v=2&alt=json' \ 
     > '/home/user/archive/'"$line" 
done < textfile.txt 

से कीवर्ड पढ़ रहा हूँ वैसे भी मैं एक तरह से यूआरएल तो कर्ल करने के लिए यह काम करेगा बनाने के लिए नहीं मिली है। मैंने हर संभव एकल और डबल उद्धृत संस्करणों की तरह कोशिश की है। मैंने मूल रूप से कोशिश की है:

'...'"$line"'...' 
"..."${line}"..." 
'...'$line'...' 

और इसी तरह .. बस इसे नाम दें और मुझे पूरा यकीन है कि मैंने इसे आजमाया है।

/subscriptions?v=2&alt=jsoneeds/api/users/KEYWORD FROM FILE 

या कुछ इसी तरह की:

जब मैं सबसे अच्छा मामले में यूआरएल को प्रिंट कर रहा हूँ के रूप में गठित किया जाएगा। यदि आप जानते हैं कि इसका कारण क्या हो सकता है तो मैं जानकारी की सराहना करता हूं। धन्यवाद!

उत्तर

12

यह एक उद्धरण मुद्दा नहीं है। समस्या यह है कि आपकी कीवर्ड फ़ाइल डॉस प्रारूप में है - यानी, प्रत्येक पंक्ति कैरिज रिटर्न & लाइनफीड (\ r \ n) के बजाय लाइनफीड (\ n) के बजाय समाप्त होती है। कैरिज रिटर्न लाइन वैरिएबल में पढ़ा जा रहा है, और यूआरएल में शामिल है।

/subscriptions?v=2&alt=jsoneeds/api/users/KEYWORD FROM FILE" 

लेकिन यह वास्तव में मुद्रण है: सस्ता है कि जब आप इसे गूंज, इसे प्रिंट के लिए प्रकट होता है

https://gdata.youtube.com/feeds/api/users/KEYWORD FROM FILE 
/subscriptions?v=2&alt=json 

...उनके बीच सिर्फ एक कैरिज रिटर्न के साथ, दूसरा दूसरा ओवरराइट करता है।

तो आप इसके बारे में क्या कर सकते हैं? लाइन के अंत में सीआर को ट्रिम करने का एक आसान तरीका यहां दिया गया है:

cr=$'\r' 
while read line 
do 
    line="${line%$cr}" 
    curl "https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json" \ 
     > "/home/user/archive/$line" 
done < textfile.txt 
+0

धन्यवाद! वह रहस्य पूरी तरह हल किया। – Mare

4

बस इस तरह उपयोग, पर्याप्त पर्याप्त होना चाहिए:

curl "https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json" > "/home/user/archive/${line}" 

अपने खोल आप & के साथ मुद्दों देता है, तो बस डाल \&, लेकिन यह इसके बिना मेरे लिए ठीक काम करता है।

12

आपका वर्तमान संस्करण काम करना चाहिए, मुझे लगता है। अधिक सुरुचिपूर्ण ${} में चर के साथ पूरे यूआरएल को दोहरे उद्धरण चिह्नों की एक जोड़ी का उपयोग करने के लिए है:

"https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json" 
+0

इस तरह मैं इसे करूँगा। –

+0

किसी कारण से यह काम नहीं करता है, यह मुझे एक फ़ाइल कहता है "आपके ग्राहक ने एक विकृत या अवैध अनुरोध जारी किया है। हम सब जानते हैं।" और जब मैं एक ही चीज को गूंजता हूं तो परिणाम "/ subscription? v = 2 और alt = jsoneeds/api/उपयोगकर्ता/उपयोगकर्ता नाम" होता है, इसलिए इसने फ़ाइल से उपयोगकर्ता नाम सही पढ़ा लेकिन किसी भी तरह से यूआरएल अभी भी गलत तरीके से बनाया गया है। – Mare

+0

@ मारे: यहां पूरी तरह से काम करता है। यह YouTube से एक त्रुटि संदेश की तरह दिखता है, इसलिए आपका अनुरोध वहां पहुंचा। क्या आपका कर्ल अद्यतित है? –

1

फ़ाइल से डेटा रिक्तियाँ कर सकते हैं और आप में फ़ाइल के नाम में रिक्त स्थान के लिए कोई आपत्ति नहीं /home/user/archive निर्देशिका, तो आपको जो मिला है वह ठीक होना चाहिए।

शेष URL की सामग्री को देखते हुए, आप भी बस लिख सकते हैं:

while read line 
do 
    curl "https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json" \ 
     > "/home/user/archive/${line}" 
done < textfile.txt 

जहां सख्ती से ${line} दोनों जगहों पर सिर्फ $line हो सकता है। यह काम करता है क्योंकि तार तय किए जाते हैं और इसमें शैल मेटाएक्टेक्टर नहीं होते हैं।

जब से तुम कर रहे हैं कोड इस के करीब है, लेकिन आप का दावा है कि आप गलत जगह पर फ़ाइल से कीवर्ड को देख रहे हैं, हो सकता है डिबगिंग में आसानी के लिए एक छोटे से नए सिरे से लिखना क्रम में है:

while read line 
do 
    url="https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json" 
    file="/home/user/archive/${line}" 
    curl "$url" > "$file" 
done < textfile.txt 

चूंकि तार रिक्त स्थान वाले हो सकते हैं, ऐसा लगता है (क्या आपको URL में + पर रिक्त स्थान का विस्तार करने की आवश्यकता है?), चर के चारों ओर उद्धरणों की दृढ़ता से अनुशंसा की जाती है। अब आप स्क्रिप्ट को sh -x (या स्क्रिप्ट में set -x लाइन जोड़ें) के साथ स्क्रिप्ट चला सकते हैं और देखें कि शैल क्या सोचता है कि यह कर रहा है क्योंकि यह कर रहा है।

+0

जैसा कि मैंने किसी कारण से ऊपर टिप्पणी की है, यूआरएल के साथ कारण है। मैंने बस इसे एक्स के साथ चलाया और परिणाम वही था जो यूआरएल/सदस्यता प्राप्त करने की कोशिश करता है? V=2&alt=json.com/feeds/api/users/username शायद कारण है कि मेरे खोल के साथ, मुझे नहीं पता अगर यह हर किसी के साथ काम करता है तो यह और क्या हो सकता है। – Mare