条件测试
判断条件是否符合要求,就需要测试机制来实现,shell 中可以使用test命令来测试条件是否符合要求.bash中的测试可分为:
(1) 数值比较测试
(2) 字符串测试
(3) 文件测试
常用的测试方法包括:
(1) test命令 test expression
(2) [ expression ]
(3) [[ expression ]]
test 测试命令的用法
用法: test [expr]
Evaluate conditional expression.
计算条件表达式
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR. Expressions may be unary or binary. Unary
expressions are often used to examine the status of a file. There
are string operators as well, and numeric comparison operators.
退出状态为0(真)或1(假)取决于EXPR的测试。 表达式可能是一元或二元的。一元
表达式通常用于检查文件的状态。 也可以做字符串运算符以及数字比较运算符。
File operators文件测试操作:
单文件测试:
-a FILE True if file exists. 文件是否存在true/false
-b FILE True if file is block special. 判断是否是一个块设备文件
-c FILE True if file is character special. 判断是否是一个字符文件
-d FILE True if file is a directory. 判断是否是一个目录
-e FILE True if file exists. 文件存在性测试
-f FILE True if file exists and is a regular file. 文件是否存在并且是一个普通文件
-g FILE True if file is set-group-id. 存在且设置了sgid
-h FILE True if file is a symbolic link. 存在且为链接文件
-L FILE True if file is a symbolic link. 存在且为链接文件
-k FILE True if file has its `sticky' bit set. 文件存在且有sticky权限
-p FILE True if file is a named pipe. 是否存在且为命令管道文件
-r FILE True if file is readable by you. 是否可读
-s FILE True if file exists and is not empty. 是否存在且不为空
-S FILE True if file is a socket. 是否是一个socket套接字文件
-t FD True if FD is opened on a terminal. 文件的描述符是否在某个终端打开
-u FILE True if the file is set-user-id. 存在且设置了suid
-w FILE True if the file is writable by you. 当前用户是否有写权限
-x FILE True if the file is executable by you. 当前用户是否有写权限
-O FILE True if the file is effectively owned by you. 文件的属主是否是当前用户
-G FILE True if the file is effectively owned by your group. 文件的属组是否是当前组
-N FILE True if the file has been modified since it was last read. 文件自从上一次被读取后是否被修改过
双文件测试:
测试文件的新旧
FILE1 -nt FILE2 True if file1 is newer than file2 (according to
modification date).file1是否比file2旧(修改时间戳)
FILE1 -ot FILE2 True if file1 is older than file2. file1是否比file2新(修改时间戳)
FILE1 -ef FILE2 True if file1 is a hard link to file2.file2是否是file1的硬链接,或是是否为同一个文件(文件的inode是同一个) 。
String operators字符串测试操作符:
是否为空:
-z STRING 是否为空 True if string is empty.
-n STRING 是否不空
STRING True if string is not empty.
大小测试(按顺序比较anssic码) :
STRING1 = STRING2 相等
True if the strings are equal.
STRING1 != STRING2 不等于
True if the strings are not equal.
STRING1 < STRING2 小于
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2 大于
True if STRING1 sorts after STRING2 lexicographically.
Other operators其他的测试 :
-o OPTION True if the shell option OPTION is enabled.
! EXPR True if expr is false.
EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.
数值大小测试:
arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne,
-lt, -le, -gt, or -ge.
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
Arithmetic binary operators return true if ARG1 is equal, not-equal,
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
than ARG2.
Exit Status:
Returns success if EXPR evaluates to true; fails if EXPR evaluates to
false or an invalid argument is given.
其他测试命令:
[ expr ] 表达式前后必须要有空格,否则错误
例如: [ 1 -gt 3 ] && echo "hello" || echo "no hello"
[[ expr ]]
例如: [[ 1 -gt 3 ]] && echo "hello" || echo "no hello"
以上测试命令可以使用同样的操作符
模式匹配测试
STRING1 =~ pattern 左侧的字符串能否被右侧的模式匹配到,只能在[[ ]] 中使用
例如: [[ "a.sh" =~ "*.sh" ]] && echo "yew" || echo "no"
注意
字符串的测试操作必须要带上双引号
自定义退出状态码
exit [n] 指定退出状态码
注意:
(1) 脚本中一旦遇到exit 命令,脚本会# 立即 #终止。
(2) 脚本的执行状态码是最后一条命令的退出状态码
组合条件测试
条件组合也叫逻辑运算, 逻辑运算包括或运算、与运算、取反(非)
使用方式:
(1) 使用运算符连接多个条件表达式
与: condition1 && condition2
或: condition1 || condition2
非: !condition
例如:
(1) [ -e r.pub ] && [ -r r.pub ] && echo "yes" || echo "no"
(2) [ -z "$HOSTNAME" ] && [ "$USER" != "root" ] && echo "you can't set hostname" || echo "you can set hostname"
(2)使用命令的参数方式 :
与: -a and condition1 -a condition2
或: -o or condition1 -o condition2
非: ! !condition
例如:
(1) test -e r.pub -a -r r.pub && echo "true" || echo "false"
(2)[ -n hostname
-a hostname
!= "localhost.localdomain" ] && echo "yes" || echo "no"
网友评论