如何在 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
语句返回并测试。
如果你不想使用 subshell,试试 {}
:
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
我有一个像这样的简单的 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
语句返回并测试。
如果你不想使用 subshell,试试 {}
:
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