《忘记再学习》Shell基础-32、Shell中测试命令详解

目录

1、test 测试命令(1)test 命令介绍

Shell中的test命令用来测试某个条件或者某个条件是否真的存在。

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

(2)如何使用测试命令

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

(3)示例

要求:判断文件是否存在。

<code class="language-shell"># 说明:
# -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、按文件类型判断

我们先来看看测试可以判断哪些文件类型:

测试选项

-b 文件

判断文件是否存在,是否为块设备文件(是否为块设备文件为真)。(稀有的)

-c 文件

判断文件是否存在且是字符设备文件(如果是字符设备文件则为真)。(稀有的)

-d 文件

判断文件是否存在,是否为目录文件(是目录为真)。(常见的)

-e 文件

确定文件是否存在(存在为真)。(常见的)

-f 文件

图片[1]-《忘记再学习》Shell基础-32、Shell中测试命令详解-唐朝资源网

判断文件是否存在,是否为普通文件(普通文件为真)。(常见的)

-L 文件

判断文件是否存在,是否为符号链接文件(是否为符号链接文件为真)。(常见的)

-p 文件

判断文件是否存在,是否为管道文件(管道文件为真)。(稀有的)

-s 文件

判断文件是否存在且为非空(非空为真)。

-S 文件

确定文件是否存在并且是套接字文件(对于套接字文件为 true)。

例子:

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

图片[2]-《忘记再学习》Shell基础-32、Shell中测试命令详解-唐朝资源网

# 可以看到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、比较两个文件

看看下表,看看如何在两个文件之间做一个比较(用less来理解):

测试选项

文件 1 -nt 文件 2

确定文件 1 的修改时间是否比文件 2 的修改时间新(如果是新则为 true)。

文件 1 -ot 文件 2

确定文件 1 的修改时间是否比文件 2 的修改时间更早(如果更旧则为 true)。

文件 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 字符串

检查字符串是否为空(如果为空则返回true)

-n 字符串

检查字符串是否不为空(如果不为空则返回true)

字符串 1 == 字符串 2

判断字符串1是否等于字符串2(相等返回true)

字符串 1 != 字符串 2

判断字符串 1 是否不等于字符串 2(不相等则返回 true)

示例 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

图片[3]-《忘记再学习》Shell基础-32、Shell中测试命令详解-唐朝资源网

# 变量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"选项之间必须加入空格,否则会报错的。

© 版权声明
THE END
喜欢就支持一下吧
点赞77赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容