if条件测试常用的语法
- test <测试表达式>
- [ <测试表达式> ]
- [[ <测试表达式> ]]
- ((<测试表达式>))
test命令和[]测试操作符
(这两种语法是等价的)
-d |
directory |
文件存在且为目录 |
-f |
file |
文件存在且为普通文件 |
-e |
exist |
文件存在 |
-r |
read |
文件存在且可读 |
-s |
size |
文件存在且文件大小不为0 |
-w |
write |
文件存在且可写 |
-x |
exexutable |
文件存在且可执行 |
-L |
link |
文件存在且为链接文件 |
f1 -nt f2 |
newer than |
文件f1比文件f2新 |
f1 -ot f2 |
olderthan |
文件f1比文件f2旧 |
-n |
not zero |
字符串的长度不为0 |
-z |
zero |
字符串的长度为0 |
s1 = s2 |
|
字符串1等于字符串2 |
s1 != s2 |
|
字符串1不等于字符串2 |
-eq |
equal |
相等 |
-ne |
not equal |
不相等 |
-gt |
greater than |
大于 |
-ge |
greater equal |
大于等于 |
-lt |
less than |
小于 |
-le |
less equal |
小于等于 |
-a |
and |
与 |
-o |
or |
或 |
! |
not |
非 |
范例:
test -f /data/test.sh && echo true || echo false
[ -f /data/test.sh ] && echo true || echo false
- 用[]测试变量时,如果被测试的变量不加双引号,那么测试结果可能会是不正确的:
file1=/etc/passwd
[ -f "$file1" ] && echo 1 || echo 0
如果是文件实体路径,那么加引号与不加引号的结果是一样的:
[ -f "/etc/passwd" ] && echo 1 || echo 0
[ -f /etc/passwd ] && echo 1 || echo 0
[[]]测试操作符
在[[]]中可以使用通配符等进行模式匹配
[[ ! $a =~ [1-3] ]] && echo 1 || echo 0
-d |
directory |
文件存在且为目录 |
-f |
file 文件存在且为普通文件 |
-e |
exist |
文件存在 |
-r |
read |
文件存在且可读 |
-s |
size |
文件存在且文件大小不为0 |
-w |
write |
文件存在且可写 |
-x |
exexutable |
文件存在且可执行 |
-L |
link |
文件存在且为链接文件 |
f1 -nt f2 |
newer than |
文件f1比文件f2新 |
f1 -ot f2 |
olderthan |
文件f1比文件f2旧 |
-n |
not zero |
字符串的长度不为0 |
-z |
zero |
字符串的长度为0 |
s1 = s2 |
|
字符串1等于字符串2 |
s1 != s2 |
|
字符串1不等于字符串2 |
==/= |
equal |
相等 |
!= |
not equal |
不相等 |
> |
greater than |
大于 |
>= |
greater equal |
大于等于 |
< |
less than |
小于 |
<= |
less equal |
小于等于 |
&& |
and |
与 |
|| |
or |
或 |
! |
not |
非 |
(())测试操作符
- ((<测试表达式>))
- 常用与计算
- 对于整数的关系运算,也可以使用Shell的算术运算符(())
((3>2)) && echo 1 || echo 0
((3!=2&&5==5)) && echo 1 || echo 0