我有一个简单的Bourne shell脚本:
if ! pwd && ls && mkdir /opt/test/; then
echo "failure"
else
echo "success"
fi
如果任何命令没有成功退出,我希望它报告失败,例如如果mkdir
命令由于权限不足而失败。因此,否定应涵盖所有三个命令。
我该怎么做?
答案 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,以便与您的解决方案保持接近。