自学Linux Shell12.2-test命令
12.2-test命令
if-then语句不能测试命令退出状态码之外的条件,test命令提供了在if-then语句中测试不同条件的途径。
- 如果test命令中列出的条件成立,test命令就会退出并返回状态码0
- 如果test命令中列出的条件不成立,test命令就会退出并返回非0的退出状态码,这使得if-thon语句不会在执行
1. test命令
格式:
test condition
condition是test命令要测试的一系列参数和值。当用在if-then语句中时,test命令如下两种表示方法:
第一种:
if test condition
then
command
fi
- 如果不写test命令的condition部分,以非0的退出状态码退出,并执行else语句块
- 如果加入一个条件时,test会测试该条件
如果test命令中列出的条件成立,test命令就会退出并返回状态码0
如果test命令中列出的条件不成立,test命令就会退出并返回非0的退出状态码,这使得if-thon语句不会在执行
第二种:
if [condition]
then
command
fi
- 第一个方括号和第二个方括号之前必须加上一个空格,否则会报错
2. test命令的3类判断条件
- 数值比较
- 字符串比较
- 文件比较
2.1 数值比较(最常见)
| 参数 | 说明 |
|---|---|
| -eq | 等于则为真 |
| -ne | 不等于则为真 |
| -gt | 大于则为真 |
| -ge | 大于等于则为真 |
| -lt | 小于则为真 |
| -le | 小于等于则为真 |

但是涉及到浮点值时,数值条件测试会有一个限制。bash shell只能处理整数。
2.2 字符串比较
| 参数 | 说明 |
|---|---|
| = | 等于则为真 |
| != | 不相等则为真 |
| -z 字符串 | 字符串的长度为零则为真 |
| -n 字符串 | 字符串的长度不为零则为真 |
| < | 检查前面的字符串是否比后面的小 |
| > | 检查前面的字符串是否比后面的大 |
字符串相等性:
在比较两个字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内。


字符串顺序:
注意问题:
- 大于号和小于号必须转义
- 大于和小于顺序和sort命令采用的不同
比较测试中使用标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果
sort命令使用的是系统本地化语言设置中定义的排序顺序,对于英语,排序中小写字母出现在大写字母前面

2.3 文件比较
| 参数 | 说明 |
|---|---|
| -e 文件名 | 如果文件存在则为真 |
| -r 文件名 | 如果文件存在且可读则为真 |
| -w 文件名 | 如果文件存在且可写则为真 |
| -x 文件名 | 如果文件存在且可执行则为真 |
| -s 文件名 | 如果文件存在且至少有一个字符则为真 |
| -d 文件名 | 如果文件存在且为目录则为真 |
| -f 文件名 | 如果文件存在且为普通文件则为真 |
| -c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
| -b 文件名 | 如果文件存在且为块特殊文件则为真 |
| file1 -nt file2 | 检查file1是否比file2新 |
| file1 -ot file2 | 检查file1是否比file2旧 |
举例1:
上面代码使用了-d测试条件来检查用户的$HOME目录是否存在。如果它存在的话,它将继续使用cd命令来切到$HOME目录并进行显示目录下的文件。
举例2:
-e比较允许你在脚本中使用对象前检查文件或目录对象是否存在,然后上面代码表示若不存在创建一个新文件testing
举例3:
-e比较适用于文件和目录。但要确定指定的对象是个文件,必须用-f比较
3. 复合条件测试
if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用:
- [ condition1 ]&&[ condition1 ] 必须都满足
- [ condition1 ] || [ condition1 ] 满足一种即可
if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用:

以上解释如下,如果var1、var2同时满足大于15,输出$$;如果var1、var2有一个满足大于15,输出||;否则输出not
4 . if-then的高级特性
- 用于数学表达式的双括号 ((expression))
- 用于高级字符串处理功能的双方括号 [[ expression ]]
4.1 使用双括号
双括号的命令格式如下:
((expression))
expression可以是任意的数学赋值或比较表达式。
- 在双括号结构中,所有表达式可以像c语言一样,如:a++,b–等。
- 在双括号结构中,所有变量可以不加入:“$”符号前缀。
- 双括号可以进行逻辑运算,四则运算
- 双括号结构 扩展了for,while,if条件测试运算
- 支持多个表达式运算,各个表达式之间用“,”分开
- 不需要将双括号中表达式里的判断符号转义

