【问题标题】:Printing output from grep in bash script yields broken string在 bash 脚本中从 grep 打印输出会产生损坏的字符串
【发布时间】:2015-12-07 15:55:19
【问题描述】:

我有以下简单的 bash 脚本,它将命令的输出存储在变量中并打印出来:

size=$(curl -sI "http://speedtest.reliableservers.com/1GBtest.bin" | grep -i "length")

echo "--> ${size} <--"

在终端中运行命令时,我得到以下输出:

Content-Length: 1073471824

但是当我运行这个调用命令的 bash 脚本时,我得到以下输出:

 <--Content-Length: 1073741824

发生了什么事?

【问题讨论】:

  • @Kenney 这可能是终端编码问题吗?
  • 我在 Ubuntu 终端中以 ./wtf.sh 的身份运行它。 sh wtf.shbash wtf.sh 的结果相同。
  • @Kenney 对我来说,这两个结果都是“ASCII 文本,带有 CRLF 行终止符”。然而,Vim 显示 2.txt 只有一行。
  • grep -i "length.*[0-9]" 或使用dos2unix

标签: bash shell curl


【解决方案1】:

问题在于 HTTP 响应标头以 CRLF\r\n 结尾。 $(..) 确实剥离了 \n 而不是 \r,因此输出将是

--> 1073741824\r <--

\r 回车将光标设置到行首,用&lt;-- 覆盖--&gt;

你可以用sed剥离\r

size=$(curl -sI "http://speedtest.reliableservers.com/1GBtest.bin" | grep -i "length" \
     | sed -e 's/\r//' )

echo "--> ${size} <--"

【讨论】:

  • 这解决了问题,谢谢。有没有比这样剥离 \r 更简洁的方法来获得结果?
  • 如何清理?当然还有其他方法可以剥离它; tr -d '\015' 立即浮现在脑海中。
  • @tripleee 我在想一些强制 cURL 输出 unix 行结尾的标志。
  • 我认为没有,但grep -io '^content-length: [0-9]*' 不会捕获,因此不会首先打印回车。
  • @Overv 根据您的实际需要,--write-out 选项可能有用。
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多