条件测试
判断某需求是否满足,需要由测试机制来实现。
根据命令的执行状态结果,表达不同的测试条件
1、根据id命令的执行状态结果,判断用户是否存在
1
2
3
4
5
6
7
8
9
|
[root@izpo45bh60h6bsz ~]
uid=0(root) gid=0(root) groups =0(root)
[root@izpo45bh60h6bsz ~]
0
[root@izpo45bh60h6bsz ~]
id : help: no such user
[root@izpo45bh60h6bsz ~]
1
|
2、根据在/etc/passwd文件中找到root开头的词的执行状态结果,判断用户是否存在
1
2
3
4
5
6
|
[root@izpo45bh60h6bsz ~]
[root@izpo45bh60h6bsz ~]
0
[root@izpo45bh60h6bsz ~]
[root@izpo45bh60h6bsz ~]
1
|
使用测试,在测试时,要使用特殊的测试符
1)test 测试表达式
1
2
3
4
5
6
|
[root@izpo45bh60h6bsz ~]
[root@izpo45bh60h6bsz ~]
0
[root@izpo45bh60h6bsz ~]
[root@izpo45bh60h6bsz ~]
1
|
2)[ 测试表达式 ]
1
2
3
4
5
6
|
[root@izpo45bh60h6bsz ~]
- bash : [1: command not found
[root@izpo45bh60h6bsz ~]
[root@izpo45bh60h6bsz ~]
0
|
3) [[ 测试表达式 ]]
1
2
3
4
5
6
|
[root@izpo45bh60h6bsz ~]
- bash : [[1: command not found
[root@izpo45bh60h6bsz ~]
[root@izpo45bh60h6bsz ~]
1
|
测试符分类
数值测试
-eq 左侧是否等于右侧
-ne 是不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于
1)A -eq B, 测试A所表示的数值是否等于B所表示的数值。等于为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
|
2)A -ne B, 测试A所表示的数值是否不等于B所表示的数值。不等于为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
3) A -gt B , 测试A所表示的数值是否大于B所表示的数值。大于为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
3) A -ge B , 测试A所表示的数值是否大于等于B所表示的数值。大于等于为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
4)A -lt B , 测试A所表示的数值是否小于B所表示的数值。小于为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
5)A -le B , 测试A所表示的数值是否小于等于B所表示的数值。小于等于为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
字符测试 (所有的操作数,都应该使用引用)
== 等值测试
> 是否大于, ASCII码的比较
< 是否小于
!= 是否不等于
A =~ PATTERN 左侧字符串是否能够被右侧的(正则表达式)PATTERN所匹配到。一般用于 ` ` 中,PATTERN不能加引号
-z "STRING" 测试字串是否为空,空为真
-n "STRING" 是否不空
1) A == B ,A所表示的字符和B所表示的字符是否相等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
|
2) A > B ,A所表示的字符是否大于B所表示的字符
3) A < B ,A所表示的字符是否小于B所表示的字符
4) A != B ,A所表示的字符和B所表示的字符是否不相等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
##测试方法一
# test "obama" != "obama" # 测试左侧字符串,是否与右侧字符串不相等
# echo $?
1
# test "$B" != "$A"
# echo $?
0
##测试方法二
# [ "obama" != "obama" ]
# echo $?
1
# [ "$B" != "$A" ]
# echo $?
0
##测试方法三
# [[ "obama" != "obama" ]]
# echo $?
1
# A=obama
# B=jerry
# [[ "$A" != "$B" ]]
# echo $?
0
|
5) A =~ B ,A所表示的字符能否被B所表示的(正则表达式)模式所匹配。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
- bash : test : =~: binary operator expected
- bash : test : =~: binary operator expected
- bash : [: =~: binary operator expected
- bash : [: =~: binary operator expected
1
0
|
6)-z "B", 测试B所表示的字符串是否为空,空为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
1
A=
0
A=jerry
1
1
A=
0
1
A=
0
|
7) -n "B", 测试B所表示的字符串是否为不空,不空为真
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
0
A=
1
A=jerry
0
0
A=
1
1
A=
1
|
文件测试
-a 或 -e 测试文件是否存在,存在时状态返回值为0,否则为1-255
存在且文件为什么类别 (dbc lsp)
-b 是否存在且为 块设备文件,存在则为真
1
2
3
4
5
6
7
8
9
10
11
|
1
0
ls : cannot access /dev/sda : No such file or directory
brw-rw---- 1 root disk 253, 0 Jul 31 2017 /dev/vda
|
-c 是否存在 且为字符设备文件
1
2
3
4
5
6
7
8
9
10
|
crw-rw-rw- 1 root root 1, 5 Jul 31 2017 zero
crw-rw-rw- 1 root root 1, 3 Jul 31 2017 null
0
0
|
-d 是否存在 且为目录 文件
1
2
3
4
5
|
drwxr-xr-x. 111 root root 12288 Jun 11 16:38 /etc
0
|
-f 是否存在 且为普通 文件
1
2
3
4
5
|
-rw------- 1 root root 0 Jun 10 12:26 /var/log/yum .log
0
|
-p 管道
-h 或 -L 符号链接
1
2
3
4
5
6
7
8
|
lrwxrwxrwx 1 root root 14 Jul 31 2017 /etc/system-release -> centos-release
0
0
|
-S 套接字
1
2
3
4
5
6
|
srw-rw-rw- 1 root root 0 Jul 31 2017 /dev/log
0
|
存在且有特殊权限:(文件本身)
-g ,拥有sgid权限
1
2
3
4
5
|
-rw-r--r-- 1 root root 3673 Jun 10 13:22 /etc/passwd
1
|
-u ,拥有suid权限
-k , 拥有sticky权限
1
2
3
4
5
6
|
0
drwxrwxrwt. 13 root root 4096 Jun 12 00:11 /tmp
|
文件权限: (跟用户相关)
-r 文件存在且可读 cat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
-rw-r--r-- 1 root root 127 Jun 11 19:25 a.txt
---------- 1 root root 2843 Jun 10 13:24 /etc/shadow
0
0
Last login: Tue Aug 1 18:49:22 CST 2017 on pts /0
$ [ -r /etc/shadow ]
$ echo $?
1
|
-w 文件存在且可写 修改
1
2
3
4
5
6
7
8
9
|
-rw-r--r-- 1 root root 127 Jun 11 19:25 a.txt
---------- 1 root root 2843 Jun 10 13:24 /etc/shadow
0
0
|
-x 文件存在且可执行 对于当前用户
1
2
3
4
5
|
-rwxr-xr-x 1 root root 117656 Nov 6 2016 /bin/ls
0
|
-s FILE 文件存在且非空
-t fd 文件描述符 fd是否打开,且与某个终端相关
运行命令
1、终端无关: 与随系统启动
2、终端相关: 手动运行,在交互式接口运行的命令。linux任何一个文件被打开都有一个文件描述符追踪文件
-N FILE 文件从上次打开后 是否被修改过? (重定向)
-O FILE 当前有效用户是否为文件的属主
1
2
3
4
5
|
-rw-r--r-- 1 root root 131 Jun 12 00:37 a.txt
0
|
-G FILE 当前有效用户是否为文件的属组
FILE1 -ef FILE2 refer to 指向 指向同一个设备上的相同inode
FILE1和FILE2是否为互为硬链接
1
2
3
4
5
6
7
8
9
10
11
|
1
1558766 -rw-r--r-- 2 root root 131 Jun 12 00:37 a.hl
1558766 -rw-r--r-- 2 root root 131 Jun 12 00:37 a.txt
0
|
FILE1 -nt FILE2 new than 最近一次修改的时间戳FILE1较FILE2更靠近现在
1
2
3
4
5
6
|
-rw-r--r-- 1 root root 2439 Jun 11 20:46 /tmp/ntp .conf
-rw-r--r-- 1 root root 2439 Jun 12 00:47 /tmp/ntp .conf.bak
1
|
FILE1 -ot FILE2 old than 最近一次修改的时间戳FILE1较FILE2更远离现在
组合测试条件
逻辑运算:
连接命令
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
连接条件
[ EXPRESSION ] && [ EXPRESSION ] 相当于 [ EXPRESSION -a EXPRESSION ]
[ EXPRESSION ] || [ EXPRESSION ] 相当于 [ EXPRESSION -o EXPRESSION ]
[ ! EXPRESSION ]
摩根定律
非(P 且 Q) = (非 P) 或 (非 Q)
非(P 或 Q) = (非 P) 且 (非 Q)
例如:
[ ! EXPRESSION ] && [ ! EXPRESSION ] 相当于 [ ! \( EXPRESSION -o EXPRESSION \) ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ install -m 000 /etc/issue /tmp
$ ls -l /tmp/issue
---------- 1 myuser myuser 23 Jun 12 05:32 /tmp/issue
$ [ ! -r /tmp/issue ] && [ ! -w /tmp/issue ]
$ echo $?
0
$ [ ! \( -r /tmp/issue -o -w /tmp/issue \) ]
$ echo $?
0
$ [ ! \(-r /tmp/issue -o -w /tmp/issue \) ]
- bash : [: too many arguments
|
2、bash中自定义退出状态码
exit [#] 在bash脚本中,一旦遇到exit命令就会终止脚本,退出状态码为exit后的数值。
1、exit存在时
1
2
3
4
5
6
7
8
9
10
|
#!/bin/bash
printf "hello everyone\n"
exit 1
hello everyone
1
|
2、exit不存在时
1
2
3
4
5
6
7
8
9
10
11
|
#!/bin/bash
printf "hello everyone\n"
ls /varr
printf "hello everyone\n"
0
|