Bash curl и переменная в середине URL - PullRequest
14 голосов
/ 15 января 2012

Мне нужно прочитать определенные данные, используя curl.Я в основном читаю ключевые слова из файла

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

Во всяком случае, я не нашел способа сформировать URL для скручивания, чтобы он работал.Я пробовал как все возможные версии с одинарной и двойной кавычкой.Я пробовал в основном:

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

и так далее. Просто назовите это, и я почти уверен, что пробовал это.

Когда я распечатываю URL в лучшем случае, он будет иметь вид:

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

или что-то подобное.Если вы знаете, что может быть причиной этого, я был бы признателен за информацию.Спасибо!

Ответы [ 4 ]

18 голосов
/ 15 января 2012

Это не вопрос цитирования.Проблема в том, что ваш файл ключевого слова находится в формате DOS, то есть каждая строка заканчивается переводом каретки и переводом строки (\ r \ n), а не переводом строки (\ n).Возврат каретки читается в строковую переменную и включается в 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

... только с возвратом каретки между ними, поэтомуsecond перезаписывает первый.

Так что вы можете с этим поделать?Вот довольно простой способ обрезать 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
16 голосов
/ 15 января 2012

Ваша текущая версия должна работать, я думаю. Более элегантно использовать одну пару двойных кавычек вокруг всего URL с переменной в ${}:

"https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json"
5 голосов
/ 15 января 2012

Просто используйте его вот так, должно быть достаточно:

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

Если ваша оболочка вызывает проблемы с &, просто поставьте \&, но без меня она прекрасно работает.

1 голос
/ 15 января 2012

Если данные из файла могут содержать пробелы, и вы не возражаете против пробелов в имени файла в каталоге /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 к сценарию) и посмотреть, что оболочка думает, что она делает, как она это делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...