如您需要技术咨询、解决方案定制、故障排除、运维监控等服务,可联系ericwcn#at#163.com。

Shell条件判断与比较

Linux 立杰 215℃ 0评论

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, [[]]的表达式可以用&&或||

转载请注明:知识库 » Shell条件判断与比较

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址