条件测试判断

简介:

条件测试语法:

        在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过与if等条件语句相结合,让我们可以方便的按成判断。

格式1:test<测试表达式>

格式2:[<测试表达式>]

格式3:[[<测试表达式>]]

说明:

格式1和格式2是等价的

格式3为扩展的test命令,有网友推荐用格式3

提示:

在[[]]中可以使用通配符进行模式匹配。&&,||,>,<等操作符可以应用于[[]]中,但不能应用[]中。

对整数进行关系运算,也可以使用shell的算术运算符(())

语法例子:

格式1:test<测试表达式>

范例1:test测试文件

1
2
3
4
[root@XCN ~] # test -f file&& echo 1||echo 0  
0
[root@XCN ~] # test -f file && echo true||echo false
false

范例2:test命令非(!)的写法

1
2
3
4
5
[root@XCN ~] # test ! -f file && echo true||echo false
true
[root@XCN ~] # touch file
[root@XCN ~] # test ! -f file && echo true||echo false
false


格式2:[<测试表达式>]

范例[]

1
2
3
4
5
6
7
8
9
10
11
12
[root@XCN ~] # rm -f file 
[root@XCN ~] # [ -f file ]&& echo 1||echo 0
0
[root@XCN ~] # touch file 
[root@XCN ~] # [ -f file ]&& echo 1||echo 0
1
[root@XCN ~] # [ ! -f file ]&& echo 1||echo 0
0
[root@XCN ~] # rm file 
rm : remove regular empty  file  ` file '? y
[root@XCN ~] # [ ! -f file ]&& echo 1||echo 0
1

格式3:[[<测试表达式>]]

1
2
3
4
5
[root@XCN ~] # [[ -f file ]]&& echo 1||echo 0
0
[root@XCN ~] # touch file
[root@XCN ~] # [[ -f file ]]&& echo 1||echo 0
1


文件测试操作符

常用文件测试操作符号 说明
-f 文件 file 若文件存在且为普通文件则真
-d 文件 directory 若文件存在且为目录文件则真
-s 文件 size 若文件存在且不为空(文件大小非0则真)
-e 文件exist 若文件存在则真,要区别-f
-r 文件 read 若文件存在且可读则真
-w  文件 write 若文件存在且写则真
-x   文件 excute 若文件存在且可执行则真
-L   文件  link 若文件存在且为链接文件则真
f1 -nt f2 newer than 若文件f1比文件f2新则真
f1 -ot f2 older than 若文件f1比文件f2旧则真


举例:

1
2
3
4
5
6
7
8
9
10
11
[root@XCN 03] # touch xcn
[root@XCN 03] # [ -f xcn ] && echo 1 ||echo 0     #-f  文件存在
1
[root@XCN 03] # [ -d xcn ] && echo 1 ||echo 0      #-d  目录
0
[root@XCN 03] # [ -e xcn ] && echo 1 ||echo 0      #-e  不管什么存在则会真
1
[root@XCN 03] # [ -d tom ] && echo 1|| echo 0
1
[root@XCN 03] # [ -s xcn ] && echo 1||echo 0      #-s  针对文件的
0


字符串测试操作符

        字符串测试操作符的作用:比较两个字符串是否相同,字符串长度是否为零,字符串是否为NULL(注:bash分区零长度字符串和空字符串)等。

        "="比较两个字符串是否相同,与=等价,如if[ "$a"="$b" ],其中$a这样的变量最好用""括起来,因为如果中间有空格,*等符号就可能出错了,当然更好的方法就是["${a}"="${b}"]."!="比较两个字符串是否相同,不同则为"是"

常用字符串测试操作符 说明
-z "字符串" 若串长度为0则真,-z可以理解为zero
-n "字符串" 若串长度不为0则真,-n可以理解为no zero
"串 1"="串2" 若串1等于串2则真,可使用"=="代替"="
"串 1"!="串2" 若串1不等于串2则真。但不能用"!=="代替"!="

字符串测试操作符提示:

1)-n比较字符串长度是否不为零,如果不为零则为真,如:[-n "$myvar"]

2)-z比较字符串长度是否等于零,如果等于零则为真,如:[-z "$myvar"]

特别注意,对于以上表格中的字符串测试操作符号,如[-n "$myvar"],要把字符串用''引起来

1
2
3
4
5
6
7
8
[root@XCN ~] # [ -n "test" ] && echo 1|| echo 0
1
[root@XCN ~] # [ "abc" == "abs" ] && echo 1||echo 0
0
[root@XCN ~] # [ "abc" == "abc" ] && echo 1||echo 0 
1
[root@XCN ~] # [ "abc" != "abc" ] && echo 1||echo 0 
0


整数二元比较操作符:

在[]中使用的比较符 在(())和[[]]中使用的比较符 说明
-eq == equal的缩写,相等
-ne != not equal的缩写,不相等
-gt > 大于greater than
-ge >= 大于等于greater equal
-lt < 小于类似less than
-le <= 小于等于less equal

提示:

1)"<"符号意思是大于,if[["$a"<"$b"]],if["$a"\<"$b"].在单[]中需要转义,因为shell也用<和>重定向。

2)“>”符号意思是大于,if [["a">"$b"]]   if["$a"\>"$b"]在单[]中需要转义,因为shell也用<和>重定向

3)"="符号意思是等于,if[["$a"="$b"]]  if["$a"="$b"]在单[]中不需要转义

特别提示:

        经过实战,"="和"!="在[]中使用不需要转义,包含">"和"<"的符号在[]中使用需要转义,对于数据不转义的结果未必会报错,但是结果可能不会对

范例1:二元数字比较

1
2
3
4
5
6
7
8
9
10
11
[root@XCN ~] # [ 12 -eq 13 ]&& echo 1||echo 0
0
[root@XCN ~] # [ 12 -gt 13 ]&& echo 1||echo 0  [root@XCN ~]# [ 12 \< 13 ]&& echo 1||echo 0   
1
[root@XCN ~] # [ 12 \> 13 ]&& echo 1||echo 0   
0
0
[root@XCN ~] # [ 12 -lt 13 ]&& echo 1||echo 0 
1
[root@XCN ~] # [ 12 = 13 ]&& echo 1||echo 0  
0



逻辑操作符

在[]中使用的逻辑操作符 在[[]]中使用的逻辑操作符 说明
-a && and与,两端都为真,则真
-o || or或,两端有一个为真则真
! ! not非,相反则为真

提示:

!    中文意思是反:与一个逻辑值相反的逻辑值

-a   中文意思是与(and &&):两个逻辑值都为"真",返回值才为"真"反之为"假"

-o   中文意思是或(or):两个逻辑值只要有一个为"真",返回值就为"真"

1
2
3
[root@XCN ~] # n1=12;n2=13
[root@XCN ~] # [[ $n1 -eq $n2 && -z "$1" ]]&&echo 1||echo 0
0


test命令测试:

1
2
3
4
5
6
7
8
[root@XCN ~] # test -f $f1|echo 1|echo 0
0
[root@XCN ~] # test -f "$f1"|echo 1|echo 0
0
[root@XCN ~] # test -z "$f1"|echo 1|echo 0 
0
[root@XCN ~] # test -z $f1|echo 1|echo 0  
0


小结:逻辑操作符使用总结

[]中用-a,-o

[[]]中用&&,-o,!

test用法和[]相同


本文转自 baishuchao 51CTO博客,原文链接:http://blog.51cto.com/baishuchao/1942460


相关文章
|
Java Shell 测试技术
shell编程之条件语句(条件测试、if语句、case语句)(上)
要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。 使用专门的测试工具——test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。 使用test测试命令时,有以下两种形式:
516 1
|
Shell 测试技术 数据安全/隐私保护
shell编程之条件语句(条件测试、if语句、case语句)(下)
要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。 使用专门的测试工具——test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。 使用test测试命令时,有以下两种形式:
374 0
|
Shell
shell脚本中的特殊变量与if条件测试
shell脚本中的特殊变量与if条件测试
366 0
shell脚本中的特殊变量与if条件测试
|
Shell
Shell条件测试符及if条件语句
Shell条件测试符及if条件语句
363 0
|
Shell Linux
shell脚本之条件测试
shell脚本之条件测试
Cypress系列(58)- 停用条件测试
Cypress系列(58)- 停用条件测试
358 0
|
SQL 算法 关系型数据库
PostgreSQL 任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据算法举例
标签 PostgreSQL , 构造测试数据 , 任意字段组合AND,OR查询 , 指定结果集大小 背景 在进行一些实际的POC测试时,需要根据业务提出的需求构造数据,比如按照任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据。
1882 0
|
Android开发
Android RxJava/RxAndroid:takeWhile,直test测试条件通过才执行链式操作
Android RxJava/RxAndroid:takeWhile,直test测试条件通过才执行链式操作 RxJava/RxAndroid的takeWhile的test测试某一个条件是否达成,若完成,才执行后续的链式操作,若没有达成,则轮询反复的执行test测试,不执行后续操作。
1756 0
|
Shell Windows Linux