Shell sh脚本查询字符串参数错误,带有curl

Shell sh脚本查询字符串参数错误,带有curl,shell,Shell,我使用下面的shell脚本获取路由器的代码和mac,但总是得到错误的结果。mac参数放在url前面,如下所示 &mac=00:50:56:2A:E6:20示例?代码=jd8do0q7 #!/bin/sh route_code=$(cat /etc/code) route_mac=`ifconfig eth0|grep eth0|awk '{print $5}'` curl -o /tmp/updateip --dump-header - "http://example.com? co

我使用下面的shell脚本获取路由器的代码和mac,但总是得到错误的结果。mac参数放在url前面,如下所示

&mac=00:50:56:2A:E6:20示例?代码=jd8do0q7

#!/bin/sh
route_code=$(cat /etc/code)
route_mac=`ifconfig eth0|grep eth0|awk '{print $5}'`
curl -o /tmp/updateip --dump-header - "http://example.com?       code=${route_code}&mac=${route_code}"
update_res=`cat /tmp/updateip`
echo ${update_res}

/etc/code不是标准的Unix文件,但它的内容与您的问题相关,您还没有指定这些内容是什么。从您的问题来看,我猜它包含jd8do0q7,后面跟一个回车符(可能后面跟一个换行符,但无论如何都会被
$()
构造剥离掉,所以我们可以忽略它),当您打印传递给curl的URL值时(无论您如何打印它),$route_代码拾取的回车将光标移回行的开头,因此所有剩余文本将覆盖一些已打印的文本,从而错误地显示&mac=00:50:56:2A:E6:20文本已放置在URL的前面

暂时忽略回车符,您的URL构造正确,尽管我不知道为什么
code=
之间似乎有很多空白,而且您似乎在
mac=${route\u code}
应该是
mac=$route\u mac
(在这些情况下,支架也是可选的)

您可以通过打印URL来测试是否存在回车符(您可以通过将其分配给变量来测试,而不是在curl命令中内联构造它,然后回显它)并将其输送到
cat-vet
,它将不可打印字符显示为可打印字符;回车符将显示为
^M
,换行符显示为
$

要删除回车符,您可以使用文本编辑器(如vim)手动编辑文件,通过sed或tr将其删除(如
tr-d'\r'
),或者使用任何dos到unix转换实用程序,如Cygwin附带的dos2unix(但我认为您不在Cygwin上,因为Cygwin/Windows没有ifconfig;它有ipconfig)

如果我的猜测是正确的,那么这应该是可行的:

#!/bin/sh

route_code=$(cat /etc/code| tr -d '\r')
route_mac=`ifconfig eth0|grep eth0|awk '{print $5}'`
curl -o /tmp/updateip --dump-header - "http://example.com?code=$route_code&mac=$route_mac"
update_res=`cat /tmp/updateip`
echo "$update_res"

为什么要保留OP的临时文件和变量?只要省略
-o/tmp/updateip
就可以让
curl
直接显示输出,或者简单地
cat/tmp/updateip
就可以了,如果你想把IP放在一个文件中并显示它。另外,
route\u code=$(tr-d'\r'和
route\u mac=$(ifconfig eth0 | awk'/eth0/{print$5})
以避免无用地使用
grep | awk
。我完全同意,tripleee。我没有提到代码的这一部分,因为它与OP的具体问题无关,这是关于明显损坏的URL的问题。@b非常感谢。我用您的答案解决了它!