在网址中间使用Bash卷曲和变量

Mar*_*are 14 bash curl

我需要使用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
Run Code Online (Sandbox Code Playgroud)

无论如何,我还没有找到一种方法来形成卷曲的网址,所以它会工作.我尝试过所有可能的单引号和双引号版本.我基本上尝试过:

'...'"$line"'...'
"..."${line}"..."
'...'$line'...'
Run Code Online (Sandbox Code Playgroud)

等等.只需命名它,我很确定我已经尝试过了.

当我在最佳情况下打印出URL时,它将形成为:

 /subscriptions?v=2&alt=jsoneeds/api/users/KEYWORD FROM FILE
Run Code Online (Sandbox Code Playgroud)

或类似的东西.如果您知道可能是什么原因,我将非常感谢您提供的信息.谢谢!

Gor*_*son 18

这不是引用问题.问题是你的关键字文件是DOS格式 - 也就是说,每一行以回车符和换行符(\ r \n)结束,而不仅仅是换行符(\n).回车符被读入行变量,并包含在URL中.赠品是当你回应它时,它似乎打印:

/subscriptions?v=2&alt=jsoneeds/api/users/KEYWORD FROM FILE"
Run Code Online (Sandbox Code Playgroud)

但它真的打印:

https://gdata.youtube.com/feeds/api/users/KEYWORD FROM FILE
/subscriptions?v=2&alt=json
Run Code Online (Sandbox Code Playgroud)

......他们之间只有一个回车,所以第二个覆盖第一个.

所以你对此能做些什么?这是在行尾修剪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
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 16

我想你当前的版本应该可行.更优雅的是在整个URL周围使用一对双引号,变量位于${}:

"https://gdata.youtube.com/feeds/api/users/${line}/subscriptions?v=2&alt=json"
Run Code Online (Sandbox Code Playgroud)


小智 5

就这样使用它,应该足够了:

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

如果你的shell给你带来的问题&只是put \&,但没有它我的工作正常.