我在编写shell脚本方面是个新手。如果命令失败,我想打印一条消息并退出脚本。我试过了:
my_command && (echo 'my_command failed; exit)
但这并不奏效。它继续执行脚本中这一行之后的指令。我使用Ubuntu和bash。
我在编写shell脚本方面是个新手。如果命令失败,我想打印一条消息并退出脚本。我试过了:
my_command && (echo 'my_command failed; exit)
但这并不奏效。它继续执行脚本中这一行之后的指令。我使用Ubuntu和bash。
当前回答
Try:
my_command || { echo 'my_command failed' ; exit 1; }
四个变化:
将&&改为|| 用{}代替() 介绍;退出后, {和}之前的空格
由于您希望打印消息并仅在命令失败时退出(退出时值为非零),因此需要||而不是&&。
cmd1 && cmd2
当cmd1成功时将运行cmd2(退出值为0)
cmd1 || cmd2
当cmd1失败时将运行cmd2(退出值非零)。
使用()将使它们中的命令在子shell中运行,并从那里调用exit将导致您退出子shell而不是原始shell,因此在原始shell中继续执行。
要克服这个问题,请使用{}
bash需要最后两个更改。
其他回答
如果my_command是规范设计的,ie成功时返回0,那么&&与你想要的完全相反。你要||。
还要注意,(在bash中对我来说似乎不正确,但我不能从我所在的位置尝试。告诉我。
my_command || {
echo 'my_command failed' ;
exit 1;
}
Try:
my_command || { echo 'my_command failed' ; exit 1; }
四个变化:
将&&改为|| 用{}代替() 介绍;退出后, {和}之前的空格
由于您希望打印消息并仅在命令失败时退出(退出时值为非零),因此需要||而不是&&。
cmd1 && cmd2
当cmd1成功时将运行cmd2(退出值为0)
cmd1 || cmd2
当cmd1失败时将运行cmd2(退出值非零)。
使用()将使它们中的命令在子shell中运行,并从那里调用exit将导致您退出子shell而不是原始shell,因此在原始shell中继续执行。
要克服这个问题,请使用{}
bash需要最后两个更改。
还要注意,每个命令的退出状态都存储在shell变量$?,可在执行命令后立即查看。非零状态表示失败:
my_command
if [ $? -eq 0 ]
then
echo "it worked"
else
echo "it failed"
fi
我把下面这个习语拼凑起来了:
echo "Generating from IDL..."
idlj -fclient -td java/src echo.idl
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
echo "Compiling classes..."
javac *java
if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
echo "Done."
在每个命令的前面加上一个有信息的回显,并在每个命令后面加上同样的回显 如果[$?-ne 0];…线。(当然,如果您愿意,您可以编辑该错误消息。)
其他答案已经很好地涵盖了直接问题,但您可能也对使用set -e感兴趣。因此,任何失败的命令(在特定上下文之外,如if测试)都将导致脚本中止。对于某些脚本,它非常有用。