shell中的条件测试及字符串判断

1、条件测试语法

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

 

语法说明:

格式1test 测试表达式

格式2[ 测试表达式 ]

格式3[[ 测试表达式 ]]

上面的格式中,格式1和格式2是等价的。格式3为扩展的test命令。

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

 

1:格式1示例,判断zhangsan.txt这个文件是否存在

[root@localhost ~]# test -f zhangsan.txt && echo true||echo false

false

[root@localhost ~]# touch zhangsan.txt

[root@localhost ~]# test -f zhangsan.txt && echo true||echo false

true

 

2:格式1示例,test命令非(!)的写法,文件存在就输出false

[root@localhost ~]# test ! -f zhangsan.txt && echo true||echo false

false

 

3:格式2示例两种判断方法,第一种判断文件是否存在,第二种判断文件是否不存在

[root@localhost ~]# [ -f zhangsan.txt ] && echo true||echo false

true

[root@localhost ~]# [ ! -f zhangsan.txt ] && echo true||echo false

false

 

4:格式3示例,判断两个文件是否同时存在

[root@localhost ~]# [[ -f zhangsan.txt && -f lisi.txt ]] && echo true||echo false

false

[root@localhost ~]# touch lisi.txt

[root@localhost ~]# [[ -f zhangsan.txt && -f lisi.txt ]] && echo true||echo false

true

 

2shell中常用文件测试操作符

操作符

说明

-b file

检测文件是否存在且是块设备文件,如果是,则为真

-c file

检测文件是否存在且是字符设备文件,如果是,则为真

-d file

检测文件是否存在且是目录,如果是,则为真

-f file

检测文件是否存在且是普通文件(既不是目录,也不是设备文件),如果是,则为真

-g file

检测文件是否存在且设置了 SGID 位,如果是,则为真

-k file

检测文件是否存在且设置了粘着位(Sticky Bit),如果是,则为真

-p file

检测文件是否存在且是有名管道,如果是,则为真

-u file

检测文件是否存在且设置了 SUID 位,如果是,则为真

-r file

检测文件是否存在且可读,如果是,则为真

-w file

检测文件是否存在且可写,如果是,则为真

-x file

检测文件是否存在且可执行,如果是,则为真

-s file

检测文件是否存在且为空(文件大小是否大于0),不为空返回 true

-e file

检测文件(包括目录)是否存在,如果是,则为真

f1 -nt f2

检测文件f1是否比文件f2新,如果是,则为真

f1 -ot f2

检测文件f1是否比文件f2旧,如果是,则为真

 

3shell中字符串测试操作符

字符串运算符列表

运算符

说明

举例

=

检测两个字符串是否相等,相等返回 true

[ $a = $b ] 返回 false

!=

检测两个字符串是否不相等,不相等返回 true

[ $a != $b ] 返回 true

-z

检测字符串长度是否为0,为0返回 true

[ -z $a ] 返回 false

-n

检测字符串长度是否不为0,不为0返回 true

[ -n $a ] 返回 true

str

检测字符串是否为空,不为空返回 true

[ $a ] 返回 true

特别注意:以上表格中的字符串测试操作符号务必要用双引号” ”引起来,如[ -n “$name” ]以免出错。

 

4、整数二元比较操作符

 

关系运算符列表

[   ]中使用的比较符

((   ))[[ ]]中使用的比较符

说明

-eq

==

equal缩写,相等

-ne

!=

not equal缩写,不相等

-gt

greater than缩写,大于

-lt

less than缩写,小于

-ge

>=

greater equal缩写,大于等于

-le

<=

less equal缩写,小于等于

 

提示:

1”<”小于,if [[“$a” < ”$b”]]if [ “$a” \< “$b” ]。在单中括号中大于号(>)和小于号(<)需要转义,因为shell也使用<号和>号进行重定向。

 

