#!/bin/bash
echo "$(curl -s -I https://google.com|grep Server)" abc
返回:
abcer: gws
并bash -x
显示:
++ grep Server
++ curl -s -I https://google.com
' abco 'Server: gws
abcer: gws
但
echo abc "$(curl -s -I https://google.com|grep Server)"`
回报
abc Server: gws
换句话说,如果我在curl命令之后添加文本,它会被破坏,但如果我在curl之前添加它就可以了。
怎么了?我想不明白。
答案1
HTTP 标准规定所有标头行以及标记标头结束的空行必须使用 CRLF(回车换行)结尾。许多客户端都是自由派,只接受 LF,但大多数服务器(包括 Google)都尊重该标准。
curl -I
显示与服务器发送的完全相同的标头,包括 CR 字符。就 Unix 系统而言,CR 字符是行的一部分,只有 LF 字符才结束行。命令替换会删除尾随的 LF 字符,但不会触及 CR 字符。因此,命令替换$(curl -s -I https://google.com|grep Server)
返回(在您的情况下)字符串Server: gws␍
(其中␍
是回车符),并且命令echo "$(curl -s -I https://google.com|grep Server)" abc
显示包含
Server: gws␍abc
该␍
字符是向终端发出的将光标移动到行首的指令,因此该字符abc
会覆盖该行的前三个字符。
这也解释了为什么trace frombash -x
有点乱码。
该命令echo abc "$(curl -s -I https://google.com|grep Server)"
显示一行包含
Server: gwsabc␍
␍字符将光标移动到行首,然后换行将光标移动到下一行的开头,因此␍没有可见的效果。
为了避免 CR 引起的复杂情况,请将它们从输入中剥离。
echo "$(curl -s -I https://google.com | tr -d '\r' | grep Server)" abc
答案2
echo $(curl -s -I https://google.com|grep Server)|cat -A
显示curl 返回的值有一个^M(回车符)。当您打印出curl的输出时,回车符将“光标”带回到行的开头,然后打印出“abc”,覆盖“Serv”。
在你的第二次尝试中,回车没有明显的效果。
答案3
尝试以下方法删除回车符:
echo "$(curl -s -I https://google.com|grep Server)" abc | tr -d "\r"
输出:
服务器:GFE/2.0 abc