目录
一、条件测试的基本语法
在shell的各种条件结构和流程控制中都要进行各种测试,然后根据测试结果执行不同的操作,有时也会和if语句相结合,来完成测试判断,以减少程序运行的错误
执行条件测试表达式后通常会返回‘真’或‘假’,就像执行命令后返回布尔值‘0’表示真,非‘0’表示假一样
条件测试语法 | 说明 |
语法1:test < 表达式 > | 这是用test命令进行条件测试的方法。test和<表达式>之间至少有一个空格 |
语法2:[ < 表达式 > ] | 通过单括号进行条件判断方法。和test命令的方法一样,中括号和内容边界至少有一个空格 |
语法3:[[ < 表达式 > ]] | 通过双中括号进行条件判断新方法。双中括号和内容边界至少有一个空格 |
语法4:((< 表达式 >)) | 通过双小括号进行条件判断方法。一般用于if判断中,双小括号两端不需要空格 |
test <测试表达式>
- 如果文件存在,则返回true;如果文件不存在,则返回false
- 操作符&&和||两端可以有空格,也可以没有空格
[ <测试表达式> ]
- 如果文件存在,则返回true;如果文件不存在,则返回false
- []中括号的两端必须有空格,否则会报错。test和[]是等价的
[[ <测试表达式> ]]
- 如果双中括号表达式为真,则执行&&后面的命令;否则执行||后面的语句
- 双括号内部的两端必须加空格,否则会报错
双括号和单括号、test语法区别(单括号和test用法相同)
- 双括号中可以使用通配符进行模式匹配,也可以用&&、||、>、<,但是不能在单括号中使用
- 单括号中可以使用-o、-gt、-lt等操作符
[[ <表达式1> && <表达式2> ]]或[[ <表达式1> || <表达式2> ]]
二、字符串测试
- 字符串操作符的作用
常用字符串操作符 | 说明 |
-n "字符串" | 如果字符串不为空串,则为真,表达式成立 |
-z "字符串" | 如果字符串为空串,则为真,表达式成立 |
"字符串1" = "字符串2" | 如果字符串1和字符串2相等,则表达式成立。可用==代替= |
"字符串1" != "字符串2" | 如果字符串1和字符串2不相等,则表达式成立。可用!==代替!= |
字符串测试,一定要把字符串加上双引号,特别是使用[]
判断字符串是否为空,如果不为空则输入true,否则输入false
[ -n "字符串" ] && echo true || echo false
判断字符串是否为空,如果为空则输入true,否则输入false
[ -z "字符串" ] && echo true || echo false
判断字符串A和字符串B是否相等,如果相等输出true,否则输出false
[ "字符串A" = "字符串B" ] && echo true || echo false
判断字符串A和字符串B是否不相等,如果不相等输出true,否则输出false
[ "字符串A" != "字符串B" ] && echo true || echo false
三、整数测试
整数的二元比较
在[]或test使用的比较符 | 在(())或[[]]使用的比较符 | 说明 |
-eq | ==或= | 相等equal |
-ne | != | 不等not equal |
-gt | > | 大于greater than |
-ge | >= | 大于等于 greater equal |
-lt | < | 小于 less than |
-le | <= | 小于等于less equal |
numberA 小于 numberB,如果真输出true,否则输出false
[ numberA -lt numberB ] && echo true || echo false
numberA 大于等于 numberB,如果真输出true,否则输出false
[ numberA -ge numberB ] && echo true || echo false
numberA 大于 numberB,如果真输出true,否则输出false
[ numberA -gt numberB ] && echo true || echo false
四、文件测试
在处理对象时,需要先对对象进行判断,对象符合要求再进行处理,否则操作会出错或消耗一定的资源,测试的对象可以是文件、字符串和数字
常用文件操作符 | 说明 |
-d 文件,d全拼为dictionary | 文件存在且为目录则为真 |
-f 文件,f全拼为file | 文件存在且为普通文件为真 |
-e文件,e全拼为exist | 文件存在即为真,不判断文件类型是目录还是普通文件 |
-r文件,r表示read | 文件存在且为可读 |
-s文件,s表示size | 文件存在且大小不为0 |
-w文件,表示write | 文件存在且为可写 |
-x文件,表示executable | 文件存在且可执行 |
-L文件,表示link | 文件存在且为链接文件 |
f1 –nt f2,nt表示newer than | 文件f1比文件f2新 |
f1 –ot f2,nt表示older than | 文件f1比文件f2旧 |
判断文件是否存在,如果存在打印0,否则打印1
[ -f file ] && echo 0 || echo 1
判断目录是否存在,如果存在打印0,否则打印1
[ -d dictionary ] && echo 0 || echo 1
判断文件是否可读,如果存在打印0,否则打印1
文件只有读权限
[ -r file ] && echo 0 || echo 1
判断文件是否可写,如果存在且可写打印0,否则打印1
文件只有读权限
[ -w file ] && echo 0 || echo 1
五、逻辑操作符
在[]或test中使用的操作符 | 在(())或[[]]中使用的操作符 | 说明 |
-a | && | and,与关系,表示两边都为真,则结果为真 |
-o | || | or,或关系,表示两边有一个为真,则为真 |
! | ! | not,非,两端相反,则为真 |
-a表示两边都为真,则结果为真
[ -f fileA -a -f fileB ]&& echo 0 ||echo 1
-o表示两边有一个为真,则结果为真。文件fileB不存在
[ -f fileA -o -f fileB ]&& echo 0 ||echo 1
在[[]]中&&表示两边都为真,则结果为真
[[ -f fileA && -f fileB ]]&& echo 0 ||echo 1
在[[]]中||表示两边有一个为真,则结果为真。文件fileB不存在
[[ -f fileA || -f fileB ]]&& echo 0 ||echo 1