2012-01-14 2 views
6

カールを使って特定のデータを読む必要があります。私は基本的にとにかく私はそれがうまくいくようにカールするURLを形成するための方法を発見していないファイル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}"..." 
'...'$line'...' 

など..私はそれを試したと確信しています。

私はそれのように形成される最良のケースでURLをプリントアウトしています:

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

または類似した何か。これの原因が何であるか分かっていれば、私はその情報を感謝します。ありがとう!

答えて

12

引用の問題ではありません。問題は、キーワードファイルがDOS形式であることです。つまり、改行(\ n)ではなく、各行がキャリッジリターン&改行(\ r \ n)で終了します。キャリッジリターンがline変数に読み込まれ、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 

を...両者の間にキャリッジリターンがあるので、2番目が最初の文字を上書きします。

あなたはそれについて何ができますか?ここでは、行の最後に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

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

何らかの理由で「クライアントが不正または不正なリクエストを出した」というファイルが私には間に合わないだけです。 "/ subscriptions?v = 2&alt = jsoneeds/api/users/username"だから、ファイルからユーザー名を読み取ってしまったのですが、どういうわけかurlは間違って構築されています。 – Mare

+0

@Mare:ここでは完璧に動作します。 YouTubeからのエラーメッセージのように見えるので、あなたのリクエストはそこに届きました。あなたのカールは最新ですか? –

1

:よりエレガントな${}内の変数にURL全体を二重引用符で囲むの単一のペアを使用することです/home/user/archiveディレクトリにある場合は、あなたが持っているものはOKであるはずです。 URLの残りの部分の内容を考えると

、あなたも、単に書くことができます:厳密に${line}はちょうど$line両方の場所で可能性があり

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 

を。これは、文字列が固定されており、シェルのメタキャラクタが含まれていないために機能します。

あなたはコードがこれに近いですが、あなたは、あなたが間違った場所にファイルからキーワードを見ていると主張しているので、多分デバッグを容易にするために少し書き換えは順序である:

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

私は何らかの理由で上記のようにコメントしましたが、理由はURLにあります。私はちょうどそれを-xで実行しました。結果は同じでしたが、url /subscriptions?v=2&alt=json.com/feeds/api/users/usernameを取得しようとしています。なぜか、私のシェルでどうやってそれが他の人と一緒に働くように思われるなら、他に何ができるか。 – Mare

関連する問題