在URL中使用Bash变量会导致“curl:(3)在URL中发现非法字符”

在URL中使用Bash变量会导致“curl:(3)在URL中发现非法字符”,bash,curl,Bash,Curl,问题 我试图在调用cURL命令时使用一个变量,但它包含了文本$line而不是实际值 while read line; do curl "https://x.com/v1/PhoneNumbers/$line?Type=carrier" -u "x:x" done < "${1:-/dev/stdin}" 上下文 我正在将一个数字列表传递给脚本,试图逐行读取它们。如果您试图对变量及其后的文本进行寻址,则应使用${VAR}语法: 从评论中,我们知道您遇到了以下错误: curl:在URL

问题

我试图在调用cURL命令时使用一个变量,但它包含了文本$line而不是实际值

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


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

如果您试图对变量及其后的文本进行寻址,则应使用${VAR}语法:


从评论中,我们知道您遇到了以下错误:

curl:在URL中发现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\n以便输入的每一行都以\r\n序列结尾。默认情况下,读取不带尾随r。如果我们希望read修剪这些字符,我们必须将此字符添加到IFS环境变量中,以便进行如下读取:IFS=$IFS$'\r'read

下面是来自以下方面的一条很好的评论:

就个人而言,我建议IFS=$'\t\n\r',不要引用旧的$IFS值-为什么要使代码的行为与上下文相关

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


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

相关的:


用echo替换curl时,您看到了什么?您希望得到什么输出$要转换为shell变量值或其他内容的行?如果你继续,你会看到那里的命令,我只是想让它从一个文件中读取一堆电话号码不幸的是,我得到了curl:3个在URL中发现的非法字符情况不是这样吗?不能是变量名的一部分,因此至少在本例中可以省略{}。您可以在执行curl之前添加字符串的echo语句并在此处显示它吗?回响https://x.com/v1/PhoneNumbers/$line?Type=carrierecho在显示不可打印字符方面不如printf“%q”有用\nhttps://x.com/v1/PhoneNumbers/$line?Type=承运人将正确报价并退出尾随运输返回,f/e,这是公认答案的提议,有效行可能不包含\r,但从概念上讲,您不希望将回车符视为空白;您只想删除\r\n行结尾的一部分。不要修改IFS,而是正常读取该行,然后在调用curl之前使用line=${line%$'\r'}将其剥离。@chepner True。我会在答案中加上这个。
[root@ ~]# line=1234
[root@ ~]# echo $line567

[root@ ~]# echo ${line}567
1234567
while IFS="$IFS"$'\r' read line; do
  curl "https://x.com/v1/PhoneNumbers/$line?Type=carrier" -u "x:x" 
done < "${1:-/dev/stdin}"