【问题标题】:Shell operator "||" did not work as expected?外壳运算符“||”没有按预期工作?
【发布时间】:2021-03-12 02:07:15
【问题描述】:

我正在尝试使用以下命令从 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'

但它并没有按预期工作,这是怎么回事?

任何帮助,在此先感谢!

【问题讨论】:

  • false | true | true | true || echo hmm... - 这是一个pipeline
  • @jhnc 哦,现在我明白了。这个问题有解决办法吗?
  • 如果是 bash,则有 PIPESTATUS 数组。对于 POSIX shell,这很困难。
  • @Lorraine1996 : date -f- '+%F %T' 的退出代码应为 0,因此不会执行 date '+%F %T'

标签: shell date curl


【解决方案1】:

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

例如

#!/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 不匹配任何东西 - 所以它给出了日期。 你可以做任何你喜欢的事——通过管道或之后的任何事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 2019-06-20
    • 2021-04-13
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多