Bash多变量赋值

时间:2017-11-08 19:31:00

标签: linux bash shell

目的

使用单行命令将cURL输出的HTTP状态代码和日期分配给RESPDATE变量。

期望

[08 Nov 2017 19:28:44 GMT] 301

现实

$ read -d "\n" RESP DATE <<< $(curl -sv https://google.com 2>&1 | egrep -i "< HTTP/2|< Date" | sed "s/< HTTP\/2 //;s/< date: //g"); echo "[$DATE] $RESP"
[
] 30108 Nov 2017 19:28:44 GMT
$

编辑:

这是完整的工作命令:

$ read -d "\r" RESP DATE <<< $(curl -sv https://google.com 2>&1 | tr -d "\r" | egrep -i "< HTTP/2|< Date" | sed "s/< HTTP\/2 //;s/< date: //g"); echo "[$DATE] $RESP"
[Wed, 08 Nov 2017 19:57:33 GMT] 301
$

2 个答案:

答案 0 :(得分:2)

curl的输出包含一些\r个字符, 这就是为什么输出看起来搞砸了。 您可以在tr -d '\r'之后和curl之前向管道中插入egrep来摆脱它。

阅读RESPDATE变量是否真的很重要? 您可以使用Awk提取更有趣的部分更简单,更安全, 并以所需格式直接输出:

curl ... | tr -d '\r' | awk '/^< Date: / { date = substr($0, 9); print "[" date "] " resp } /^< HTTP\// { resp = $3 }'

答案 1 :(得分:2)

awk怎么样:

curl --silent --head https://google.com | awk '
    /^HTTP/ {code = $2} 
    /^Date:/ {
        sub(/\r$/,"")
        date = substr($0,7)
        printf "[%s] %s\n", date, code
        exit
    }
'

使用HTTP HEAD请求来最小化流量。