如何在 Bourne shell 中否定多个条件

How to negate multiple conditions in the Bourne shell

我有一个像这样的简单的 Bourne shell 脚本:

if ! pwd && ls && mkdir /opt/test/; then
    echo "failure"
else
    echo "success"
fi

我希望它在任何命令未成功退出时报告失败,例如如果 mkdir 命令由于权限不足而失败。因此,否定应该涵盖所有三个命令。

我该怎么做?

我已经通过在子 shell 中执行命令解决了这个问题:

if ! (pwd && ls && mkdir /opt/test/); then
    echo "failure"
else
    echo "success"
fi

子shell的退出状态由if语句返回并测试。

如果你不想使用 subshel​​l,试试 {}:

if ! {pwd && ls && mkdir /opt/test/ ; }; then
    echo "failure"
else
    echo "success"
fi

或者,您可以在每个子命令中发送否定(德摩根定律):

if !pwd || !ls || !mkdir /opt/test/; then
    echo "failure"
else
    echo "success"
fi

如果 if 语句中的命令太多,将变得难以阅读。
你可以为它做一个函数:

function myInit {
   pwd || return 1
   ls || return 2
   mkdir /opt/test || return 3
   echo "success" || true
}

myInit || echo "failure"

当 echo "success" 失败时,函数 returns 为真,以保持接近您的解决方案。

你可以简单地颠倒测试的意义:

if pwd && ls && mkdir /opt/test/; then
    echo success
else
    echo failure
fi

如果您没有针对成功案例的 运行 的任何命令,这可能是个问题,因为遗漏该块是语法错误。您可以使用 true:true 的别名)作为无操作命令:

if [ -d "$directory" ] || mkdir "$directory"; then
    : directory exists
else
    echo could not create "$directory"; exit 1
fi