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: `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