Linux Shell编程 test命令
概述
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命令的更多相关文章
- Linux Shell编程 awk命令
概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是l ...
- Linux Shell编程 sed命令
概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...
- Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||
https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...
- linux —— shell 编程(文本处理)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...
- linux —— shell 编程(编程语法)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...
- linux shell编程总结
linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...
- Linux Shell编程参考大全
本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...
- linux shell 编程参考
#!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...
- Linux Shell编程与编辑器使用详解
<Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...
随机推荐
- nefu 118 n!后面有多少个0 算数基本定理,素数分解
n!后面有多少个0 Time Limit 1000ms Memory Limit 65536K description 从输入中读取一个数n,求出n! 中末尾0的个数. input 输入有若干行.第一 ...
- Redis的Aof被阻塞原因调查
背景 Redis是单进程的,为了发挥多核的优势,我们redis集群采用在单台机器上部署多个redis实例,同时对持久化方式做了改进,采用rdb和增量的aof相结合的方式,appendfsync配置为n ...
- postgresql on centos (sequelize+pg+nodejs):Failed to find PostgresSQL server.Pleast double check your settings
公司的一个项目,使用的nodejs做服务端,数据库是postgresql,在本地时一切ok,放在centos时,postgresql配置ok,可以远程访问,但是nodejs在centos启动时,就会报 ...
- Consul实现原理系列文章1: 用Raft来实现分布式一致性
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.在前一篇文章中,我介绍了Raft算法.这篇文章会讲讲Consul是如何使用Raft算法来实现分布式一 ...
- Java进阶01 String类(转载)
String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String类. ...
- easyui最简单的左右布局实现,及tab的右键菜单实现
发现最近有些人问用JQuery easyui要怎么实现左右结构的布局.就是点击左边的菜单在右边的tab中打开.其实easyui要实现这种布局很简单,只需要简单的几行代码就ok了. 特意做了一个小小的d ...
- JavaScript中对象属性的加入和删除
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 浅谈IM软件怎样建立安全socket连接、登录
----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...
- SQL.Cookbook 读书笔记4 插入更新和删除
第四章 插入更新和删除 4.1 插入数据 ,'PROGRA','NEW YOURK'); 4.2 从一个表向另一个表中复制 insert into dept_east(deptno,dname,loc ...
- Retrofit学习笔记(一)
github上的介绍,简单明了 Type-safe HTTP client for Android and Java by Square, Inc. http://square.github.io/r ...