it-swarm.com.ru

Bash curl и переменная в середине URL

Мне нужно будет прочитать определенные данные, используя 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

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

10
Mare

Это не вопрос цитирования. Проблема в том, что ваш файл ключевого слова находится в формате 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

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

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

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

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

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

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

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

5
Mattias Ahnberg

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

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

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 к сценарию) и посмотреть, что, по мнению Shell, делает и делает.

1
Jonathan Leffler