首页 > 解决方案 > 外壳运算符“||” 没有按预期工作?

问题描述

我正在尝试使用以下命令从 HTTP 标头获取文件时间。

curl -sLI http://sgp-ping.vultr.com/vultr.com.100MB.bin | grep -i '^Last-Modified' | cut -c16- | date -f- '+%F %T'

正常情况下可以返回查询结果。

如果由于网络问题导致查询失败,则返回null。

我想在查询失败时返回当前系统时间。所以我使用了shell操作符“||”,用法如下。

curl -sLI http://sgp-ping.vultr.com/xxx.bin | grep -i '^Last-Modified' | cut -c16- | date -f- '+%F %T' || date '+%F %T'

但它并没有按预期工作,它有什么问题?

任何帮助,在此先感谢!

标签: shelldatecurl

解决方案


如果你正在编写一个脚本,你可以通过$?只需要允许它来处理它。

例如

#!/bin/bash

doTheCurl() {
    curl -v -sLI -o /dev/null "$1" 2>&1 | grep -i '< Last-Modified:'
    [ $? -ne 0 ] && date '+%F %T'
}


doTheCurl "http://sgp-ping.vultr.com/vultr.com.100MB.bin"

doTheCurl "http://non-sgp-ping.vultra.com/xxx.bin"

给出了这个[我忽略了提取/格式化 - 但你可以看到结果是不同的,因为它们来自不同的路径。]。

< Last-Modified: Wed, 28 Oct 2020 18:06:00 GMT
2021-03-12 16:24:19

第一个失败是因为 grep 不匹配任何东西 - 所以它给出了日期。你可以做任何你喜欢的事情 - pipe thru sed 或之后的任何事情。


推荐阅读