侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

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

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 589 阅读 / 2150 字

我们已经知道,使用 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
0

评论区