在URL中使用Bash变量导致"卷曲:(3)在URL"中找到非法字符。

时间:2017-08-27 11:25:08

标签: bash curl

问题

我在调用cURL命令时尝试使用变量,但它包括文字$line而不是实际值。

while read line; do
  curl "https://x.com/v1/PhoneNumbers/$line?Type=carrier" -u "x:x" 
done < "${1:-/dev/stdin}"

上下文

我将一个数字列表传递给脚本,试图逐行读取它们。

2 个答案:

答案 0 :(得分:4)

从评论中我们知道您收到以下错误:

  

卷曲:(3)在网址

中找到非法字符

如果以这种方式格式化:

while IFS="$IFS"$'\r' read line; do
  curl "https://x.com/v1/PhoneNumbers/$line?Type=carrier" -u "x:x" 
done < "${1:-/dev/stdin}"

你的命令应该有效。

问题是您在输入行的末尾追加\r(以便输入的每一行以\r\n序列结束)。默认情况下,read不会删除尾随r。如果我们希望read修剪这些字符,我们必须将此字符添加到IFS的{​​{1}}环境变量中,如下所示:read

以下是来自Charles Duffy的好评:

  

就个人而言,我建议IFS="$IFS"$'\r')" read ...,而不是指旧的IFS=$' \t\n\r'值 - 为什么要让代码的行为符合上下文?

另一个有价值的评论;这次来自chepner

  

当然,有效行可能不会包含$IFS,但从概念上讲,您不希望将回车视为空格;您只想删除属于\r行结尾的\r。不是修改\r\n,而是正常读取该行,然后在调用IFS之前使用line=${line%$'\r'}删除该行。

相关:

答案 1 :(得分:0)

您尝试在其后面处理变量和文本,您应该使用${VAR}语法:

curl "https://x.com/v1/PhoneNumbers/${line}?Type=carrier" -u "x:x" done < "${1:-/dev/stdin}"

原因是bash尝试扩展参数$ line?键入..而不是$ line。

例如

[root@ ~]# line=1234
[root@ ~]# echo $line567

[root@ ~]# echo ${line}567
1234567