退出整个 shell 脚本

功能: 在被调用的脚本发生错误时立即终止整个脚本的运行。

 

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  后接上判断,就能够成功停止整个脚本的运行。

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值