shell条件测试表达式
Write by lyc at 2018-10-18
Update by lyc at 2021-3-17:整理自己早期的word版本到markdown
一、条件测试表达式语法
1.条件测试表达式
序号 |
条件测试语法 |
说明 |
---|---|---|
1 | test <测试表达式> |
这是利用 test 命令进行条件测试表达式的方法。test 命令和 <测试表达式> 之间至少有一个空格。 |
2 | [ <测试表达式> ] |
这是通过 [] 单中括号进行条件测试表达式的方法,和 test 命令的用法相同。[] 的边界和内容之间至少有一个空格。 |
3 | [[ <测试表达式> ]] |
这是通过 [[]] 双中括号进行条件测试表达式的方法,是比 test 和 [] 更新的语法格式。[[]] 的边界的内容之间至少与一个空格。 |
4 | ((<测试表达式>)) |
这是通过 (()) 双小括号进行条件测试表达式的方法,一般用于 if 语句里。(()) 双小括号两端不需要空格。 |
- 语法1和语法2等价,语法3是扩展的
test
命令,语法4常用于计算。 - 在语法3
[[]]
双中括号中可以使用通配符等进行模式匹配。 &&、||、>、<
等操作符可以应用于[[]]
中,但不能应用于[]
中,在[]
中一般用-a
,-o
,-gt
(用于整数),-lt
(用于整数)代替上述操作符。- 对于整数的关系运算,也可以使用shell算术运算符。
2.文件测试表达式操作符
常用文件测试操作符 | 说明 |
---|---|
-d |
存在且为目录则为真,即表达式成立 |
-f |
文件存在且为普通文件则为真,即表达式成立 |
-e |
文件存在即为真,即表达式成立。-e 只要文件存在即可,不会辨别是否是目录或普通文件。 |
-r |
文件存在且可读则为真,即表达式成立 |
-s |
文件存在且文件大写不为0则为真,即表达式成立 |
-w |
文件存在且可写则为真,即表达式成立 |
-x |
文件存在且可执行则为真,即表达式成立 |
-L |
文件存在且为链接文件则为真,即表达式成立 |
f1 -nt f2 |
文件fi比f2新则为真,即表达式成立。根据文件的修改时间来计算 |
f1 -ot f2 |
文件fi比f2旧则为真,即表达式成立。根据文件的修改时间来计算 |
3.字符串测试表达式
一定要将字符串加上双引号之后再进行比较
比较符号两端一定要有空格
条件测试语法|说明
—|—-z "string"
|字符串 "string"
长度为0则为真,即表达式成立-n "string"
|字符串 "string"
长度不为0则为真,即表达式成立"string1" = "string2"
"string1" == "string2"
|若字符串 "string1"
等于字符串 "string2"
,则为真,即表达式成立"string1" != "string2"
|若字符串 "string1"
不等于 字符串"string2"
,则为真,即表达式成立
4.整数比较表达式
在[] 和test 中的语法 |
在[[]] 和(()) 中的语法 |
说明 |
---|---|---|
-eq |
== 或= |
等于 |
-ne |
!= |
不等于 |
-gt |
> |
大于 |
-ge |
>= |
大于等于 |
-lt |
< |
小于 |
-le |
<= |
小于等于 |
1 | # 语法: |
5.逻辑操作表达式
在[] 和test 中的语法 |
在[[]] 和(()) 中的语法 |
说明 |
---|---|---|
-a |
&& |
and,与,两端都为真,则结果为真 |
-o |
|| |
or,或,两端有一个为真,则结果为真 |
! |
! |
not,非,两端相反,结果为真 |
-a
和-o
逻辑操作符号需要用于[]
中&&
和||
逻辑操作符可用于[[]]
中或 (())中,也可以在外部连接多个
[]``- 在
[]
和[[]]
的两端及比较符号的两端,必须要有空格,但是对于(())
不需要空格
二、条件测试表达式用法
1.test [-option] <测试表达式>
test -f FILE
判断目标文件是否为普通文件,$?
返回值0-是普通文件,1-不是普通文件test -z "string"
判断字符串长度是否为0,$?
返回值0-字符串长度是0,1-字符串长度不是0
2.[ <测试表达式> ] 单括号
[ <测试表达式> ]
语法与 test
等价,即 test
的所有判断选项都可以使用。
在 []
中一般用 -a
, -o
, -gt
(用于整数)、-lt
(用于整数)代替 &&
, ||
, >
, <
等操作符。
1 | # 测试判断/tmp/1.txt是否存在 |
3.[[ <测试表达式> ]] 双括号
[[]]
双中括号中可以使用通配符等进行模式匹配,&&、||、>、<
等操作符可以应用于[[]]
中。
1 | # 测试判断/tmp/1.txt是否存在 |