1、test测试命令

(1)test命令介绍

在Shell中的test测试命令,用于测试某种条件或某几种条件是否真实存在。

在Shell中的test测试命令,是判断语句和循环语句中条件测试的工具。test命令经常用于对判断语句进行测试,用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

(2)test命令使用方式

Shell中test命令的用法有两种:

  • 方式一:test expression

    test判断expression成立时,返回值状态为 0,否则为非 0 值。

    expression为表达式。
  • 方式二:test命令也可以简写为[ ]

    这时的test命令格式为:[ expression ]

    expression为表达式。

    注意:[]expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,比 test使用频率高。

(3)示例

需求:判断一个文件是否存在。

# 说明:
# -e 选项是test命令中判断文件是否存在的选项
# test命令用命令行的方式执行是没有返回显示的,
# 我们可以通过查看$?变量的方式,查看上一条命令是否正确执行。
# 返回值为0,表示上一条命令正确执行,
# 返回值为非0,表示上一条命令没有正确执行。 # 判断一个文件是否存在
# 方式一:
[root@localhost tmp]# test -e student.txt
# 结果为0,表示上一条命令正确执行,说明student.txt文件存在。
[root@localhost tmp]# echo $?
0 # 方式二:
[root@localhost tmp]# [ -e abc.txt ]
# 结果为非0,表示上一条命令没有正确执行,说明abc.txt文件不存在。
[root@localhost tmp]# echo $?
1 # 如果不想每次执行完test命令,还要查看$?变量,来确定命令是否正确实行,
# 可以使用如下编写方式:(方式一同理)
[root@localhost tmp]# [ -e abc.txt ] && echo yes || echo no
no
[root@localhost tmp]# [ -e student.txt ] && echo yes || echo no
yes

提示:在编写Shell程序时,一般都是使用第二种书写方式(没见过不一般的情况)。

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

我们先来看看test可以进行哪些文件类型的判断:

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

示例:

Linux系统中tmp目录下的文件,情况如下:

[root@localhost tmp]# ll
总用量 12
-rw-r--r--. 1 root root 371 10月 16 13:28 student.txt
-rw-r--r--. 1 root root 318 10月 14 18:03 test2.txt
-rw-r--r--. 1 root root 69 10月 16 17:39 test.txt

练习:

# 1.判断student.txt文件是否为目录
[root@localhost tmp]# [ -d student.txt ] && echo yes || echo no
no # 2.判断student.txt文件是否为普通文件
[root@localhost tmp]# [ -f student.txt ] && echo yes || echo no
yes # 3.判断student.txt文件是中内容是否为空
[root@localhost tmp]# [ -s student.txt ] && echo yes || echo no
yes # 我们创建一个空文件,在判断一次。
[root@localhost tmp]# touch abc
[root@localhost tmp]# [ -s abc ] && echo yes || echo no
no # 注意:
# 用命令行执行命令的时候可以写相对路径,因为我在对应的文件夹当中。
# 而在编写Shell脚本的时候,文件名一定要加上绝对路径,要不然有可能找不到。

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

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

测试选项 作用
-r 文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)(常用)
-w 文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)(常用)
-x 文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)(常用)
-u 文件 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)(会用到)
-g 文件 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)(会用到)
-k 文件 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

示例:

Linux系统中tmp目录下的文件,情况如下:

[root@localhost tmp]# ll
总用量 12
-rw-r--r--. 1 root root 371 10月 16 13:28 student.txt
-rw-r--r--. 1 root root 318 10月 14 18:03 test2.txt
-rw-r--r--. 1 root root 69 10月 16 17:39 test.txt

练习:

