shell脚本中如何设置exit值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中如何设置exit值相关的知识,希望对你有一定的参考价值。

我在父脚本中调用子脚本,想根据子脚本中exit的值来判断执行的状态,但是父脚本中收到exit值只有0和去,不知道是否可以在子脚本中设置不同的exit值,然后父脚本来获取这些值,从而达到判断状态的目的
父脚本现在收到子脚本的返回值,只有0和1

在子脚本中可以通过如下形式返回成功0或错误码(1~255):
exit [返回值]

其中,返回值的取值范围为0~255,因为UNIX/POSIX中是用一个无符号8比特数值来表示exit返回码的。你若写exit -1,它会给你转为255。追问

如果我写exit 3出来还是为1

追答

tx,这是不可能的。应该就是3。

请确认子脚本确实是通过 exit 3返回而不是通过其他exit返回的。
或者,简单的,子脚本里就写一句 exit 3,然后调用子脚本后紧接着就用 echo $? 来查看。
如果你的不行,请将你的代码贴上来看看。

追问

我获取了一下传过来的值,的确是对应exit后面的值,但是我一开始在判断时候,是用if语句里面直接用$1判断,然后就会有问题

追答

$1 ?

$? 吧

  

ret=$?
if [ $ret -ne 0 ]; then
   echo $ret
fi


$?只能用于取相邻的上一条语句的返回值,中间隔了其他语句就不灵了。

所以,如果后面还要用的话,最好用一个变量先将$?的值保持下来。

    

追问

笔误,是$?,
if [ $? -eq 1];then...elif [ $? -eq 2 ];then....,就是类似这样的判断,但是除了1和2能行,其他不行,但是我直接将$?赋值,是可以得到对应值

追答

已经说了呀,$?只能用于取相邻的上一条语句的返回值,中间隔了其他语句就不灵了。

if [ $? -eq 1];then...elif [ $? -eq 2 ];then....

当执行到 elif [ $? -eq 2 ];then 这句时,表明前面一句if [ $? -eq 1];then已经执行过了并且不满足条件,此时 $?代表的是 if [ $? -eq 1];then 这句的返回值而不是子脚本的返回值。这是你想要的结果吗?

追问

对的,我知道

参考技术A 可以在exit时自定义退出代码比如exit 255

exit break和continue

exit语句

在系统中exit 命令用于退出当前用户的登录状态。在 Shell 脚本中exit 语句是用来退出当前脚本。 exit 的语法如下:
exit [返回值]

如果在 exit 之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询 $? 这个变量来査看返回值。如果 exit 之后没有定义返回值,则脚本执行之后的返回值是执行 exit 语句之前最后执行的一条命令的返回值。写一个 exit 语句的例子:

[[email protected] ~]#vi sh/exit.sh
#!/bin/bash
#演示exit的作用
read -p "Please input a number:" -t 30 num
#接收用户的输入,并把输入赋予变量num
y=$(echo $num|seds/[0-9]//g)
#如果变量num的值是数字,则把num的值替换为空;否则不替换
#把替换之后的值赋予变量y
[-n "$y" ] && echo "Error! Please input a number!" && exit 18
#判断变量y的值,如果不为空,则输出报错信息,退出脚本,退出返回值为18
echo The number is: $num"
#如果没有退出脚本,则打印变量num中的数字

如果输入的不是数字,"[-n"$y"]&&echo"Error! Please input a number!"&&exit 18"这条命令就会执行,exit 一旦执行,脚本就会中止。

break语句

当程序执行到 break 语句时,会结束整个当前循环。

[[email protected] ~]# vi sh/break.sh
#!/bin/bash
#演示break眺出循环
for ((i=1;i<=10;i=i+1))
#循环10次
    do
        if ["$i" -eq 4]
        #如果变量 i 的值等于4
        then
        break
        #则退出整个循环
        fi
        echo $i
        #输出变量i的值
    done

continue语句

continue 语句只会退出单次当前循环,并不会影响后续的循环。

 

以上是关于shell脚本中如何设置exit值的主要内容,如果未能解决你的问题,请参考以下文章

为啥shell脚本exit后,当前进程没有终止?

shell脚本case流程控制和exit命令

shell脚本中exit命令

paramiko exec_command 返回 shell 脚本 exit 值

Linux命令之退出exit

java调用shell脚本,并得到shell脚本的返回值