Shell脚本的条件判断和比较
1.Shell脚本的条件判断
在Shell脚本中,我们通常和各种条件结构和流程控制结构中都要进行各种判断,然后根据判断结果来咨询不同的操作.
在执行条件判断表达式后通常会返回”真”或”假”,条件判断表达式的常用语法如下:
条件判断语法 | 说 明 |
---|---|
test < 判断表达式 > | 这是利用test命令进行条件判断表达式的方法.test命令和”<判断表达式>”之间至少有一个空格. |
[ <判断表达式> ] | 利用[]进行条件判断表达式的方法,和”<判断表达式>”之间两边至少有一个空格. |
[[ <判断表达式> ]] | 比test和[]更新的语法格式.同样两边要有空格 |
(( <判断表达式> )) | 一般用于if语句里.(())两端不需要空格. |
说明
- test命令和[]是等价的.[[]]是扩展的test命令.(())常用于计算.
- 在[[]]中可以使用通配符进行模式匹配,这是其区别于其他几种语法格式的地方.
- &&,||,>,<等操作可以应用于[[]]总,但是不能应用于[]中,在[]中一般用-a,-o,-gt(用于整数)代替上述操作符.
- 对于整数的关系运算,也可以使用Shell的算术运算符(()).
1.1.test条件判断的示例
#若file存在这输出true,否则输出false
test -f file.txt && echo true || echo false
#文件存在,输出1
test -f /tmp/file.txt && echo 1
#文件不存在,输出1
test -f /tmp/file.txt && echo 1
1.2.[]条件判断表达式示例
#若file存在这输出true,否则输出false
[ -f /tmp/file.txt ] && echo 1 || echo 0
#文件存在,输出1
[ -f /tmp/file.txt ] && echo 1
#文件不存在,输出1
[ -f /tmp/file.txt ] && echo 1
1.3.[[]]条件判断表达式示例
#若file存在这输出true,否则输出false
[[ -f /tmp/file.txt ]] && echo 1 || echo 0
#文件存在,输出1
[[ -f /tmp/file.txt ]] && echo 1
#文件不存在,输出1
[[ -f /tmp/file.txt ]] && echo 1
在[[]]中可以使用通配符进行模式匹配,并且&&,||,>,<等操作可以应用于[[]]中,但不能应用于[]中.
1.4 特殊条件判断表达式
下面的写法适用于所有条件判断表达式,可以替代if语句的方法.判断条件判断表达式的条件成立或不整理.
[ 条件1 ] && {
命令1
命令2
命令3
}
[[ 条件1 ]] && {
命令1
命令2
命令3
}
test 条件1 && {
命令1
命令2
命令3
}
2.文件判断表达式
2.1 文件判断表达式的用法
常用的文件判断操作符 | 说 明 |
---|---|
-d 文件 ,d全拼是directory | 目录存在,则表达式为true |
-f 文件 ,f全拼是file | 文件存在且为普通文件,则表达式为true |
-e 文件 ,e全拼是exist | 文件/目录存在,则表达式为true(不区分是文件还是目录).注意区别于-f |
-r 文件 ,r全拼是read | 文件存在且可读,则表达式为true |
-s 文件 ,s全拼是size | 文件存在且大小不为0,则表达式为true |
-w 文件 ,w全拼时write | 文件存在且可写,则表达式为true |
-x 文件 ,x全拼时executable | 文件存在且可执行,则表达式为true |
-L 文件 ,L全拼是link | 文件存在且为连接文件,则表达式为true |
文件1 -nt 文件2 ,nt全拼是newer than | 文件1比文件2新,则为真.根据文件系统修改时间计算 |
文件1 -ot 文件2 ,ot全拼是older than | 文件1比文件2旧,则为真.根据文件系统修改时间计算 |
3.字符串判断表达式
字符串判断操作表达式常常用来比较两个字符串是否相同,判断字符串长度是否为零,字符串是否为null等.
常用字符串判断操作符 | 说 明 |
---|---|
-n 字符串 | 若字符串的长度不为0,则为真.n可理解错no zero |
-z 字符串 | 若字符串长度为0,则为真.z可理解成zero |
“字符串1” = “字符串2” | 两个字符串相等,则为真.可以使用 == 代替 = |
“字符串1” != “字符串2” | 两个字符串不相等,这位真.不可以使用 !== 代替 != |
注意:
- 在进行字符串判断时,一定要将字符串加双引号之后在进行比较.如[ -n “$myvar” ],特别是在使用[]的场景.
- 比较符号(如 = 或 != )的两端一定要有空格.
- != 和 = 可以用于比较两个字符串是否相同.
4.整数二元比较操作符
在[]或test中使用的比较符号 | 在(())和[[]]中使用的比较符号 | 说 明 |
---|---|---|
-eq | == 或 | 相等,全拼是equal |
-ne | != | 不相等,全拼是not equal |
-gt | > | 大于,全拼是greater than |
-ge | >= | 大于等于,全拼是greater equal |
-lt | < | 小于,全拼是less than |
-le | <= | 小于等于,全拼是less equal |
注意:
- 在[]中, = 或 != 也可在做比较使用,但在包含 > , < 符号时,必须用反斜杠 \ 转义,有时不转义不会报错但是结果不对.
- 在[[]]中也可以使用 -gt, -lt的符号,但是一般不建议这么用.
- 比较符号两端也要有空格
有关[], [[]], (())用法
- 整数加双引号的比较是对的
- [[]]中用类似-eq等的写法是对的,[[]]中用类似 >, < 的写法也可能不对,有可能会只比较第一位,逻辑结果不对.
- (())中不能使用类似 -eq等的写法,可以使用类似 >, <写法
5.逻辑操作符
在[]和test中使用的操作符 | 在[[]]和(())中使用的操作符 | 说 明 |
---|---|---|
-a | && | and, 与,两端都为真,则结果为真 |
-o | || | or, 或, 两端有一个为真,则结果为真 |
! | ! | not, 非 , 两端相反,则结果为真 |
注意:
- 逻辑操作符签发表达式是否成立,用真/假来表示
- ! 中文意思为 “非”或”反”
- 连接两个含有[], test, [[]]的表达式可以用&&或||