概述

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. IOS设计模式的六大设计原则之迪米特法则(LOD,Law Of Demeter)

    定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要调用 ...

  2. UVA11082 Matrix Decompressing 最大流建模解矩阵,经典

    /** 题目:UVA11082 Matrix Decompressing 链接:https://vjudge.net/problem/UVA-11082 题意:lrj入门经典P374 已知一个矩阵的行 ...

  3. Editing a Book UVA - 11212 IDA*

    You have n equal-length paragraphs numbered 1 to n . Now you want to arrange them in the order of 1 ...

  4. mysql 数据库复制表 create table city1 like city;

    -- 只复制表结构 create table city1 like city; INSERT INTO test2 SELECT * FROM test; -- 上面的表必须存在 -- 复制整张表的数 ...

  5. 对象中prototype与__proto__与从cinstructor的作用和区别

    首先先要知道prototype什么时间才会有 只有在创建函数的时候,每当函数创建的时候才会原型prototype,还有一个constructor,这个不是函数独有的,对象也有 下面就来说说对象prot ...

  6. apache2+svn Expected FS format '2'; found format '3'

    format格式与svn版本号我猜对应如下: 1.4.x 对应 format 2 1.5.x 对应 format 3 …… 1.8.x 对应 format 6 那么每个format创建出的repo要用 ...

  7. asp.net网站底部的版权信息实现代码且可维护

    网站底部的版权信息在特殊情况还是比较重要的所以在实现的时候一定要尽可能的做到可维护性,接下来将介绍一些技巧可达到可维护效果,感兴趣的你可不要错过了哈 一个大网站页面很多,如果每个版权信息直接写在下面, ...

  8. ubuntu12.04部署ROR

    刚开始部署这玩意是很折磨的,折腾吧. 确保使用最新版本的linux,否则成功率会大大降低,因为ruby开源社区对于ubuntu的支持总是不兼容旧版本的.笔者部署时的版本是ubuntu12.04 每次都 ...

  9. php中变量引用&不可与global共同使用

    问题来源,新公司debug. 程序中代码大致如下 class Ci { private static $instance = NULL; public $name = 'hello'; public ...

  10. 非jsonp解决跨域问题

    1.服务器端解决跨域问题:配置filter在filter中设置请求头import java.io.IOException; import javax.servlet.Filter;import jav ...