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

时间:2015-04-28 07:09:40

标签: shell sh

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

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

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

我该怎么做?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

或者,您可以在每个子命令中发送否定(De Morgan's Law):

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

答案 3 :(得分:1)

当你在if语句中有太多命令时,它将变得难以阅读 你可以为它做一个功能:

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

myInit || echo "failure"

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