概述

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

test命令示例

按照文件类型进行判断

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

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

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

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

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

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

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

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

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

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

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

按照文件权限进行判断

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

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

[root@localhost ~]# ll student.txt
-rw-r--r--. root root 6月7 : student.txt
[root@localhost ~]# [-w student.txt] && echo "yes"||echo "no"
yes

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

两个文件之间进行比较

测试选项 作 用
文件 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

两个整数之间进行比较

测试选项 作 用
整数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

[root@localhost ~]# [ -ge ] && echo "yes"||echo "no"
yes

判断23是否小于等于22

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

字符串判断

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

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

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

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

[root@localhost ~]# aa=
[root@localhost ~]# bb=
[root@localhost ~]#["$aa"=="bb"] && echo "yes" || echo "no"
no

多重条件判断

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

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

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

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

使用逻辑非,命令如下:

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

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

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

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

Linux Shell编程 test命令的更多相关文章

  1. Linux Shell编程 awk命令

    概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是l ...

  2. Linux Shell编程 sed命令

    概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...

  3. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  4. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  5. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  6. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  7. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  8. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  9. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

随机推荐

  1. 【精】cookie、 sessionStorage 、localStorage之间的异同

    1.cookie:存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密.一般应用最典型的案列就是判断注册用户是否 ...

  2. String转int的几种常用方法

    String类型转int类型通常需要int的包装类Integer,该类有三个方法可以实现这种转换,分别为decode(String s).parseInt(String s).valueOf(Stri ...

  3. 嵌入式开发之davinci--- 8168 总的roi 编码

    http://bbs.61dsp.com/forum.php?mod=viewthread&tid=767

  4. ssl 生成证书

    使用OpenSSL生成证书 1.生成RSA密钥的方法 openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加 ...

  5. Python中的图像处理

    第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像.图像转换和缩放.计算导数.画图和保存结果等的基本工具.这 ...

  6. Android无线测试之—UiAutomator UiObject API介绍二

    点击与长按 一.组件区域位置关系 Rect 对象代表一个矩形区域 [Left,Top] [Right,Bottom] 二.点击与长按API 返回值 API 描述 boolean click() 点击对 ...

  7. python中json操作

    1.写操作.json文件dumps().dump()函数 d = { 'zll': { 'addr': '北京', 'age': 28 }, 'ljj': { 'addr': '北京', 'age': ...

  8. 进程通信(socket)

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  9. 1105 第K大的数(二分)

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0 ...

  10. jwPlayer读取本地视频及相关配置(Tomcat配置虚拟目录)

    最近做项目,发现好多知识点都是以前做过的或用过的,但最后要用到的时候,要么就记不牢了,要么就还是得重新整理一遍,所以以后有用的东东,尽量整理一下或Market下了. 项目要求:读取服务器多个视频到本地 ...