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. 语法1和语法2等价,语法3是扩展的 test 命令,语法4常用于计算。
  2. 在语法3 [[]] 双中括号中可以使用通配符等进行模式匹配。
  3. &&、||、>、<等操作符可以应用于 [[]] 中,但不能应用于 [] 中,在 [] 中一般用 -a, -o,-gt(用于整数), -lt(用于整数)代替上述操作符。
  4. 对于整数的关系运算,也可以使用shell算术运算符。

2.文件测试表达式操作符

常用文件测试操作符 说明
-d 存在且为目录则为真,即表达式成立
-f 文件存在且为普通文件则为真,即表达式成立
-e 文件存在即为真,即表达式成立。-e只要文件存在即可,不会辨别是否是目录或普通文件。
-r 文件存在且可读则为真,即表达式成立
-s 文件存在且文件大写不为0则为真,即表达式成立
-w 文件存在且可写则为真,即表达式成立
-x 文件存在且可执行则为真,即表达式成立
-L 文件存在且为链接文件则为真,即表达式成立
f1 -nt f2 文件fi比f2新则为真,即表达式成立。根据文件的修改时间来计算
f1 -ot f2 文件fi比f2旧则为真,即表达式成立。根据文件的修改时间来计算

3.字符串测试表达式

  1. 一定要将字符串加上双引号之后再进行比较

  2. 比较符号两端一定要有空格

    条件测试语法|说明

—|—
-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
2
3
4
# 语法:
[ $num1 -eq $num2 ]
(($num1>$num2))
[[ $num1 > $num2 ]]

5.逻辑操作表达式

[]test中的语法 [[]](())中的语法 说明
-a && and,与,两端都为真,则结果为真
-o || or,或,两端有一个为真,则结果为真
! ! not,非,两端相反,结果为真
  1. -a-o 逻辑操作符号需要用于 []
  2. &&|| 逻辑操作符可用于 [[]] 中或 (())中,也可以在外部连接多个[]``
  3. [][[]] 的两端及比较符号的两端,必须要有空格,但是对于 (())不需要空格

二、条件测试表达式用法

1.test [-option] <测试表达式>

  • test -f FILE 判断目标文件是否为普通文件,$? 返回值0-是普通文件,1-不是普通文件
  • test -z "string" 判断字符串长度是否为0,$? 返回值0-字符串长度是0,1-字符串长度不是0

2.[ <测试表达式> ] 单括号

[ <测试表达式> ] 语法与 test 等价,即 test 的所有判断选项都可以使用。

[] 中一般用 -a, -o, -gt(用于整数)、-lt(用于整数)代替 &&, ||, >, < 等操作符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 测试判断/tmp/1.txt是否存在
$ [ -f /tmp/1.txt ] && echo true || echo false
false

# !表达式取反
$ [ ! -e "/etc/hosts" ] && echo 1 || echo 0
0

# -a and,相当于&&。两个表达式同时成立,则整个表达式成立
$ [ -e "/etc/hosts" -a -f "/etc/hosts" ] && echo 1 || echo 0
1

# -o or,相当于||。其中一个表达式成立,则整个表达式成立
$ [ -e "/etc/hosts" -o -f "/etc/hosts" ] && echo 1 || echo 0
1

# 变量的条件表达式,变量加引号
$ [ -e "$oldboy" ]&&echo 1||echo 0
0

3.[[ <测试表达式> ]] 双括号

  • [[]] 双中括号中可以使用通配符等进行模式匹配,
  • &&、||、>、< 等操作符可以应用于 [[]] 中。
1
2
3
4
5
6
7
8
9
# 测试判断/tmp/1.txt是否存在
$ [[ -f /tmp/1.txt ]] && echo 1 || echo 0
1

# &&、||
$ [[ -e "/etc/hosts" && -f "/etc/hosts" ]] && echo 1 || echo 0
1
$ [[ -e "/etc/hosts" || -f "/etc/hosts" ]] && echo 1 || echo 0
1