# 1.查看tmp目录student.txt是否有写的权限
# tmp目录student.txt文件权限如下:
# -rw-r--r--. 1 root root 371 10月 16 13:28 student.txt
[root@localhost tmp]# [ -w student.txt ] && echo yes || echo no
yes
# 上面证明在tmp目录中student.txt文件存在,并拥有写权限。 # 注意:
# -w选项是分不清是所有者,所数组,和其他人谁有写权限的,
# 只要该文件任何一个身份中出现写的权限,-w选项的判断就是正确的。
# 如果你非要判断某一个身份是否有写的权限,
# 就需要我们自己手动把文件的权限按需求截取下来,然后编写程序来判断。 # -r选项和-x选项同理。 # 2.判断student.txt文件是否拥有SUID权限
[root@localhost tmp]# [ -u student.txt ] && echo yes || echo no
no # 可以看到student.txt文件没有设置SUID权限
# 我们接下来给student.txt文件设置一下SUID权限 [root@localhost tmp]# chmod u+s student.txt # 查看一下测试student.txt文件的权限
[root@localhost tmp]# ll student.txt
-rwSr--r--. 1 root root 371 10月 16 13:28 student.txt # 可以看到student.txt文件的权限中多了一个大S权限
# 关于SUID权限相关内容可以点击如下链接进行查看:
# https://blog.csdn.net/Liuyuelinjiayou/article/details/107197846
# 接下来我们在判断student.txt文件受否拥有SUID权限
[root@localhost tmp]# [ -u student.txt ] && echo yes || echo no
yes # 练习完成后,尽量尽快的还原文件,一般之后的练习使用。
[root@localhost tmp]# chmod u-s student.txt
[root@localhost tmp]# ll student.txt
-rw-r--r--. 1 root root 371 10月 16 13:28 student.txt

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

通过下表来看看如何进行两个文件之间的比较(少用了解一下):

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

示例:

# 把tmp目录下的student.txt文件,硬连接到root目录下student文件。
# 也就是给tmp目录下的student.txt文件创建一个硬连接,在root目录下。
[root@localhost tmp]# ln /tmp/student.txt /root/student # 然后判断/tmp/student.txt文件和/root/student文件是否为同一文件。
[root@localhost tmp]# [ /tmp/student.txt -ef /root/student ] && echo yes || echo no
yes
# 结果为是。

5、两个整数之间比较

通过下表来学习下如何在两个整数之间进行比较(常用):

测试选项 作用
整数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(小于等于为真)

示例:

# 1.-eq等于
[root@localhost tmp]# [ 66 -eq 88 ] && echo yes || echo no
no # 2.-lt小于
[root@localhost tmp]# [ 66 -lt 88 ] && echo yes || echo no
yes # 3.-le小于等于
[root@localhost tmp]# [ 66 -le 88 ] && echo yes || echo no
yes # 在Shell编程的时候,会把数值型变量引入条件判断表达式中,
# 就不会是光突突的数字了。

6、字符串的判断

通过下表我们来学习下字符串的判断(常用):

测试选项 作用
-z 字符串 判断字符串是否为空(为空返回真)
-n 字符串 判断字符串是否为非空(非空返回真)
字符串1 == 字符串2 判断字符串1是否和字符串2相等(相等返回真)
字符串1 != 字符串2 判断字符串1是否和字符串2不相等(不相等返回真)

示例1:

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

示例2:

# 给变量aa和变量bb赋值
[root@localhost tmp]# aa=Shell
[root@localhost tmp]# bb=Shell # 判断变量aa和变量bb是否相等
# 因为变量aa的值为"Shell",不等于字符串"bb",所以返回no。
[root@localhost tmp]# [ "$aa" == "bb" ] && echo yes || echo no
no # 变量aa和变量bb的值都为"Shell",所以返回yes。
[root@localhost tmp]# [ "$aa" == "$bb" ] && echo yes || echo no
yes

提示:Shell中用==双等号来比对两个字符串是否相等(内容相同)。使用-eq来比对两个整数是否相等。

7、多重条件判断

通过下表来看看多重条件判断是什么样子的(常用):

测试选项 作用
判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真。
判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真。
! 判断 逻辑非,使原始的判断式取反。

也就是说多重条件判断就是,可以同时判断多个条件,前边的条件都可以。

示例1:

# 定义一个变量aa赋值并赋值66。
[root@localhost tmp]# aa=66 # 判断变量aa是否有值,同时判断变量aa的是否大于88。
# 因为变量aa的值不大于88,所以虽然第一个判断值为真,返回的结果也是假。
[root@localhost tmp]# [ -n "$aa" -a "$aa" -gt 88 ] && echo "yes" || echo "no"
no # 给变量aa重新赋个大于88的值,返回结果就是yes了。
[root@localhost tmp]# aa=99
[root@localhost tmp]# [ -n "$aa" -a "$aa" -gt 88 ] && echo "yes" || echo "no"
yes

