2012-01-14 4 views
6

Kıvrım kullanarak belirli verileri okumam gerekir. Temelde Neyse Beceremeyiz öylesine kıvrılıp url oluşturmak için bir yol bulmuş değil dosyanınBash kıvrımı ve değişkenin ortasındaki değişken

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 

anahtar kelimeleri okuyorum. Her olası tek ve çift tırnaklı sürümleri gibi denedim. Temelde denedim:

ve benzeri .. Sadece adlandırın ve ben denedim eminim. benzer

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

falan: Ben en iyi durumda URL'yi yazdırdığımı zaman

o kadar oluşturulacak. Bunun sebebi ne olabileceğini biliyorsan bilgi için minnettar olurum. Teşekkürler! Kabuk size & ile sorunları verirse

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

sadece \& koymak, ama onsuz benim için çalışıyor:

cevap

12

Bu bir alıntı sorunu değil. Sorun, anahtar kelime dosyanızın DOS biçiminde olmasıdır - yani, her satır yalnızca satır besleme (\ n) yerine satır başı & satır beslemesi (\ r \ n) ile biter. Şaryo dönüşü satır değişkenine okunur ve URL'ye dahil edilir.

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

ama gerçekten baskı oluyor: eşantiyon bunu echo zaman, yazdırmaya görünmesidir

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

...aralarında sadece bir vagon dönüşü ile, ikincisi ilkin üzerine yazar.

Peki bu konuda ne yapabilirsiniz? İşte satırın sonunda cr kesmek için oldukça kolay bir yol:

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

Teşekkürler! Bu tamamen gizemi çözdü. – Mare

4

Sadece yeterince yeterli olmalıdır, bu gibi kullanmak. Geçerli sürümü çalışmalıdır

12

galiba. Daha zarif ${} değişken ile tüm URL'ye etrafında çift tırnak tek bir çift kullanmaktır:

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

Ben de böyle yapardım. –

+0

Bazı nedenlerden ötürü işe yaramazsa, bana "Bana, müşteriniz hatalı ya da yasa dışı bir talep gönderdi." ve aynı şeyi dışarda tuttuğum sonuç "/ subscriptions? v = 2 & alt = jsoneeds/api/users/username" şeklindedir. Bu nedenle, kullanıcı adını doğru dosyadan okudu, ancak bir şekilde url hala yanlış şekilde oluşturuldu. – Mare

+0

@Mare: burada mükemmel çalışıyor. YouTube'dan bir hata mesajı gibi görünüyor, bu nedenle isteğiniz oraya ulaştı. Kıvrımın güncel mi? –

1

dosyadan veri boşluk içerebilir varsa ve siz de dosya adında boşluk itirazım yok /home/user/archive dizini, sonra ne var Tamam olmalısın.

URL'nin geri kalanında içeriği göz önüne alındığında, hatta sadece yazabilirsiniz:

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 

nereye kesinlikle ${line} sadece $line her iki yerde de olabilir. Bu, dizeler sabit olduğundan ve kabuk meta karakterlerini içermediğinden çalışır.

kod bu yakın, ama sen yanlış yerde dosyasından anahtar kelimeleri görüyoruz iddia beri, belki hata ayıklama kolaylığı için biraz yeniden yazma sırada bulunuyor:

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 

Dizeler boşluklar içerebileceğinden, (URL'lerde +'a boşlukları genişletmeniz gerekiyor mu?), Değişkenlerin etrafındaki alıntılar şiddetle önerilir. Komut dosyasını şimdi sh -x ile çalıştırabilir (ya da komut dosyasına set -x numaralı satırı ekleyebilirsiniz) ve kabuğun yaptığı gibi yaptıklarını düşündüklerini görebilirsiniz.

+0

Bir sebepten dolayı yukarıda açıkladığım gibi, sebep URL ile. Ben sadece -x ile koştum ve sonuç aynı url /subscriptions?v=2&alt=json.com/feeds/api/users/username almaya çalıştıysa Belki de sebebi kabuğumun nasıl olduğunu bilmiyorum, bilmiyorum Başka herkesle birlikte çalışıyor gibi görünüyorsa başka ne olabilir. – Mare