退出状态码


命令执行后,使用变量“?”来保存状态码,不同的值反应成功或失败,它的取值范围是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: `lscpugrep ‘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: `lscpugrep ‘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/passwdgrep ROOT > /dev/null;echo $?
1

1代表没有 ROOT 用户

[root@k8s-master01 ~]# cat /etc/passwdgrep root > /dev/null;echo $?
0

0代表有 root用户

  • 查看一个用户名是不是存在,请通过命令的执行返回值判断用户是不是存在。

[root@k8s-master01 ~]# cat /etc/passwdgrep ROOT > /dev/null;echo $?
1
[root@k8s-master01 ~]# cat /etc/passwdgrep root > /dev/null;echo $?
0