1 退出状态
定义
在Linux系统中,每当命令执行完成后,系统都会返回一个退出状态。该退出状态用一整数值表示,用于判断命令运行正确与否。退出状态通常保存在预定义变量$?中。
若退出状态值为0,表示命令运行成功
若退出状态值不为0时,则表示命令运行失败
最后一次执行的命令的退出状态值被保存在内置变量“$?”中,所以可以通过echo语句进行测试命令是否运行成功
设置退出状态命令
在编写 较为复杂的脚本时,应该考虑错误捕捉机制,即当脚本中的语句执行出现错误时,脚本能够处理错误。
在脚本中设置退出状态需要是同exit命令,其常见的是同形式及对应的含义如下:
exit 0 : 表示 返回脚本执行成功,无错误返回,这种情况又是也成为返回值为 true
exit 1 表示 执行失败 有错误返回, 这种情况有时候也成为 返回值为false
除了 0 1外, 还有其他的一些数字,但是只要返回的状态非0,系统就可以认为脚本执行失败。
使用exit命令设置退出状态时需要注意,无论脚本执行到何处,只要遇到exit命令,脚本会立即设置退出状态并保存脚本。
eg1
#!/bin/bash
function usage()
{
echo "error : must have a param"
echo "$0 param. . . . ."
return 1
}
if [ $# = 0 ]
then
usage
exit 1
fi
echo $1
exit 0
执行结果
anders@anders-virtual-machine:~/code/shell/exit$ ./eg1.sh
error : must have a param
./eg1.sh param. . . . .
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
1 脚本有错误退出
anders@anders-virtual-machine:~/code/shell/exit$ ./eg1.sh abc
abc
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
0 无错误退出
这里需要注意 return 和 exit 的区别:
return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。
exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息。
eg2
#!/bin/bash
function usage()
{
echo "error : must have a param"
echo "$0 param. . . . ."
exit 1
}
if [ $# = 0 ]
then
usage
exit 1
fi
echo $1
exit 2
运行结果
error : must have a param
./eg2.sh param. . . . .
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
1
anders@anders-virtual-machine:~/code/shell/exit$ ./eg2.sh 1
1
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
2
2 文件测试
文件测试包含两个方面:
1 基本测试 包括文件、目录是否存在、文件类型 文件长度等
2 文件权限测试 写出 刻度 执行 等
(1)文件基本测试:
-d 测试目标文件是否存在 并且是一个目录
-f 测试目标文件是否存在 并且是一个普通文件
-L 测试目标文件是否存在 并且是一个连接文件
-b 测试目标文件是否存在 并且是一个块设备文件
-c 测试目标文件是否存在 并且是一个字符设备文件
-e 测试目标文件是否存在
等等
格式:[ -commmand param ]
eg
anders@anders-virtual-machine:~/code/shell/exit$ [ -d /home/anders/ ]
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
0
经常与if while等结合使用
(2)文件权限测试:
-w 判断指定的文件是否存在,并且拥有可写入权限
-r 判断指定的文件是否存在,并且拥有可写读权限
-x判断指定的文件是否存在,并且拥有可执行权限
-u 判断指定的文件是否具有SUID权限
3 变量测试
测试变量是否已经被定义 需要使用命令 z
对于 没有被定义的变量,将会返回数字 0
对于已经定义的变量,将会返回数字1
eg
anders@anders-virtual-machine:~/code/shell/exit$ [ -z $NAME ]
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
0
anders@anders-virtual-machine:~/code/shell/exit$ NAME=ANDERS
anders@anders-virtual-machine:~/code/shell/exit$ [ -z $NAME ]
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
1
4 字符串和数值测试
字符串操作符测试
= 判断两个字符串是否相等 如果相等 返回为真 数字0
!= 是否不相等
n 测试字符串是否为非空
anders@anders-virtual-machine:~/code/shell/exit$ [ "aa" = "aa" ]
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
0
anders@anders-virtual-machine:~/code/shell/exit$ [ "aa" = "AA" ]
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
1
数值测试
数值测试命令如下
eq 两个数相等 则返回为真
ne 不相等
lt 第一个数小于 第二个数
le 小于等于
gt 第一个数大于第二个数
ge 大于等于
5 逻辑操作符
a 逻辑与 &&
o 逻辑或 ||
! 逻辑非
文件可读可写
anders@anders-virtual-machine:~/code/shell/exit$ [ -r /etc/passwd -a -w /etc/passwd ]
anders@anders-virtual-machine:~/code/shell/exit$ echo $?
1