功能: 在被调用的脚本发生错误时立即终止整个脚本的运行。
1.退出当前脚本
#!/bin/bash
function exit_script() {
exit 1
}
echo "before exit"
echo $?
exit_script
echo "after exit"
使用exit 就可以退出当前的脚本。
运行结果:
before exit
0
2.退出整个脚本
之前我以为被调用的脚本在停止后,主脚本也会停止,但是并没有。
另外一个脚本test.sh
#!/bin/bash
bash ./ExitShell.sh
echo $?
echo "the main shell"
执行test.sh ,结果:
before exit
0
1
the main shell
3.我们可以看到,并没有因为调用的脚本退出了,主脚本就退出。但是发现 $?的值发生改变了。【$?最后运行的命令的结束代码(返回值)】
所以我们可以进行判断$?的返回值,来控制整个脚本的停止。
所以对test.sh进行修改。
#!/bin/bash
bash ./ExitShell.sh
echo $?
if [ $? == 1 ]
then
echo "$?"
exit 1
fi
echo "the main shell"
运行结果:
before exit
0
1
the main shell
这又奇怪了,怎么没有进入if中呢。明明$? 就是1啊。
然后我又修改了test.sh , 仅仅是注释了echo $?
#!/bin/bash
bash ./ExitShell.sh
#echo $?
if [ $? == 1 ]
then
echo "$?"
exit 1
fi
echo "the main shell"
运行结果:
before exit
0
0
这是什么情况? 不仅进入了 if 中,$? 还变成了0。
4.奇怪现象的解释。
a. 没有注释echo $? 时,为什么打印出来的$? = 1却没有进入判断:原因是判断中的$?的返回值是echo $? 的返回值,成功打印了,自然判断中的$? != 1。
b. 注释掉echo $? 时,判断中的$? 是ExitShell.sh运行的返回值 = 1, 所以进入if判断中。在if 判断中的echo $? = 0 是因为if [ $? == 1 ] 执行成功然后打印的。
所以归根结底以为出现奇怪的现象是对 $? 用法的不熟悉。
【$? 上个命令的退出状态,或函数的返回值。】
上个命令,所以下一个命令获取的才是正确的。
所以我们在bash ./ExitShell.sh 后接上判断,就能够成功停止整个脚本的运行。