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

如何在Bourne shell中否定多个条件,shell,sh,Shell,Sh,我有一个简单的Bourne shell脚本,如下所示: 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 如果任何命令未能成功退出

我有一个简单的Bourne shell脚本,如下所示:

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
如果任何命令未能成功退出,例如
mkdir
命令由于权限不足而失败,我希望它报告失败。因此,否定应该覆盖所有三个命令


我如何做到这一点?

我通过在子shell中执行以下命令解决了问题:

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

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

我通过在子shell中执行以下命令解决了此问题:

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

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

如果不需要子shell,请尝试
{}

if ! {pwd && ls && mkdir /opt/test/ ; }; then
    echo "failure"
else
    echo "success"
fi
或者,您可以在每个子命令中发送否定(De Morgan定律):


如果不需要子shell,请尝试
{}

if ! {pwd && ls && mkdir /opt/test/ ; }; then
    echo "failure"
else
    echo "success"
fi
或者,您可以在每个子命令中发送否定(De Morgan定律):


如果if语句中的命令太多,则将很难读取。
您可以为其创建一个函数:

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

myInit || echo "failure"

当echo“success”失败时,函数返回true,以接近您的解决方案。

如果if语句中的命令太多,则将很难读取。
您可以为其创建一个函数:

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

myInit || echo "failure"

当echo“success”失败时,函数返回true,以接近您的解决方案。

您可以简单地反转测试的感觉:

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

您可以简单地改变测试的意义:

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

你的两个答案都有效。但是,您需要编辑它们中的语法错误!第一个示例需要在“{”和“pwd”之间留一个空格。第二个示例需要在每个“!”和它后面的命令之间留一个空格。修复这些,我将向上投票答案。两个答案都有效。但是,您需要编辑这两个答案中的语法错误!第一个示例需要在“pwd”之间留一个空格{'和'pwd'。第二个示例需要在每个'!'和它后面的命令之间留一个空格。修复这些,我将向上投票答案。这个答案有效,但对于我的简单用例来说有点过头。对。在您的用例中,我不明白为什么要检查pwd和ls命令的结果,并且在/opt/test已经存在时可能忽略错误ts.在这种情况下,您可以执行
pwd;ls;mkdir/opt/test;if[!-d/opt/test]neric命令。这个答案很有效,但对于我的简单用例来说有点过头了。是的。在您的用例中,我不明白为什么要检查pwd和ls命令的结果,并且在/opt/test已经存在时可能忽略错误。在这种情况下,您可以执行
pwd;ls;mkdir/opt/test;if[!-d/opt/test]neric命令。观察力很好。我也有同样的想法,但它看起来很不雅。观察力很好。我也有同样的想法,但它看起来很不雅。