条件测试介绍
(1)条件测试可以用于判断某个特定条件是否满足
(2)条件测试的种类
- 命令成功或失败
- 表达式为真或假
(3)条件测试的值
由于Bash中没有布尔类型变量,因此通过退出状态
来判断。
-
退出状态为0表示命令成功或表达式为真
-
退出状态为非0表示命令失败或表达式为假
可以通过命令$?
来查看退出状态的值
(4)条件测试语句
语句
(1)格式1: test <测试表达式>
(2)格式2:[ <测试表达式> ]
,注意表达式两端有空格
(3)格式3: [[ <测试表达式> ]]
(bash 2.x版本以上使用),同样注意表达式两端有空格
说明
1)格式1与格式2是等价的,格式3是扩展的test命令
2)在[[]]
中可以使用通配符进行模式匹配
3)&&
,||
,<
,>
能够正常存在于[[]]
中,但是不能在[]
中出现
4)在[
,[[
之后紧接的字符必须是空格,]
和]]
之前的字符也必须为空格
5)要对整数进行关系运算也可以使用(())
进行测试
(5)条件测试操作符
条件测试操作符就是条件测试表达式中可用的操作符
1)文件测试操作符
2)字符串测试操作符
3)整数二元比较操作符
4)使用逻辑运算符
1、文件测试
文件测试,用于测试文件是否存在,文件属性,访问权限等
测试表达式 | 作用 |
---|---|
[ -f fname ] |
fname 存在并且是普通文件时,返回真(即返回0) |
[ -L fname ] |
fname 存在并且是链接文件时,返回真 |
[ -d fname ] |
fname 存在并且是一个目录时,返回真 |
[ -e fname ] |
fname (文件或目录)存在时,返回真 |
[-s fname ] |
fname 存在并且大小大于0时,返回真 |
[ -r fname ] |
fname (文件或目录)存在并且可读时,返回真 |
[ -w fname ] |
fname (文件或目录)存在并且可写时,返回真 |
[ -x fname ] |
fname (文件或目录)存在并且可执行时,返回真 |
例子
其中,exper0529
是目录文件,p1.py
是普通文件
2、字符串测试
测试表达式 | 作用 |
---|---|
[ -z string ] | 如果字符串string长度为0 ,返回真 |
[ -n string ] | 如果字符串string长度不为0 ,返回真 |
[ str1 = str2 ] | 两字符串相等(也可使用==)返回真 |
[ str1 != str2 ] | 两字符串不相等返回真 |
[[ str1 = str2 ]] | 两字符串相同返回真 |
[[ str1 != str2 ]] | 两字符串不相同返回真 |
[[ str1 =~ srt2 ]] | str2是str1的子串返回真 |
[[ str1 > srt2 ]] | str1大于str2返回真 |
[[ str1 < srt2 ]] | str1小于str2返回真 |
字符串从左到右将对应字符的ASCII码进行比较
#!bin/bash
str1="hello world"
str2="hello linux"
str3="hello world"
#测试字符串大小是否为0
[ -z str1 ] #1
echo $?
[ -n str1 ] #0
echo $?
#测试[]的字符串相等与[[]]的字符串相等的区别
[ str1 = str2 ] #1
echo $?
[ str1 = str3 ] #1
echo $?
[ "$str1" = "$str2" ] #1
echo $?
[ "$str1" = "$str3" ] #0
echo $?
[[ str1 = str2 ]] #1
echo $?
[[ str1=str3 ]] #0
echo $?
运行结果
由此看出,比较字符串是否相等时,使用[ str1 = str2 ]
,则这两个必须是指向同一个字符串;使用[[ str1 = str2 ]]
,则这两个字符串相等即为真
检查空值
(1)[ "$str" = "" ]
(2)[ -z "$str" ]
(3)[ ! "$str"]
检查非空值
(1)[ "$str" != "" ]
(2)[ -n "$str" ]
(3)[ "$str"]
3、整数二元比较
测试表达式 | 作用 |
---|---|
[ int1 -eq int2 ] | int1等于int2则返回真 |
[ int1 -ne int2 ] | int1不等于int2则返回真 |
[ int1 -gt int2 ] | int1大于int2则返回真 |
[ int1 -ge int2 ] | int1大于等于int2则返回真 |
[ int1 - lt int2 ] | int1小于int2则返回真 |
[ int1 -le int2 ] | int1小于等于int2则返回真 |
[[]]
可直接替换[]
,如[ $int1 -eq $int2 ]
等价于[[ $int1 -eq $int2 ]]
,但是在[[]]
中的整数也可以不加$
符号
测试表达式 | 作用 |
---|---|
[ int1 == int2 ] | int1等于int2则返回真 |
[ int1 != int2 ] | int1不等于int2则返回真 |
[ int1 > int2 ] | int1大于int2则返回真 |
[ int1 >= int2 ] | int1大于等于int2则返回真 |
[ int1 < int2 ] | int1小于int2则返回真 |
[ int1 <= int2 ] | int1小于等于int2则返回真 |
这里操作符两边的空格可以省略
#!bin/bash
int1=10
int2=20
int3=10
int4=40
(( int1 > int2 ))
echo $? #1
(( int1>= int3 ))
echo $? #0
(( int2 < int4 ))
echo $? #0
(( int2 != int3 ))
echo $? #0
[ $int1 -gt $int2 ]
echo $? #1
[ $int1 -ge $int3 ]
echo $? #0
[ $int2 -lt $int4 ]
echo $? #0
[ $int2 -ne $int3 ]
echo $? #0
[[ $int1 -gt $int2 ]]
echo $? #1
[[ $int1 -ge $int3 ]]
echo $? #0
[[ int2 -lt int4 ]]
echo $? #0
[[ int2 -ne int3 ]]
echo $? #0
运行结果
4、逻辑运算
测试表达式 | 作用 |
---|---|
[ expr1 -a expr2 ] | 逻辑与,都为真才返回真 |
[ expr1 -o expr2 ] | 逻辑或,有一个为真就返回真 |
[ ! expr ] | 逻辑非 |
测试表达式 | 作用 |
---|---|
[[ expr1 -a expr2 ]] | 逻辑与,都为真才返回真 |
[[ expr1 -o expr2 ]] | 逻辑或,有一个为真就返回真 |
[[ ! expr ]] | 逻辑非 |
测试表达式 | 作用 |
---|---|
(( expr1 && expr2 )) | 逻辑与,都为真才返回真 |
(( expr1 | |
(( ! expr )) | 逻辑非 |
!bin/bash
int1=1
int2=2
int3=3
int4=1
[ $int1 -lt $int2 -a $int2 -lt $int4 ]
echo $? #1
[ $int1 -lt $int2 -o $int2 -lt $int4 ]
echo $? #0
[ ! $int2 -lt $int4 ]
echo $? #0
运行结果