2”=”等于号和”!=”不等于号,if [[“$a” = ”$b”]]if [ “$a” = “$b” ]在单中括号中等于和不等于号不需要转义。

 

5、逻辑操作符

布尔运算符列表

[ ]中使用的逻辑操作符

[[ ]]中使用的逻辑操作符

说明

!

!

非运算   ,相反则为真

-o

||

或运算,两边有一个为真,则真

-a

&&

与运算,两边都为真,则真

 

 

6if分支结构

单分支语法:

if [ 条件 ]

 then

   指令

fi

 

双分支语法:

if [ 条件 ]

  then

     指令

else

指令

fi

 

多分支语法:

if [ 条件 ]

  then

指令

 elif 条件

   then

     指令

…………………….

else

   指令

fi

 

多判断条件if语句,同样的也可以把下面的&&替换为||也可以。

#!/bin/bash

#多判断条件if语句示例

d=2

e=3

#方法1,使用单中括号结合&&符号进行多条件判断

#if [ $? -eq 0 ] && [ $d -eq 2 ] && [ $e -lt 5 ];then

 

#方法2,使用单中括号结合-a选项进行多条件判断(-a是与运算,相当于&&符号,)

#if [ $? -eq 0 -a $d -eq 2 -a $e -lt 5 ];then

 

#方法3,使用双中括号结合&&符号进行多条件判断

#if [[ $? = 0 ]] && [[ $d = 2 ]] && [[ $e < 5 ]];then

if [[ $? = 0 && $d = 2 && $e < 5 ]];then

     echo "true"

fi  

 

 

条件表达式配合大括号的用法

[ $? -ne 0 ] || {

    echo "命令没有执行成功"

    exit 1

7、扩展:判断字符串是否为数字的多种方法

7.1、方法1sed加正则表达式

组合语法判断1

[ -n “`echo $num|sed ‘s/[0-9]’//g`” -a -n “`echo $2|sed ‘s/[0-9]//g’`” ] && echo “两个参数必须为数字” && exit 1

 

组合语法判断2

[ -n “`echo $num|sed ‘s/[0-9]//g’`” -a -n “`echo $2|sed ‘s/[0-9]//g’`” ] && {

echo “两个参数必须为数字

exit 1

}

 

单个判断语法:

[ -n “`echo $1|sed ‘s/[0-9]//g’`” ] && echo “第一个参数必须为数字” && exit 1

[ -n “`echo $2|sed ‘s/[0-9]//g’`” ] && echo “第二个参数必须为数字” && exit 1

 

普通变量判断:

[ -n “`echo $num|sed ‘s/[0-9]//g’`” ] && echo “第二个参数必须为数字” && exit 1

 

条件表达式,大括号的用法:

[ -n “`echo $num|sed ‘s/[0-9]//g’`” ] && {

echo “第二个参数必须为数字

exit 1

}

 

7.2、方法2:变量的子串替换加正则表达式

[root@localhost ~]# num=long123

[root@localhost ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1||echo 0

0   #这个结果说明前面的结果不为0,即有非数字字符

 

[root@localhost ~]# num=500

[root@localhost ~]# [ -z "`echo "${num//[0-9]/}"`" ] && echo 1||echo 0

1   #这个结果说明前面的结果去掉数字后为0,即没有非数字字符

 

7.3、方法3:变量的子串替换加正则表达式(特殊判断思路)

思路:如果num长度不为0,并且把num中的非数字部分删除,然后看结果是不是等于num本身,如果两者都成立就是数字。

-n “$num”   #如果num长度不为0表达式

“$num” = “${num//[^0-9]/}”   #num中的非数字部分删除,然后看结果是不是等于num本身,如果两者都成立就是数字。

 

完整表达式:

[root@localhost ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"

it is num

 

7.4、方法4expr计算判断

[root@localhost ~]# expr $1 + 0 &>/dev/null

[root@localhost ~]# [ $? -eq 0 ] && echo int