2012-01-14 19 views
6

Avrei bisogno di leggere determinati dati usando l'arricciatura. Praticamente sto leggendo le parole chiave da fileBash curl e variabile nel mezzo dell'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 

Comunque non ho trovato un modo per formare l'url per arricciare in modo che avrebbe funzionato. Ho provato come ogni possibile singola e doppia versione citata. Ho provato in pratica:

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

e così via .. Basta nominarlo e sono abbastanza sicuro di averlo provato.

Quando sto stampando l'URL nel migliore dei casi si sarà formata da:

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

o qualcosa di simile. Se sai quale potrebbe essere la causa di questo, apprezzerei l'informazione. Grazie!

risposta

12

Non è un problema di quotazione. Il problema è che il file delle parole chiave è in formato DOS, ovvero ogni riga termina con ritorno a capo & avanzamento riga (\ r \ n) anziché solo avanzamento riga (\ n). Il ritorno a capo viene letto nella variabile di riga e incluso nell'URL. Il giveaway è che quando si echo esso, appare per la stampa:

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

ma è davvero la stampa:

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

...con solo un ritorno a capo tra loro, quindi il secondo sovrascrive il primo.

Quindi cosa si può fare a riguardo? Ecco un modo abbastanza semplice per tagliare il cr alla fine della riga:

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

Grazie! Questo ha completamente risolto il mistero. – Mare

4

semplicemente utilizzarlo come questo, dovrebbe essere sufficiente:

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

Se la shell ti dà problemi con & appena messo \&, ma funziona bene per me senza di essa.

12

La tua versione attuale dovrebbe funzionare, credo. Più elegante è quello di utilizzare una singola coppia di doppi apici l'intero URL con la variabile in ${}:

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

Ecco come lo farei. –

+0

Per qualche ragione non funziona, mi viene fornito un file che dice "Il tuo cliente ha emesso una richiesta non valida o illegale. Questo è tutto ciò che sappiamo." e quando echo la stessa cosa il risultato è "/ subscriptions? v = 2 & alt = jsoneeds/api/users/username" Così ha letto il nome utente dal file giusto ma in qualche modo l'url è ancora costruito in modo errato. – Mare

+0

@Mare: funziona perfettamente qui. Sembra un messaggio di errore di YouTube, quindi la tua richiesta è arrivata. Il tuo ricciolo è aggiornato? –

1

Se i dati del file possono contenere spazi e non hai obiezioni a spazi nel nome del file nella Directory /home/user/archive, quindi quello che hai dovrebbe essere OK.

Dato il contenuto del resto dell'URL, si potrebbe anche solo scrivere:

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 

se strettamente l'${line} potrebbe essere solo $line in entrambi i luoghi. Funziona perché le stringhe sono fisse e non contengono metacaratteri della shell.

Visto che sei il codice è vicino a questo, ma si sostiene che si sta vedendo le parole chiave dal file nel posto sbagliato, forse un po 'riscrittura per la facilità di debugging è in ordine:

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 

Dato che le stringhe possono finire per contenere spazi, sembra (è necessario espandere gli spazi a + nell'URL?), Le virgolette attorno alle variabili sono fortemente raccomandate. Ora puoi eseguire lo script con sh -x (o aggiungere una riga set -x allo script) e vedere cosa pensa la shell che sta facendo mentre lo sta facendo.

+0

Come ho appena commentato sopra per qualche motivo il motivo è con l'url. Ho appena eseguito con -x e il risultato è stato lo stesso che cerca di ottenere url /subscriptions?v=2&alt=json.com/feeds/api/users/username Forse il motivo è un po 'come con la mia shell, non lo so cos'altro potrebbe essere se sembra funzionare con tutti gli altri. – Mare