【问题标题】:Chained && and || operators in bash scripting链式 && 和 || bash 脚本中的运算符
【发布时间】:2015-10-08 04:43:59
【问题描述】:

我想在 bash 脚本中执行一系列命令。

如果有任何失败,脚本应该echo一行描述失败的行,然后退出函数。

目前,我的脚本充分地回显了输出,但没有退出脚本(因为echo 命令返回0)。

我有

COMMAND_A || echo "command A failed" | tee -a $SUMMARY_FILE
COMMAND_B || echo "command B failed" | tee -a $SUMMARY_FILE
COMMAND_C || echo "command C failed" | tee -a $SUMMARY_FILE

但这些与前一行无关 - 我认为用bash -e 括起来也无济于事,因为那时COMMAND_A 失败将在没有echo 的情况下退出,否则echo 将成功并且什么都没有会退出。

由于echo 会成功,我不能只在每一行添加&&

我也许可以使用

{ COMMAND_A && \ 
     { COMMAND_B && \
          { COMMAND_C || echo "C failed" | tee -a $SUM } \ 
     || echo "B failed" | tee -a $SUM }  \
|| echo "A failed" | tee -a $SUM }

但这看起来很笨重。

有更好的语法/风格/方法吗?

举个具体的例子:

cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=Release .. || \
            echo "$(date +%d/%m/%y-%H:%M:%S): cmake failed for $1" | tee -a $SUMFILE
        make -j16 || \
            echo "$(date +%d/%m/%y-%H:%M:%S): make failed for $1" | tee -a $SUMFILE
        sudo make install && \
            echo "$(date +%d/%m/%y-%H:%M:%S): Installed $1" | tee -a $SUMFILE || \
            echo "$(date +%d/%m/%y-%H:%M:%S): make install failed for $1" | tee -a $SUMFILE

编辑

也许我可以通过

得到一些改进
COMMAND_A || { echo "A failed" && false; } && \
COMMAND_B || { echo "B failed" && false; } && \
COMMAND_C && echo "C succeeded" || { echo "C failed" && false; }

但是如果A 失败,这仍然会显示ABC 失败(即使命令被短路,因此得到了改进)

【问题讨论】:

    标签: linux bash logical-operators


    【解决方案1】:

    由于这一系列命令是在一个函数中执行的,所以可以使用return语句。

    如果不是这样,exit 可能是合适的选择。

    因此,我可以使用问题编辑中的想法来编写:

    standardInstall() {
    # Should be passed the directory (ie application/library) name as
    # an argument.
        if [ -z "$1" ]; then
            echo "No argument was passed to standardInstall()"
            echo "Exiting"
            exit 2
        fi
        pushd $1/build/
    
        cmake -DCMAKE_INSTALL_PREFIX=$KF5 -DCMAKE_BUILD_TYPE=Release .. || \
            { echo "$(date +%d/%m/%y-%H:%M:%S): cmake failed for $1" \ 
              | tee -a $SUMFILE && return 1; } && \
        make -j16 || \
            { echo "$(date +%d/%m/%y-%H:%M:%S): make failed for $1" \ 
              | tee -a $SUMFILE && return 1; } && \
        sudo make install && \
            echo "$(date +%d/%m/%y-%H:%M:%S): Installed $1" | tee -a $SUMFILE || \
            { echo "$(date +%d/%m/%y-%H:%M:%S): make install failed for $1" \ 
              | tee -a $SUMFILE && return 1; }
    
        popd
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多