概述

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. error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

    解决编译php扩展xsl时出现 error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution ...

  2. 使用加密的squid配合stunnel实现HTTP代理

    现在大部分人都是用ssh tunnel来搭建socks5代理,其实这种方式效率并不高,ssh tunnel并不是为了做代理而存在的.一个比较好的方法是加密squid配合stunnel实现http代理. ...

  3. JS判断不同的浏览器,不同的浏览器版本

    JS判断不同的浏览器,不同的浏览器版本

  4. js动态创建input

    var muiDiv = document.getElementById('mui-content'); createInput('img','text',imgSrc,muiDiv); functi ...

  5. Linux make语法

    make是一种控制编译或者重复编译软件的工具. make可以自动关键软件的编译内容.方式和时机,从而使程序员把更多的精力集中在编写代码上. make主要的机制是在命令行键入make命令,make会自动 ...

  6. git commit --amend用法

    提交信息很长时间内会一直保留在你的代码库(code base)中,所以你肯定希望通过这个信息正确地了解代码修改情况. 下面这个命令可以让你编辑最近一次的提交信息,但是你必须确保没有对当前的代码库(wo ...

  7. -webkit-transition: all .2s ease-in-out;

    W3C标准中对CSS3的transition这是样描述的:CSS的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发,并 ...

  8. 2204 Problem A(水)

    问题 A: [高精度]被限制的加法 时间限制: 1 Sec  内存限制: 16 MB 提交: 54  解决: 29 [提交][状态][讨论版] 题目描述 据关押修罗王和邪狼监狱的典狱长吹嘘,该监狱自一 ...

  9. C# 关于在原图中寻找子图片坐标的类

    在网上找了好久,没有一个现成的例子,自己也发帖子可惜没有找到好办法. 只好自己动手写了, 以下为个人想法所写,算法可能不会太好,如果各位有好的例子发来大家一起分享一下. 这个类主要实现了图片坐标查找功 ...

  10. 解决ios8 webView加载的地图无法定位问题

    本文转载至http://www.cocoachina.com/bbs/read.php?tid-237825.html     1.在文件info.pilist 中导入 NSLocationWhenI ...