退出整个 shell 脚本

2025-05-21 10:10:35 / c罗世界杯图片

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

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