4.2 使用双方括号
双方括号的命令格式如下:
1 [[expression]]
expression使用了test命令中采用的标准字符串比较。
自学Linux Shell12.2-test命令的更多相关文章
- 自学Linux Shell12.1-结构化命令if-then
点击返回 自学Linux命令行与Shell脚本之路 12.1-结构化命令if-then 许多程序要求对shell脚本中的命令施加一些逻辑流程控制.有一类命令会根据条件使脚本跳过某些命令.这样的命令通常 ...
- 自学Linux Shell12.3-case命令
点击返回 自学Linux命令行与Shell脚本之路 12.3-case命令 有了case命令,就不需要写出所有elif语句来不停的检查同一个变量的值了.case命令会采用列表格式来检查单个变量的多个值 ...
- 自学Linux Shell12.4-for命令
点击返回 自学Linux命令行与Shell脚本之路 12.4-for命令 1. for命令 格式一 for var in list do commands done 格式二 for var in li ...
- 自学Linux Shell12.5-while、until命令
点击返回 自学Linux命令行与Shell脚本之路 12.5-while.until命令 until 循环与 while 循环在处理方式上刚好相反. while循环用于不断执行一系列命令,也用于从输入 ...
- 自学Linux Shell12.6-嵌套循环for命令
点击返回 自学Linux命令行与Shell脚本之路 12.6-嵌套循环for命令 嵌套循环就是在一个循环中还有一个循环. 内部循环在外部循环体中,在外部循环的每次执行过程中都会触发内部循环,直到内部循 ...
- 自学Linux Shell12.7-控制循环break、continue命令
点击返回 自学Linux命令行与Shell脚本之路 12.7-控制循环break.continue命令 break命令.break命令用于跳出循环,使用break可以跳出任何类型的循环:for.whi ...
- 自学Linux Shell3.1-帮助命令man
点击返回 自学Linux命令行与Shell脚本之路 3.1-帮助命令man 1.man命令概述 默认bash shell提示符是美元符号($),这个符号表明shell在等待用户输入. Linux ma ...
- 自学Linux Shell3.3-列表命令ls
点击返回 自学Linux命令行与Shell脚本之路 3.3-列表命令ls ls命令用于显示文件目录列表,和Windows系统下DOS命令dir类似.当执行ls命令时,默认显示的只有非隐藏文件的文件名. ...
- 自学Linux Shell12.8-循环实例
点击返回 自学Linux命令行与Shell脚本之路 12.8-循环实例 待定. 3 fi bash shell的if语句会运行if后面的那个命令. 如果该命令的退出状态码是0 (该命令成功运行),位于 ...
随机推荐
- Artificial Intelligence Computing Conference(2018.09.12)
时间:2018.09.12地点:北京国际饭店会议中心
- 【转】JS中,中国标准时间转化为yyyy-MM-dd
'Thu May 12 2016 08:00:00 GMT+0800 (中国标准时间)'--此格式日期无法传到java后台,须格式化,方法如下 var d = new Date('Thu May 12 ...
- vue 结合mint-ui Message box的使用方法
两种方式使用: 一.全局注册 1.在main.js中引入 //引入 import { MessageBox } from 'mint-ui'; //全局使用,挂载到原型上 Vue.prototyp ...
- 【SQL】四种排序开窗函数
一 .简单了解什么是开窗函数 什么是开窗函数,开窗函数有什么作用,特征是什么? 所谓开窗函数就是定义一个行为列,简单讲,就是在你查询的结果上,直接多出一列值(可以是聚合值或是排序号),特征就是带有ov ...
- 认识Python&基础环境搭建
前言 作为.NET Coder可能.NET Core是现阶段首要学习方向,但是说实在的对Core真的不感冒. 原因有几点: 1.公司项目底层需要的一部分库,Core还不支持. 2.同样的需求,.NET ...
- 【下一代核心技术DevOps】:(七)持续集成Jenkins的应用(Aliyun Pipiline持续构建)
1. 前言 使用Jenkins比较好的就是可以在整个构建顺序中增加自定义的动作,比如构建成功给Leader发个邮件,给团队核心发个微信什么的. 当然最基本的核心还是它可以构建多种开发语言的项目,此类构 ...
- Slurm任务调度系统部署和测试(源码)(1)
1. 概述1.1 节点信息2. 节点准备3. 部署NTP服务器4. 部署LDAP服务器5. 部署Munge认证服务6. 部署Mysql数据库服务7. 部署slurm7.1 创建slurm用户7.2 挂 ...
- Spring源码阅读学习一
昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...
- PHP多进程编之pcntl_fork的实例详解
PHP多进程编之pcntl_fork的实例详解 其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全 ...
- 日常工作: 应用服务器Oracle驱动问题说明
1. .net使用Oracle驱动的发展等 作为.net线的产品的ERP产品 最初的版本 使用了.net 1.1发布时 微软提供的Oracle的驱动 但是后续微软的.net产品线貌似没有继续发展相应的 ...