判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令完成测试过程
1. 测试命令
1) test EXPRESSION
2) [ EXPRESSION ] 正常比较用单中括号
3) [[ EXPRESSION ]] 双中括号一般用于正则表达式
NOTE:中括号中EXPREESSION一定要有中括号
4) 测试的的返回值为布尔值:
若真,则返回0
若假,则返回1
2. 数值测试
-gt: 是否大于 -ge: 是否大于等于 -eq: 是否等于
-ne: 是否不等于 -lt: 是否小于 -le: 是否小于
3. 字符串测试
=:是否等于 >:ascii码是否大于ascii码
=~:左侧字符串是否能被右侧的PATTERN所匹配
NOTE:此表达式一般用于[[ ]]中
-z "STRING":字符串是否为空,空为真,不空为假
-n "STRING":字符串是否不空,不空为真,空为假
NOTE:用于字符串比较时用到的操作数都应该使用引号
4. 文件测试
1)存在性测试
-a FILE:同-e
-e FILE:文件存在性测试,存在为真,否则为假
2)存在性及类别测试
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L:是否存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
3)文件权限测试
-r FILE:是否存在且可读
-w FILE:是否存在且可写
-x FILE:是否存在且可执行
4)文件特殊权限测试
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
5)文件大小测试
-s FILE:是否存在且非空
6)文件是否打开测试
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
7)双目测试
FILE1 -ef FILE2:FILE1是否是FILE2的硬链接
FILE1 -nt FILE2:FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2:FILE1是否旧于FILE2
5. 组合测试条件
第一种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
NOTE:必须使用测试命令支持,[[ ]]不支持
第二种方式:
COMMAND1 && COMMAND2 并且,短路与,代表条件性的AND THEN
COMMAND1 || COMMAND2 或者,短路或,代表条件性的OR ELSE
! COMMAND 非
eg. [ -f "$FILE" ] && [[ "$FILE" =~.*\.sh$ ]]
6. 自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即退出:终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
7. 补充:常用特殊变量
在脚代码中调用通过命令行传递给脚本的参数
$1,$2...:对应第1,第2等参数
$0:命令本身
$*:传递给脚本的所有参数
$@:传递给脚本的所有参数
$#:传递给脚本的参数的个数
NOTE:$*和$@的区别
不加引号时,二者都是返回传入的参数;
加引号之后,$*把参数做为一个字符串整体(单字符串)返回;
$@把每个参数作为一个字符串返回。
8. 更多详细练习