linux - 链式 && 和 || bash 脚本中的运算符

标签 linux bash logical-operators

我想在 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 , BC如果 A 失败失败(即使命令被短路,因此改进)

最佳答案

由于一系列命令是在函数内执行的,因此可以使用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
}

关于linux - 链式 && 和 || bash 脚本中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33006797/

相关文章:

linux - 使用响应文件显示 Oracle DB 静默安装的进度

linux - 如何 grep 匹配具有多个选项的多个模式

linux - 如何使用shell脚本删除文本文件中具有相同单词且数字连续增加的字符串?

r - 根据行子集上的逻辑条件对数据框进行子集化

python - 测试所有 N 个变量是否不同

linux - 查找条件的文件大小

linux - 在 linux 中两个文本文件之间做减法的方法

linux - Linux 中的进程

c - 使用 Buildroot 为 Raspberry Pi 3 构建 rootfs 系统时出错 - 缺少 SysV IPC 支持

c++ - 是否强制使用短路逻辑运算符?和评价顺序?