『忘了再学』Shell基础 — 32、Shell中test测试命令详解
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测试命令详解的更多相关文章
- 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...
- 『忘了再学』Shell基础 — 20、Shell中的运算符
目录 1.Shell常用运算符 2.Shell中数值运算的方法 (1)方式一 (2)方式二 (3)方式三(推荐) 1.Shell常用运算符 Shell中常用运算符如下表: 优先级数值越大优先级越高,具 ...
- 『忘了再学』Shell基础 — 2、Shell的作用与分类
目录 1.Shell的作用 2.Shell的分类 1.Shell的作用 Shell除了能解释用户输入的命令,将它传递给内核,还可以: 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果. 在 ...
- 『忘了再学』Shell基础 — 12、用户自定义变量
目录 1.变量定义 2.变量调用 3.变量的修改 4.查看变量 (1)-u选项说明: (2)-x选项说明: (3)set命令说明: 5.变量删除 1.变量定义 变量正确定义. 格式:变量名=" ...
- 『忘了再学』Shell基础 — 3、echo命令的介绍与使用
目录 1.echo命令的作用 2.echo命令的基本用法 3.echo命令的-e选项用法 4.echo命令一些特殊用法 (1)输出字符带有字体颜色 (2)输出字符带有背景颜色 在讲Shell脚本之前, ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- 『忘了再学』Shell基础 — 25、扩展正则表达式
目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...
- 『忘了再学』Shell基础 — 30、sed命令的使用
目录 1.sed命令说明 2.行数据操作 (1)查看文件中的数据 (2)删除文件中的数据 (3)向文件中追加数据 (4)向文件中插入数据 (5)修改文件中的多行数据(删除,追加,插入) (6)替换文件 ...
- 『忘了再学』Shell基础 — 1、Shell的介绍
目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...
- 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)
目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...
随机推荐
- 模拟FCFS调度算法(先来先服务)
文章目录 一.FCFS的介绍 二.代码演示 三.代码分析 1.使用节点模拟进程 2.SimulateFCFS(核心模拟FCFS类) 3.创建一个节点为n的队列(模拟就绪队列) 4.核心计算分析 5.输 ...
- nginx负载均衡的五种方式
文章目录 前言 :负载均衡是什么 一.方式1:轮询 二.方式2:权重 方式3:iphash 方式4:最小连接 方式5:fair 总结:根据这几种方式可以猜测处nginx的底层使用了计数器,从而可以将海 ...
- SpringMVC获取请求参数-集合类型
1.创建User实体类 ```java public class User { private String username; private int age; public String getU ...
- centos7 安装樱桃树cherrytree
樱桃树对于做笔记或者编程来说都是很好的工具.以前再网上找了很久还是稿不懂cherrytree的方法.后来才发现,其实根本就不用那么麻烦.直接在epel源里面安装句可以了. 下面说下安装步骤: 第一步: ...
- C语言求最大公约数最小公倍数(多种方法)
前言 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章. 单一求解 一.最大公约数 1.穷举法(最简单求解方式) 利用除法方式用当前的数字不断去除以 ...
- 安全开发运维必备,如何进行Nginx代理Web服务器性能优化与安全加固配置,看这篇指南就够了
本章目录 1.引言 1.1 目的 1.2 目标范围 1.3 读者对象 2.参考说明 2.1 帮助参考 2.2 参数说明 3.3 模块说明 3.服务优化 3.1 系统内核 3.2 编译优化 3.3 性能 ...
- 使用aspnetcore前后端分离开发,你一定要知道这个
前言 用过Vue单页面应用开发的,一定都知道Vue-router这个路由组件,它支持hash和history两种模式. HTML5 History 模式 vue-router 默认 hash 模式 - ...
- XCTF练习题---WEB---get_post
XCTF练习题---WEB---get_post flag:cyberpeace{5526ac8044f1c5cfb5c421d34dff7822} 解题步骤: 1.观察题目,打开场景 2.观察页面内 ...
- XCTF练习题---MISC---give_you_flag
XCTF练习题---MISC---give_you_flag flag:flag{e7d478cf6b915f50ab1277f78502a2c5} 解题步骤: 1.观察题目,下载附件 2.打开发现是 ...
- 4.18-token验证
在postman编写的每一个叫测试用例,既然收测试用例,那么就会有结果对比 API测试断言tests(判断一个接口测试用例是否成功,或者说是通过,是根据断言的三个条件都成立的情况下得到的结果) 协议状 ...