test 命令是 Bash 中重要的判断命令,也是 Shell 脚本中条件判断的重要辅助工具。当我们需要让程序自动判断哪些事情是成立的时,test 命令就派上用场了。

按照文件类型进行判断

根据表 1,我们先来看看 test 可以进行哪些文件类型的判断。

表 1 文件类型判断

测试选项

作 用

-b 文件

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

-c 文件

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

-d 文件

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

-e 文件

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

-f 文件

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

-L 文件

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

-p 文件

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

-s 文件

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

-S 文件

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

光看这张表是完全不知道该怎么操作的,我们来举个例子吧。先来判断一下我们存放脚本的目录 /root/sh/ 是否存在,命令如下:

[root@localhost ~]# test -e /root/sh/

这条命令也可以这样写:

[root@localhost ~]# [-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

这样就直观多了,不过也并不方便。等我们学习了条件判断,就会知道 test 判断到底用在明哩,现在就先这样吧。

按照文件权限进行判断

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

表 2 文件权限判断

测试选项

作 用

-r 文件

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

-w 文件

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

-x 文件

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

-u 文件

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

-g 文件

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

-k 文件

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

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

[root@localhost ~]# ll student.txt

-rw-r--r--. 1 root root 97 6月7 07:34 student.txt

[root@localhost ~]# [-w student.txt] && echo "yes"||echo "no"

yes

#判断文件是拥有写权限的

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

两个文件之间进行比较

通过表 3 来看看如何进行两个文件之间的比较。

表 3 两个文件之间进行比较

测试选项

作 用

文件 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测试一下,果然很有用

两个整数之间进行比较

通过表 4 来学习一下如何在两个整数之间进行比较。

表 4 两个整数之间进行比较

测试选项

作 用

整数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,当然不是了

字符串判断

通过表 5 来学习一下字符串判断。

表 5 字符串判断

测试选项

作 用

-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

多重条件判断

通过表 6 来看看多重条件判断是什么样子的。

表 6 多重条件判断

测试选项

作 用

判断 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"之间必须加入空格,否则会报错。

shell判定一个变量等于-n_Shell test命令:条件判断,检查某条件是否成立相关推荐

  1. php检测一个变量是否设置函数,php如何判断变量是否有设置的函数

    php判断变量是否有设置的函数的方法:可以利用isset()函数来进行判断.isset()函数用于检测变量是否已设置并且非NULL.如果指定变量存在且不为NULL,则返回TRUE,否则返回FALSE. ...

  2. python 返回函数 变量_你如何设置一个变量等于由python函数返回的值

    我试图设计一个系统,允许我在点击时将精灵移动到光标位置,类似于RuneScape,玩家将移动到鼠标在屏幕上单击的位置.以下是我的代码如下: for event in pygame.event.get ...

  3. Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作

    文章目录 前言 获取命令执行结果 使用反引号 `` ` ``command `` ` ``来执行命令 使用括号组合 $(command) 来执行命令 两种方式的区别 特殊变量使用 $0 $1 $2 . ...

  4. shell中如何判断一个变量是否为空

    shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 #!/ ...

  5. 判断一个变量是不是指针

    文章目录 1 编写程序判断一个变量是不是指针 1 编写程序判断一个变量是不是指针 拾遗: C++中仍然支持C语言中的可变参函数. C++编译器匹配的调用优先级 重载函数. 函数模板. 变参函数. 思路 ...

  6. Shell 入门(变量/条件语句/运算符)

    代码规范 注释 # 文件后缀 .sh 变量 #定义变量 等号两边不能有空格 class_name="123" #只读变量 cc='12' readonly cc #变量的使用 变量 ...

  7. [Shell]条件判断与流程控制:if, case, for, while, until

    [条件判断] 1. 按文件类型进行判断 -b 文件    判断该文件是否存在,并且为块设备文件(是块设备文件为真) -c 文件    判断该文件是否存在,并且为字符设备文件(是字符设备文件为真) -d ...

  8. linux循环条件,shell脚本编写 之 条件选择,条件判断,循环语句

    1 概述 编写shell脚本,一般离不开条件选择,条件判断以及循环语句.掌握这三个语法,将大大提高脚本的编写效率,使得脚本编写更加灵活,完成X相对复杂的工作 2 条件选择if语句 if语句选择执行,逐 ...

  9. 【Shell教程】四----输入输出,条件判断,循环

    Shell输出 echo命令 在shell中,echo 指令用于字符串的输出 命令格式: echo string 可以使用 (反斜号)''(单引号)""(双引号)包含字符串,具体功 ...

最新文章

  1. 计算机网络与通信pdf谢希仁_考研刷题资料谢希仁《计算机网络》(第7版)配套题库【考研真题精选(部分视频讲解)+章节题库】...
  2. numpy.concatenate详解
  3. 网络:301和302
  4. mybatis多个foreach_使用 Mybatis 的 foreach 批量模糊 like 查询及批量插入
  5. OJ1180: 成绩统计(结构体专题)(C语言)
  6. 正则表达式 -- 个人笔记
  7. php 获取服务器端口,PHP获取当前服务器详细信息
  8. 怎么在线把QLV格式转成MP4
  9. linux中使用rpm命令详解
  10. win 10 设置静态ip子网前缀长度的计算方法
  11. matlab绘制布尔运算图,干货丨最全的布尔运算制作小图标教程!
  12. 基于Huffman算法实现文件压缩解压缩(C语言)
  13. 2022IC秋招面经分享【禾赛科技·FPGA开发工程师(上海)】
  14. freertos和ucos的区别
  15. JavaSwing_3.1: JPanel(面板)
  16. 计算机在识别图像时“看到”了什么?
  17. python爬取网页内容post_python爬虫之使用POST抓取网页内容
  18. C++二维数组的初始化赋值及示例
  19. linux 格斗游戏,新闻|“战斗砖块剧场”占据了 Steam 上 Linux游戏排行榜首位
  20. vs2019导出导入配置

热门文章

  1. 【代码笔记】iOS-实现网络图片的异步加载和缓存
  2. hibernate映射-单向n-n关联关系
  3. 法兰程序CAD开发的进展
  4. 用visio反向工程画oracle数据库表的结构图
  5. 计算机网络——基本介绍
  6. Leetcode--41. 缺失的第一个正数
  7. crontab 日志_聊聊老板让我删除日志文件那些事儿
  8. Linux 蓝牙读写,实战Linux Bluetooth编程(三) HCI层编程
  9. oracle 怎么备份sqlserver数据库,Oracle和sqlserver数据库的备份与恢复
  10. 计算机科学中的逻辑学术,简述逻辑学在计算机科学中的应用