细说Linux系统管理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4 条件判断

test命令是Bash中重要的判断命令,也是Shell脚本中条件判断的重要辅助工具。当我们需要让程序自动判断哪些事情是成立的时,test命令就派上用场了。

3.4.1 按照文件类型进行判断

根据表3-5,我们先来看看test可以进行哪些文件类型的判断。

表3-5 文件类型判断

光看这张表是完全不知道该怎么操作的,我们来举个例子吧。先来判断一下我们存放脚本的目录/root/sh/是否存在,命令如下:

    [root@localhost ~]# test -e /root/sh/

这条命令也可以这样写:

    [root@localhost ~]# [ -e /root/sh/ ]

它们的作用是一样的,推荐使用“[]”方式。因为在脚本的条件语句中主要应用这种方式。但是这两条命令执行完后是没有任何结果的。不过要注意,如果使用“[]”方式,则在“[]”的内部和数据之间必须使用空格;否则判断式会报错。

其实test命令就是这样的,但是我们该如何判断这条命令的执行是否正确呢?还记得“$? ”预定义变量吗?就是看这个变量的值,如果变量值为0,则代表test判断为真;如果变量值非0,则代表test判断为假。例如:

    [root@localhost ~]# [ -e /root/sh/ ]
    [root@localhost ~]# echo $?
    0
    #判断结果为0, /root/sh/目录是存在的

    [root@localhost ~]# [ -e /root/test ]
    [root@localhost ~]# echo $?
    1
    #在/root/下并没有test文件或目录,所以“$? ”的返回值为非0

不过这样查看命令的结果非常麻烦,也不直观。还记得多命令顺序执行符“&&”和“||”吗?我们可以再判断一下/root/sh/是否是目录,命令如下:

    [root@localhost ~]# [ -d /root/sh ] && echo "yes" || echo "no"
    #第一条判断命令如果正确执行,则打印“yes”;否则打印“no”
    yes

这样就直观多了,不过也并不方便。等我们学习了条件判断,就会知道test判断到底用在哪里,现在就先这样吧。

3.4.2 按照文件权限进行判断

test是非常完善的判断命令,还可以判断文件的权限,我们通过表3-6来看看。

表3-6 文件权限判断

在使用test命令判断权限时,并不能区分所有者、属组和其他人。只要文件拥有权限,test判断就为真,而不能区分哪个用户身份拥有权限。比如:

    [root@localhost ~]# ll student.txt
   -rw-r--r--. 1 root root 97 6月   7 07:34 student.txt
    [root@localhost ~]# [ -w student.txt ] && echo "yes" || echo "no"
    yes
    #判断文件是拥有写权限的

虽然student.txt文件只有所有者拥有写权限,但在用test判断时,是不能区分身份的,只要拥有写权限就返回真。

3.4.3 两个文件之间进行比较

通过表3-7来看看如何进行两个文件之间的比较。

表3-7 两个文件之间进行比较

我们一直很苦恼,到底该如何判断两个文件是否是硬链接呢?这时test就派上用场了,命令如下:

    [root@localhost ~]# ln /root/student.txt /tmp/stu.txt
    #创建一个硬链接
    [root@localhost ~]# [ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo
    "no"
    yes
    #用test测试一下,果然很有用

3.4.4 两个整数之间进行比较

通过表3-8来学习一下如何在两个整数之间进行比较。

表3-8 两个整数之间进行比较

举个例子:

    [root@localhost ~]# [ 23-ge 22 ] && echo "yes" || echo "no"
    yes
    #判断23是否大于等于22,当然是了
    [root@localhost ~]# [ 23-le 22 ] && echo "yes" || echo "no"
    no
    #判断23是否小于等于22,当然不是了

3.4.5 字符串判断

通过表3-9来学习一下字符串判断。

表3-9 字符串判断

举个例子:

    [root@localhost ~]# name=sc
    #给name变量赋值
    [root@localhost ~]# [ -z "$name" ] && echo "yes" || echo "no"
    no
    #判断name变量是否为空,因为不为空,所以返回no

再来看看如何判断两个字符串相等,命令如下:

    [root@localhost ~]# aa=11
    [root@localhost ~]# bb=22
    #给变量aa和bb赋值
    [root@localhost ~]# [ "$aa" == "bb" ] && echo "yes" || echo "no"
    no
    #判断两个变量的值是否相等,明显不相等,所以返回no

3.4.6 多重条件判断

通过表3-10来看看多重条件判断是什么样子的。

表3-10 多重条件判断

举个例子:

    [root@localhost ~]# aa=11
    #给变量aa赋值
    [root@localhost ~]# [ -n "$aa"  -a "$aa" -gt 23 ] && echo "yes" || echo "no"
    no
    #判断变量aa是否有值,同时判断变量aa的值是否大于23
    #因为变量aa的值不大于23,所以虽然第一个判断值为真,但返回的结果是假

要想让刚刚的判断式返回真,需要给变量aa重新赋一个大于23的值,命令如下:

    [root@localhost ~]# aa=24
    [root@localhost ~]# [ -n "$aa"  -a "$aa" -gt 23 ] && echo "yes" || echo "no"
    yes

再来看看逻辑非是什么样子的,命令如下:

    [root@localhost ~]# [ ! -n "$aa" ] && echo "yes" || echo "no"
    no
    #本来“-n”选项是变量aa不为空,返回值就是真
    #加入“! ”之后,判断值就会取反,所以当变量aa有值时,返回值是假

注意:“! ”和“-n”之间必须加入空格,否则会报错。