2012-01-14 20 views
6

我需要使用curl讀取某些數據。我基本上是從文件中讀取關鍵字Bash捲曲和變量在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 

無論如何,我還沒有找到一種方法來形成URL捲曲,所以它會工作。我嘗試過所有可能的單引號和雙引號版本。我基本上嘗試:

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

等..只要它命名,我敢肯定,我已經試過了。

當我在最好的情況下打印出URL將形成爲:

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

或類似的東西。如果你知道這可能是什麼原因,我會欣賞這些信息。謝謝!

回答

12

這不是引用問題。問題在於你的關鍵字文件是DOS格式的 - 也就是說,每行都以回車&換行符(\ r \ n)結束,而不是換行符(\ n)。回車正在讀入行變量,幷包含在URL中。贈品是,當你呼應它,它似乎打印:

/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:

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 2012-01-16 20:25:04

4

只是用它這個樣子,應該是足以:

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

如果你的shell爲您提供了&問題,只是把\&,但對我來說工作正常,沒有它。

12

我認爲您的當前版本應該有效。更優雅是使用一個單一的對與周圍的變量對整個URL雙引號中${}

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

這就是我會這樣做。 – 2012-01-14 20:52:25

+0

出於某種原因,它只是不起作用,它使我得到一個文件,說「你的客戶已經發布了一個格式不正確或非法的請求,這就是我們所知道的。」當我回應同樣的結果是「/ subscriptions?v = 2&alt = jsoneeds/api/users/username」所以它確實從文件中讀取了用戶名,但不知何故url仍然是錯誤地構造的。 – Mare 2012-01-14 21:04:00

+0

@Mare:在這裏完美運作。這看起來像來自YouTube的錯誤消息,所以您的請求確實到達了那裏。你的捲曲是最新的嗎? – 2012-01-14 21:06:55

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在這兩個地方。這是可行的,因爲字符串是固定的,不包含shell元字符。

既然你的代碼是接近,但你說你是從文件看到關鍵字在錯誤的地方,也許是爲了便於調試有點重寫是爲了:

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添加到腳本中)運行腳本,並查看shell認爲它正在執行的操作。

+0

由於某些原因,我剛剛評論過上述原因是由於網址。我剛用-x運行它,結果是一樣的,它試圖獲得url /subscriptions?v=2&alt=json.com/feeds/api/users/username也許原因是一些如何與我的外殼,我不知道如果它似乎與其他人一起工作,還有什麼可能呢? – Mare 2012-01-14 21:22:35