Shell脚本正常退出状态码echo $?shell中的特殊变量_自定义脚本退出时的状态码

退出状态码


命令执行后,使用变量“?”来保存状态码,不同的值反应成功或失败,它的取值范围是0-255

[root@code404.icu www]# echo $?
0           # 上一个 命令执行成功
[root@code404.icu www]# echo $?
127         # 上一个命令执行失败

关于命令的退出,可以在命令脚本的中使用一下命令自定义退出状态码:

exit [n]

我们验证一下这个exit的作用:

[root@code404.icu www]# cat sysinfo.sh
#!/bin/bash
#
# **************************************************************
# Author: leenhem.lh
# Create time: 2021年9月30日17:26:59
# site: www.code404.icu
# Description: this is a test file for set
# File name: test_set.sh
# Copyright (C): 2021 All rights reserved
# **************************************************************
echo "-------------------host systeminfo-------------------"
echo "HOSTNAME: `hostname`"
echo "IPADDR: `ifconfig ens33 | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -n1`"
echo "OS_Version: `cat /etc/redhat-release`"
echo "Kernel: `uname -r`"
echo "CPU: `lscpu|grep 'Model name'|tr -s ' '| cut -d : -f2`"
echo "Memory: `free -h | grep Mem | tr -s ' ' : | cut -d : -f2`"

按照上面的脚本书写,然后执行脚本,执行后我们看结果:

[root@k8s-master01 ~]# sh test_set.sh
-------------------host systeminfo-------------------
HOSTNAME: k8s-master01
ens33: error fetching interface information: Device not found
IPADDR: 
OS_Version: CentOS Linux release 8.3.2011
Kernel: 4.18.0-240.el8.x86_64
CPU: 
Memory: 15Gi
[root@k8s-master01 ~]# echo $?
0

0 # 结果是0,说明sysinfo.sh执行成功

我们再来看:在脚本中随机加上一些不存在的命令

[root@code404.icu www]# cat sysinfo.sh
#!/bin/bash
#
# **************************************************************
# Author: Jason Zhuo
# Create time: 2021年7月1日17:26:59
# Description: this is a test file for set
# File name: test_set.sh
# Copyright (C): 2021 All rights reserved
# **************************************************************
echo "-------------------host systeminfo-------------------"
echo "HOSTNAME: `hostname`"
xxx # 这一行我们加上一个不存在的xxx命令。
echo "IPADDR: `ifconfig ens33 | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -n1`"
echo "OS_Version: `cat /etc/redhat-release`"
echo "Kernel: `uname -r`"
echo "CPU: `lscpu|grep 'Model name'|tr -s ' '| cut -d : -f2`"
echo "Memory: `free -h | grep Mem | tr -s ' ' : | cut -d : -f2`"

执行一下,然后看执行是否成功

[root@code404.icu www]# sh sysinfo.sh
-------------------host systeminfo-------------------
HOSTNAME: k8s-master01
sysinfo.sh: line 12: xxx: command not found # 有报错信息
IPADDR: 10.0.0.136
OS_Version: CentOS Linux release 7.6.1810 (Core)
Kernel: 3.10.0-957.el7.x86_64
CPU: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
Memory: 972M
[root@code404.icu www]# echo $? # 查看脚本执行是否成功
0 # 0,说明执行成功

为什么明明有执行报错,但是查看执行是否成功的时候却显示为0呢?这是因为“$?”仅记录脚本退出时最后一条命令的执行状态,本例中使用的脚本最后一条命令是echo语句,所以这里是执行成功的,这就导致我们查看脚本的执行结果的时候,脚本的执行结果是成功的。

这个时候我们修改一下脚本,就让它在退出时返回99:

[root@code404.icu www]# cat sysinfo.sh
#!/bin/bash
......为了节省篇幅这地方就省略了
echo "Memory: `free -h | grep Mem | tr -s ' ' : | cut -d : -f2`"
exit 99 # 新增这一行

我们再执行一次这个脚本

[root@code404.icu www]# sh sysinfo.sh
......
[root@code404.icu www]# echo $?
99 # 这不就是我们希望的99嘛

好了,虽然我们可以自定义脚本退出时的状态码,但是我们还是要遵从Linux的做法,成功时退出码是0,不成功时退出码才是非0。上面仅仅是演示exit的用法,但是错误码可以根据自己的情况去定义。

练习


  • 使用ping命令,ping一个不存在的IP地址,ping的输出信息不要输出到屏幕上。然后查看ping的执行是不是成功了。
[root@k8s-master01 ~]# ping 172.25.42.235 -c 1 > /dev/null ; echo $?
0
# 0代表ping成功
[root@k8s-master01 ~]# ping 172.25.42.1 -c 1 > /dev/null ; echo $?
1
# 1代表ping不通
  • 从/etc/passwd里查找一个不存在的字符串,比如ROOT,然后查看这个查找的执行结果是不是成功了。
[root@k8s-master01 ~]# cat /etc/passwd|grep ROOT > /dev/null;echo $?
1
# 1代表没有 ROOT 用户
[root@k8s-master01 ~]# cat /etc/passwd|grep root > /dev/null;echo $?
0
# 0代表有 root用户
  • 查看一个用户名是不是存在,请通过命令的执行返回值判断用户是不是存在。
[root@k8s-master01 ~]# cat /etc/passwd|grep ROOT > /dev/null;echo $?
1
[root@k8s-master01 ~]# cat /etc/passwd|grep root > /dev/null;echo $?
0

版权声明:本文为作者原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原创文章,作者:老C,如若转载,请注明出处:https://www.code404.icu/1253.html

发表评论

登录后才能评论