问题
我在调用cURL命令时尝试使用变量,但它包括文字$line
而不是实际值。
while read line; do
curl "https://x.com/v1/PhoneNumbers/$line?Type=carrier" -u "x:x"
done < "${1:-/dev/stdin}"
上下文
我将一个数字列表传递给脚本,试图逐行读取它们。
答案 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