2012-01-14 6 views
6

컬을 사용하여 특정 데이터를 읽어야합니다. 기본적으로 파일에서 키워드를 읽는 중입니다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 

어쨌든 나는 그것이 작동 할 수 있도록 말풍선을 형성하는 방법을 찾지 못했습니다. 가능한 모든 단일 및 이중 인용 버전을 시도했습니다. 나는 기본적으로 시도했다 :

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

등등. 그냥 이름을 짓고 나는 그것을 시도했는지 꽤 확신한다. 유사한

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

또는 무언가 : 나는 최상의 경우에 URL을 인쇄있을 때

그것은 형성됩니다. 이 문제의 원인이 무엇인지 알면 정보를 이해할 수있을 것입니다. 감사! 쉘 당신에게 & 문제를 제공하는 경우

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

단지 \&을 넣어하지만, 그것없이 나를 위해 잘 작동 :

답변

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 

...둘 사이에 캐리지 리턴이 있으므로 두 번째가 첫 번째를 덮어 씁니다.

그럼 어떻게 할 수 있습니까? 다음은 라인 끝 부분의 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

그냥 충분해야한다, 이런 식으로 사용합니다.

12

현재 버전이 작동해야한다고 생각합니다. 더 우아한 ${}에서 변수에 전체 URL 큰 따옴표 한 쌍을 사용하는 것입니다

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

그렇게하는 방법입니다. –

+0

어떤 이유로 클라이언트가 기형이거나 불법적 인 요청을했음을 알리는 파일이 나옵니다. 그게 전부입니다. " "/ 구독? v = 2 & alt = jsoneeds/api/users/username"결과에서 똑같은 내용이 반향을 일으키지 만 파일에서 사용자 이름을 읽었지만 URL은 여전히 ​​잘못 구성되어 있습니다. – Mare

+0

@Mare : 여기에서 완벽하게 작동합니다. 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

나는 방금 URL에 이유가 무엇인지에 대해 위에 언급 했으므로. 방금 -x로 실행했고 그 결과는 url/subscriptions? v=2&alt=json.com/feeds/api/users/username을 얻으려고 시도하는 것과 같았습니다. 어쩌면 그 이유는 내 껍질로는 어떻게되는지 모르겠습니다. 그것이 다른 사람들과 일하는 것처럼 보이면 다른 무엇이 될 수 있습니다. – Mare