2012-01-14 44 views
6

Tôi cần phải đọc dữ liệu nhất định bằng cách sử dụng curl. Về cơ bản, tôi đọc từ khóa từ tệpBash curl và biến ở giữa 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 

Dù sao tôi chưa tìm được cách tạo url để cuộn tròn sao cho nó hoạt động. Tôi đã thử mọi phiên bản trích dẫn đơn và đôi có thể. Tôi đã thử về cơ bản:

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

và cứ thế .. Chỉ cần đặt tên cho nó và tôi khá chắc chắn rằng tôi đã thử nó.

Khi tôi in ra các URL trong trường hợp tốt nhất nó sẽ được hình thành như:

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

hoặc một cái gì đó tương tự. Nếu bạn biết những gì có thể là nguyên nhân của điều này tôi sẽ đánh giá cao thông tin. Cảm ơn!

Trả lời

12

Đây không phải là vấn đề đáng báo giá. Vấn đề là tệp từ khóa của bạn có định dạng DOS - nghĩa là, mỗi dòng kết thúc bằng dòng vận chuyển trả về & linefeed (\ r \ n) chứ không phải chỉ dòng thức ăn (\ ​​n). Việc vận chuyển trở lại là nhận được đọc vào biến dòng, và bao gồm trong URL. Giveaway là khi bạn echo nó, nó dường như in:

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

nhưng nó thực sự in:

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

...chỉ với một chiếc xe ngựa trở về giữa họ, vì vậy cái thứ hai sẽ ghi đè lên cái đầu tiên.

Vì vậy, bạn có thể làm gì với ứng dụng này? Dưới đây là một cách khá dễ dàng để cắt cr ở cuối dòng:

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

Cảm ơn! Điều đó hoàn toàn giải quyết được bí ẩn. – Mare

4

Chỉ cần sử dụng nó như thế này, nên là đủ đủ:

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

Nếu shell của bạn cung cấp cho bạn các vấn đề với & chỉ cần đặt \&, nhưng nó hoạt động tốt đối với tôi mà không có nó.

12

Phiên bản hiện tại của bạn sẽ hoạt động, tôi nghĩ vậy. thanh lịch hơn là sử dụng một cặp dấu ngoặc kép xung quanh toàn bộ URL với các biến trong ${}:

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

Đó là cách tôi sẽ làm điều đó. –

+0

Vì một lý do nào đó không phải là công việc, nó cho tôi một tập tin nói rằng "Khách hàng của bạn đã đưa ra một yêu cầu bất hợp pháp hoặc bất hợp pháp. Đó là tất cả những gì chúng tôi biết". và khi tôi lặp lại cùng một điều, kết quả là "/ subscriptions? v = 2 & alt = jsoneeds/api/users/username" Vì vậy, nó đã đọc tên người dùng từ tập tin đúng nhưng bằng cách nào đó url vẫn được xây dựng sai. – Mare

+0

@Mare: hoạt động hoàn hảo ở đây. Điều đó có vẻ như một thông báo lỗi từ YouTube, vì vậy yêu cầu của bạn đã đến đó. Là curl của bạn đến nay? –

1

Nếu dữ liệu từ các tập tin có thể chứa khoảng trắng và bạn không có phản đối không gian trong tên tập tin trong /home/user/archive thư mục, sau đó những gì bạn đã có nên được OK.

Với các nội dung của phần còn lại của URL, bạn thậm chí chỉ có thể viết:

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 

nơi chặt chẽ việc ${line} có thể chỉ $line ở cả hai nơi. Điều này hoạt động vì các chuỗi được cố định và không chứa các siêu ký tự shell.

Vì bạn đang mã gần đây, nhưng bạn cho rằng bạn đang nhìn thấy các từ khóa từ tập tin ở vị trí sai, có lẽ một chút viết lại để dễ gỡ lỗi là theo thứ tự:

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 

Vì các chuỗi có thể kết thúc có chứa khoảng trắng, có vẻ như (bạn cần mở rộng khoảng trắng thành + trong URL?), Các dấu ngoặc kép xung quanh các biến được khuyến khích mạnh mẽ. Bây giờ bạn có thể chạy tập lệnh với sh -x (hoặc thêm một dòng set -x vào tập lệnh) và xem trình bao nghĩ nó đang làm gì khi đang thực hiện.

+0

Như tôi vừa nhận xét ở trên vì lý do nào đó, lý do là với url. Tôi chỉ cần chạy nó với -x và kết quả là như nhau nó cố gắng để có được url /subscriptions?v=2&alt=json.com/feeds/api/users/username Có lẽ lý do là một số làm thế nào với vỏ của tôi, tôi không biết những gì khác nó có thể được nếu nó có vẻ làm việc với tất cả mọi người khác. – Mare

Các vấn đề liên quan