我运行一个命令,然后执行OR,这样如果命令失败,将执行代码块:
#!/bin/sh
test || (
echo "Test failed, exit!"
exit 1
)
echo "Test succeeded!"
这样可行,但脚本只是继续而不退出,Test succeeded
仍然打印出来。
我尝试使用exec
:
test || exec <<EOS
echo "Test failed, exit!"
EOS
但是这根本不会运行heredoc,也不会停止脚本的其余部分......
我是shell脚本的新手。
答案 0 :(得分:5)
这是因为(..)
启动子shell。你在里面做的任何与你相关的过程只会影响那个子shell。
相反,请使用{..}
分组:
#!/bin/sh
test || {
echo "Test failed, exit!"
exit 1
}
echo "Test succeeded!"
当您 想要包含效果时,(..)
行为非常有用,例如
for dir in */
do
( cd "$dir" && make ) # This 'cd' will be contained inside the ()
done
这可以防止您必须跟踪是否能够进入,因此您是否必须cd ..
将其恢复到原来的状态。
答案 1 :(得分:3)
@thatOtherGuy给了你正确答案。
如果{ grouped block; }
长于一行,我会鼓励你,使用if
:
if test; then
echo "test succeeded"
else
echo "test failed, exit" >&2
exit 1
fi
与IMO相比,可读性较差。
test || {
echo "test failed, exit" >&2
exit 1
}
echo "test succeeded"