本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名原文链接~~~

Linux基础(27)之bash自定义退出状态码

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:


我们已经知道,使用 bash 执行一条命令时,如果该命令正常执行,那么它的退出状态码则为 0,如果该命令执行出现错误,则返回的错误状态码为一个非 0 且范围在 1-255 之间的值,而退出状态码可在该命令执行完后通过 $? 取得。
例:查看 ls 正常执行和非正常执行的退出状态码。

[root@localhost ~]# echo $?
0
[root@localhost ~]# ls lll
ls: 无法访问lll: 没有那个文件或目录
[root@localhost ~]# echo $?
2

此时就有一个问题,执行一个我们自己编写的脚本时该脚本的退出状态码是多少?

测试1

例 1:编写脚本 test1.sh ,内容如下:

#!/bin/bash
ls
ls lll

执行结果如下:

[root@localhost ~]# ./test1.sh 
anaconda-ks.cfg  test1.sh
ls: 无法访问lll: 没有那个文件或目录
[root@localhost ~]# echo $?
2

例 2:编写脚本 test.sh,内容如下:

#!/bin/bash
ls lll
ls

执行结果如下:

[root@localhost ~]# ./test2.sh 
ls: 无法访问lll: 没有那个文件或目录
anaconda-ks.cfg  test1.sh  test2.sh
[root@localhost ~]# echo $?
0

从上面两个示例中可以得出结论,脚本的退出状态码为脚本中最后一条命令执行的状态码。

测试2

使用 exit [CODE] 可以自定义退出状态码,修改 test1.shtest2.sh,在其后添加如下行:

exit 10

运行查看执行结果:

[root@localhost ~]# ./test1.sh 
anaconda-ks.cfg  test1.sh  test2.sh
ls: 无法访问lll: 没有那个文件或目录
[root@localhost ~]# echo $?
10
[root@localhost ~]# ./test2.sh 
ls: 无法访问lll: 没有那个文件或目录
anaconda-ks.cfg  test1.sh  test2.sh
[root@localhost ~]# echo $?
10

可以看到,无论最后一条命令执行是否成功,该脚本的退出状态码固定为我们自定义的状态码 10

练习

写一个脚本,接收文件路径作为参数:

  • 如果参数个数小于 1,则提示用户“至少传入一个参数”,并立即退出;
  • 如果参数个数不小于 1,则显示第一个参数对应文件中的空白行数

编写脚本 testexitcode.sh 内容如下:

#!/bin/bash
[ $# -lt 1 ] && echo "至少至少传入一个参数" && exit 1
spaceline=$(grep "^[[:space:]]*" $1 | wc -l)
echo "$spaceline"

测试:

[root@localhost ~]# ./testexitcode.sh 
至少至少传入一个参数
[root@localhost ~]# ./testexitcode.sh /etc/passwd
26
# Linux 基础  

如果这篇文章对您有帮助,可点击下方链接分享给你的朋友们😋,如果遇到问题欢迎评论、留言~~~😇

评论

公众号:zze_coding

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×