Linux Shell编程 test命令

概述

test 命令是Shell 脚本中用来进行条件判断的。

test命令示例

按照文件类型进行判断

测试选项

作 用

-b 文件

判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)

-c 文件

判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)

-d 文件

判断该文件是否存在,并且是否为目录文件(是目录文件为真)

-e 文件

判断该文件是否存在(存在为真)

-f 文件

判断该文件是否存在,井且是否为普通文件(是普通文件为真)

-L 文件

判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真〉

-p 文件

判断该文件是否存在,并且是否为管道文件(是管道文件为真)

-s 文件

判断该文件是否存在,并且是否为非空(非空为真)

-S 文件

判断该文件是否存在,并且是否为套接字文件(是套接字文件为真〉

判断目录 /root/sh/ 是否存在,命令如下:

1[root@localhost ~]# test -e /root/sh/ 2or 3[root@localhost ~]# [-e /root/sh/]

推荐使用"[]"方式,在脚本的条件语句中主要应用这种方式。两条命令执行完后是没有任何结果的。不过要注意,如果使用"[]"方式,则在"[]"的内部和数据之间必须使用空格;否则判断式会报错。可以通过"$?"预定义变量判断这条命令的执行是否正确,如果变量值为 0,则代表 test 判断为真;如果变量值非 0,则代表 test 判断为假。例如:

1[root@localhost ~]# [-e /root/sh/] 2[root@localhost ~]# echo $? 30

判断结果为0,/root/sh/目录是存在的

1[root@localhost ~]# [-e /root/test] 2[root@localhost ~]# echo $? 31

在/root/下并没有test文件或目录,所以"$?"的返回值为非0

也可以通过多命令顺序执行符"&&"和"||" 判断一下 /root/sh/ 是否是目录,命令如下:

1[root@localhost ~]# [-d /root/sh] && echo "yes"||echo "no" 2yes

第一条判断命令如果正确执行,则打印"yes"; 否则打印"no" 

按照文件权限进行判断

测试选项

作 用

-r 文件

判断该文件是否存在,并且是否拥有读权限(有读权限为真)

-w 文件

判断该文件是否存在,并且是否拥有写权限(有写权限为真)

-x 文件

判断该文件是否存在,并且是否拥有执行权限(有执行权限为真)

-u 文件

判断该文件是否存在,并且是否拥有SUID权限(有SUID权限为真)

-g 文件

判断该文件是否存在,并且是否拥有SG1D权限(有SGID权限为真)

-k 文件

判断该文件是否存在,并且是否拥有SBIT权限(有SBIT权限为真)

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

1[root@localhost ~]# ll student.txt 2-rw-r--r--. 1 root root 97 67 07:34 student.txt 3[root@localhost ~]# [-w student.txt] && echo "yes"||echo "no" 4yes

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

两个文件之间进行比较

测试选项

作 用

文件 1 -nt文件 2

判断文件1的修改时间是否比文件2的新(如果新则为真)

文件 1 *ot文件 2

判断文件1的修改时间是否比文件2的旧(如果旧则为真)

文件 1 -ef 文件 2

判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个 判断用于判断硬链接是很好的方法

通过test命令判断两个文件是否是硬链接,命令如下:

1[root@localhost ~]# ln /root/student.txt /tmp/stu.txt 2#创建一个硬链接 3[root@localhost ~]# [/root/student.txt -ef/tmp/stu.txt] && echo "yes" || echo "no" 4yes

两个整数之间进行比较

测试选项

作 用

整数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(小于等于为真)

判断23是否大于等于22

1[root@localhost ~]# [23 -ge 22] && echo "yes"||echo "no" 2yes

判断23是否小于等于22

1[root@localhost ~】# [23 -le 22] && echo "yes"||echo "no" 2no

字符串判断

测试选项

作 用

-z 字符串

判断字符串是否为空(为空返回真)

-n 字符串

判断宇符串是否为非空(非空返回真)

字串 1 = 字串 2

判断字符串 1 是否和字符串 2 相等(相等返回真)

字串 1 != 字串 2

判断字符串 1 是否和字符串 2 不相等(不相等返回真)

给name变量赋值,判断name变量是否为空

1[root@localhost ~]# name=sc 2[root@localhost ~]# [-z "$name"] && echo "yes" || echo"no" 3no

判断两个字符串相等,命令如下:

1[root@localhost ~]# aa=11 2[root@localhost ~]# bb=22 3[root@localhost ~]#["$aa"=="bb"] && echo "yes" || echo "no" 4no

多重条件判断

测试选项

作 用

判断 1 -a 判断 2

逻辑与,判断 1 和判断 2 都成立,最终的结果才为真

判断 1 -o 判断 2

逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真

! 判断

逻辑非,使原始的判断式取反

判断变量aa是否有值,同时判断变量aa的值是否大于23

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

因为变量aa的值不大于23,所以虽然第一个判断值为真,但返回的结果是假

使用逻辑非,命令如下:

1[root@localhost ~]# [! -n "$aa"] && echo "yes" || echo "no" 2no

"-n"选项是变量aa不为空,返回值就是真

加入"!"之后,判断值就会取反,所以当变量aa有值时,返回值是假

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java中比较两个时间的差值

项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat