【9】shell:条件判断 test

一、按照文件类型进行判断


测试选项作用
-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件判断该文件是否存在,并且是否为目录文件(是目录文件为真)
-e 文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,井且是否为普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真〉
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空(非空为真)
-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真〉
  • 实例演示

    A:判断目录 /root/sh/ 是否存在

    test -e /root/sh/
    

    或者

    [-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

这样就直观多了!

二、按照文件权限进行判断


测试选项作用
-r 文件判断该文件是否存在,并且是否拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且是否拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并且是否拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否拥有SG1D权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否拥有SBIT权限(有SBIT权限为真)
  • 实例演示

[root@localhost ~]$ [-w student.txt] && echo "yes"||echo "no"
yes
#判断文件是拥有写权限的

三、两个文件之间进行比较


测试选项作用
文件 1 -nt文件 2判断文件1的修改时间是否比文件2的新(如果新则为真)
文件 1 *ot文件 2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件 1 -ef 文件 2判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个 判断用于判断硬链接是很好的方法

我们一直很苦恼,到底该如何判断两个文件是否是硬链接呢?这时 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测试一下,果然很有用

四、两个整数之间进行比较


测试选项作用
整数1 -eq 整数 2判断整数 1 是否和整数 2 相等(相等为真)
整数1 -ne 整数 2判断整数 1 是否和整数 2 不相等(不相等为真)
整数1 -gt 整数 2判断整数 1 是否大于整数 2 (大于为真)
整数1 -lt 整数 2判断整数 1 是否小于整数 2(小于为真)
整数1 -ge 整数 2判断整数 1 是否大于等于整数 2 (大于等于为真)
整数1 -le 整数 2判断整数 1 是否小于等于整数 2(小于等于为真)
  • 实例演示
[root@localhost ~]# [23 -ge 22] && echo "yes"||echo "no"
yes
#判断23是否大于等于22,当然是了
[root@localhost ~】# [23 -le 22] && echo "yes"||echo "no"
no
#判断23是否小于等于22,当然不是了

五、字符串判断


测试选项作用
-z 字符串判断字符串是否为空(为空返回真)
-n 字符串判断宇符串是否为非空(非空返回真)
字串 1 = 字串 2判断字符串 1 是否和字符串 2 相等(相等返回真)
字串 1 != 字串 2判断字符串 1 是否和字符串 2 不相等(不相等返回真)
  • 实例演示
[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

六、多重条件判断


测试选项作用
判断 1 -a 判断 2逻辑与,判断 1 和判断 2 都成立,最终的结果才为真
判断 1 -o 判断 2逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真
! 判断逻辑非,使原始的判断式取反
  • 实例演示
[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"之间必须加入空格,否则会报错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值