【问题标题】:Writing bash conditionalwith nested piped command使用嵌套管道命令编写 bash 条件
【发布时间】:2020-07-12 23:56:40
【问题描述】:

以下 bash 命令:

aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l

打印:

0

我想要的是,当结果确实为 0 时,将 FAILURE 打印到终端。

这是我尝试过的:

if [ aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l = 0]; then echo FAILURE; fi

但没有打印任何内容。看起来它正在等待更多输入。

【问题讨论】:

    标签: bash


    【解决方案1】:

    你根本不需要wc。如果行数为零,则意味着grep 没有产生任何输出,在这种情况下,它将具有非零退出状态。无论如何,if 语句只关心退出状态。

    if ! aws ls s3://bucket/dir | grep -q _SUCCESS; then
        echo FAILURE
    fi
    

    !否定了管道的退出状态(即最左边故障的存在状态,否则为0),这样就不用写类似

    if aws ls s3://bucket/dir | grep -q _SUCCESS; then
        :  # Do nothing
    else
        echo FAILURE
    fi
    

    grep -q 抑制其输出,因为您只对退出状态感兴趣,而不是实际输出。


    严格来说,grep 如果不匹配,则退出状态为 1,如果存在实际错误,则为不同的非零值,通常为 2。如果您关心,则需要在运行命令后显式检查 $? 的值。

    aws ls s3://bucket/dir | grep -q _SUCCESS
    case $? in
        0) : ;;
        1) echo FAILURE ;;
        *) echo "Some other error" ;;
    esac
        
    

    【讨论】:

      【解决方案2】:

      怎么样:

      if [ "$(aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l)" -eq 0 ]; then echo FAILURE; fi
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 2014-04-05
        • 2012-05-11
        • 2011-11-11
        相关资源
        最近更新 更多