示例2:

# 练习逻辑非
# 说明:
# "-n"选项是变量aa不为空,返回值就是真。
# 加入"!"之后,判断值就会取反,所以当变量aa有值时,返回值是假.
# "!"+"-n"选项就和"-z"选项作用一样了。
[root@localhost tmp]# aa=99
[root@localhost tmp]# [ ! -n "$aa" ] && echo "yes" || echo "no"
no # 在定义一个没有赋值的变量cc,返回结果就是yes。
[root@localhost tmp]# [ ! -n "$cc" ] && echo "yes" || echo "no"
yes # 注意:"!"和"-n"选项之间必须加入空格,否则会报错的。

『忘了再学』Shell基础 — 32、Shell中test测试命令详解的更多相关文章

  1. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  2. 『忘了再学』Shell基础 — 20、Shell中的运算符

    目录 1.Shell常用运算符 2.Shell中数值运算的方法 (1)方式一 (2)方式二 (3)方式三(推荐) 1.Shell常用运算符 Shell中常用运算符如下表: 优先级数值越大优先级越高,具 ...

  3. 『忘了再学』Shell基础 — 2、Shell的作用与分类

    目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...

  4. 『忘了再学』Shell基础 — 12、用户自定义变量

    目录 1.变量定义 2.变量调用 3.变量的修改 4.查看变量 (1)-u选项说明: (2)-x选项说明: (3)set命令说明: 5.变量删除 1.变量定义 变量正确定义. 格式:变量名=" ...

  5. 『忘了再学』Shell基础 — 3、echo命令的介绍与使用

    目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...

  6. 『忘了再学』Shell基础 — 24、Shell正则表达式的使用

    目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...

  7. 『忘了再学』Shell基础 — 25、扩展正则表达式

    目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...

  8. 『忘了再学』Shell基础 — 30、sed命令的使用

    目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...

  9. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

  10. 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)

    目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...

随机推荐

  1. Spring5-IOC底层原理

    1.什么是IOC (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 (2)使用IOC目的:为了降低耦合度 2.IOC底层原理 (1)xml解析.工厂模式.反射

  2. Java语言学习day20--7月26日

    ###11抽象类的产生 A:抽象类的产生 a:分析事物时,发现了共性内容,就出现向上抽取.会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同.那么这时也可以抽取,但只抽取方法声明,不抽取方 ...

  3. Luffy /3/ 前台主页搭建&轮播图接口

    目录 前台主页搭建 components/Homeviwe.vue components/Banner.vue components/Header.vue components/Footer.vue ...

  4. YOLO系列梳理(三)YOLOv5

    ​  前言 YOLOv5 是在 YOLOv4 出来之后没多久就横空出世了.今天笔者介绍一下 YOLOv5 的相关知识.目前 YOLOv5 发布了新的版本,6.0版本.在这里,YOLOv5 也在5.0基 ...

  5. vue3 数据可视化项目

    可视化面板介绍 ​ 应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出. 01-使用技术 完成该项目 ...

  6. 实战 | 一文带你读懂Nginx反向代理

    一个执着于技术的公众号 前言 在前面的章节中,我们已经学习了nginx基础知识: 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文 ...

  7. dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露

    本文记录我将应用迁移到 dotnet 6 之后,在 Win7 系统上,因为使用 HttpWebRequest 访问一个本地服务,此本地服务开启 https 且证书链在此 Win7 系统上错误,导致应用 ...

  8. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  9. Centos7最小化安装报错There are no enabled repos. Run "yum repolist all" to see the repos you have.解决办法

    原因是缺少CentOS-Base.repo文件,因为我这台机器wget也不能用,所以我是下载到本地sftp上去的,传输的时候一定要在root用户下,否则会无法启动传输 这是报错的完整信息:Loadin ...

  10. extcon驱动及其在USB驱动中的应用

    extcon,是External Connector的简称,用于抽象外部连接器,比如说Audio Jack.USB MicroB/TypeC接口等.它的原型是Android的switch-class驱 ...