我需要使用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
无论如何,我还没有找到一种方法来形成卷曲的网址,所以它会起作用。我尝试过所有可能的单引号和双引号版本。我基本上试过了:
'...'"$line"'...'
"..."${line}"..."
'...'$line'...'
等等。只需命名,我很确定我已经尝试过了。
当我在最佳情况下打印出URL时,它将形成为:
/subscriptions?v=2&alt=jsoneeds/api/users/KEYWORD FROM FILE
或类似的东西。如果您知道可能是什么原因,我将非常感谢您提供的信息。谢谢!
答案 0 :(得分:18)
这不是引用问题。问题是你的关键字文件是DOS格式 - 也就是说,每一行都以回车符&amp;换行(\ 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
答案 1 :(得分:16)
我认为你当前的版本应该可行。更优雅的是在整个URL周围使用一对双引号和${}
中的变量:
"https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json"
答案 2 :(得分:5)
就这样使用它,应该足够了:
curl "https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json" > "/home/user/archive/${line}"
如果您的shell为&
提供问题,只需添加\&
,但没有它就可以正常使用。
答案 3 :(得分:1)
如果文件中的数据可以包含空格,并且您对/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认为它正在做什么。