我们已经知道,使用 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.sh
和 test2.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
评论区