Shell 脚本条件测试与比较

条件测试方法综述

在Bash的各种条件结构和控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时也会与if等条件语句相结合,来完成测试判断,以减少程序运行的错误。

条件测试常用语法

table th:first-of-type {
width: 250px;
}

条件测试语法 说明
语法1:test <测试表达式> 这是利用test命令进行条件测试表达式的方法。test 命令和"<测试表达式>"之间至少有一个空格
语法2:[ <测试表达式> ] 这是通过 [] 进行条件测试表达式的方法。和 test 命令用法相同,推荐此方法。[]的边界和内容至少有一个空格
语法3:[[ <测试表达式> ] ] 这是通过 [[ ]] 进行条件测试表达式的方法。[[]]的边界和内容至少有一个空格
语法4: ((<测试表达式> )) 这是通过 (()) 进行条件测试表达式的方法,一般用于 if 语句里。(())前端不需要空格
  • 语法 1 中的 test 命令和语法 2 中的 [] 是等价的。语法 3 中的 [[]] 双中括号为扩展的 test 命令。
  • 语法 4 中的 (()) 常用于计算。
  • 在双中括号 [[]] 中可以使用通配符等进行模式匹配,这是其区别于其他几种语法格式的地方。
  • &&||>< 等操作符可以应用于双中括号 {[[]]}中,但不能应用于单中括号 [] 中,在 [] 中一般用 -a-o-gt(用于整数)、-lt(用于整数)代替上述操作符。
  • 对于整数的关系运算,也可以是使用 shell 的算术符 (())

条件测试命令实践

test 条件测试的简单语法及示例:

test条件测试的语法格式:test 条件表达式
例1:测试文件file是否存在:
test -f file && echo true || echo false # 测试file文件是否存在,,如果存在则输出true,否则输出false
test -f file && echo 1 # 若表达式成功,则输出1
test -f file || echo 0 # 若表达式失败,则输出0
例2:测试字符串的长度是否为0:
[root@www ~]# test -z "Miya" && echo true || echo false # 如果测试字符串的长度为0,则表达式成立,因为测试的字符串为Miya,不为0,则表达式的结果为false。
[root@www ~]# test -z "Miya" && echo 1 || echo 0
false

[ ]中括号条件测试语法及示例

语法格式:[ 条件测试表达式 ]   # 中括号两端要有空格
例1:测试file文件是否存在:
[ -f file ] && echo 1 || echo 2 # 测试文件file是否存在,存在返回1,不存在返回0。

[[ ]]双中括号条件测试语法及示例

语法格式:[[ 条件测试表达式 ]]  # 双中括号里的两端也要有空格
[[ -f file ]] && echo 1 || echo 0 # 测试文件file是否存在,如存在则返回1,不存在返回0。

【说明】在[[ ]] 中,可以使用通配符等进行模式匹配,并且 &&||>< 等操作符可以应用在 [[ ]] 中,但不能应用于 [ ] 中,在 [ ] 中一般使用 -a-o-gt(用于整数)、-lt(用于整数)等操作符代替上文提到的用于 [[ ]] 中的符号。虽然 [[]] 的应用场景不多,但在 [[]] 通配符匹配的场景下,其他的测试表达式无法替代,如果需要通配符匹配或正则匹配就用[[]]。

文件测试表达式

常用文件测试操作符 说明
-d 文件,directory 文件存在且为目录为真,即测试表达试成立
-f 文件,file 文件存在且为普通文件则为真
-e 文件,exist 文件存在则为真,-f,-e不辨别是目录还是文件
-r 文件,read 文件存在且可读则为真
-s文件,size 文件存在且文件大小不为0为真
-w文件,write 文件存在且可写则为真
-x文件 ,executable 文件存在且可执行则为真
-L 文件,link 文件存在且为链接文件则为真
f1 -nt f2,nt为newer than 文件1比文件2新则为真
f1 -ot f2,ot为older than 文件1比文件2旧则为真

文件测试表达式实践

测试文件类型

[ -f file ] && echo 1 || echo 0 # 文件为普通文件且存在则输出 1

判断文件是否存在

[root@mico ~]# [ -f /etc/hosts ]
[root@mico ~]# echo $?
0
[root@mico ~]# [ -f /etc/hosts1 ]
[root@mico ~]# echo $?
1
判断文件是否存在,返回方式
[root@mico ~]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在"
文件存在
[root@mico ~]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在"
文件不存在

判断目录是否存在

[root@mico ~]# [ -d /tmp ] && echo "目录存在" || echo "目录不存在"
目录存在
[root@mico ~]# [ -d /tmp1 ] && echo "目录存在" || echo "目录不存在"
目录不存在

使用变量的方法进行判断

dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目录不存在"

【说明】

  • 测试文件的读、写、可执行等属性,不光是根据文件属性 rwx 的标识来判断,还要看当前执行测试的用户是否真的可以按照对应的权限操作该文件。
  • [ ] 中括号测试变量时,如果被测试的对象是变量,则需要加双引号。

特殊条件测试表达式案例

以下写法适用于所有的条件测试表达式,是工作中比较常用的替代if语句的方法。

例1:当条件1成立时,同时执行命令1、命令2、命令3:



上面的判断,相当于下面的 if 语句的效果:

字符串测试操作符

整数二元比较操作符

【说明】

  • “=”和“!=”也可以在[ ]中作比较使用,但在[ ] 中使用包含“>”和“<”的符号时,需要转义,有时不转义,虽然语法不会报错,但是结果可能不对。
  • 也可以在[[]]中使用包含“-gt”和“lt”的符号,但是不建议这样使用。
  • 比较符号两端也要有空格。

逻辑操作符

【说明】

  • “-a”和“-o”逻辑操作符需要用于[]中。
  • “&&”和“||”逻辑操作符号可用于[[]]和(())中,也可以在外部连接多个[]。
  • 注意,在[]和[[]]的两端,必须要有空格,但是对于(())不需要。

总结

测试表达式 test、[]、[[]]、(()) 的区别总结:

Shell编程学习(六)的更多相关文章

  1. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  2. shell编程学习之使用jq对json数据进行提取

    shell编程学习之使用jq对json提取 jq命令允许直接在命令行下对JSON进行操作,包括分片.过滤.转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上.预编译的二进制文件可以 ...

  3. shell编程学习笔记(六):cat命令的使用

    这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...

  4. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  5. shell编程学习笔记【原创】

    本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...

  6. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

  7. shell编程学习笔记之sed编辑器

    在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...

  8. Shell编程学习总结

    Shell编程总结 一.Hello World 新建文件test.sh 然后编辑代码: #!bin/bash/ echo “hello world !” cd 到目标目录下: chmod +x ./t ...

  9. shell编程学习1

    1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.    (2)我们可以使用shell和操作系统.uboot等软件系统进 ...

  10. (七)shell编程学习

    1.shell程序练习:创建一个dir文件夹,在dir文件夹里再创建一个cd.c文件 首先vim hello.sh 2.shell中的变量定义和引用 (1)变量定义和初始化.shell是弱类型语言(语 ...

随机推荐

  1. javaScript之DOM,BOM

    javaScript之BOM / DOM: BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM ...

  2. 【POJ1426】Find The Multiple

    本题传送门 本题知识点:深度优先搜索 | 宽度优先搜索 题意很简单,让我们找一个只有1和0组成的十位数是n的倍数的数. 这题一开始吓到我了--因为Output里说输出的长度最长不超过100位???那是 ...

  3. 【POJ3278】Catch That Cow

    本题传送门 本题知识点:宽度优先搜索 题意很简单,我们把FJ与奶牛看作是在一条数轴上的点,奶牛固定在K点,FJ的移动有三种,分别是向前一格,向后一格以及跳到当前格的两倍去.问FJ花费最少的时间到达奶牛 ...

  4. cesium地下模式(地表透明)2

    接上一篇博客,这篇直接分析火星的源码,看它到底改了些什么. 注意:在cesium1.63.1版本改变了模块化方式,由AMD改为ES6模块化.注意引入文件加载模块时做出对应修改. 1.火星代码里修改了4 ...

  5. Mean Average Precision(mAP),Precision,Recall,Accuracy,F1_score,PR曲线、ROC曲线,AUC值,决定系数R^2 的含义与计算

    背景   之前在研究Object Detection的时候,只是知道Precision这个指标,但是mAP(mean Average Precision)具体是如何计算的,暂时还不知道.最近做OD的任 ...

  6. 本地局域网yum源搭建-centos/redhat

    环境-centos6.7  [本机yum搭建提前备好,不做介绍] [root@nagios ~]# cat /etc/redhat-release CentOS release 6.7 (Final) ...

  7. jmeter(五十一)_性能测试中的服务器资源监控与分析

    概述 性能测试过程中,对服务器资源的监控是必不可少的.这里的资源又分了两块,windows和linux   linux下监控资源 访问网址http://jmeter-plugins.org/downl ...

  8. unicode欺骗—— hctf - admin

    查看源代码,发现<!-- you are not admin --> 提示要以管理员身份登陆 尝试注册管理员账号,提示The username has been registered 于是 ...

  9. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  10. JPA连接PG数据库时间类型查询报错的修改

    PG数据库中的时间格式规范: https://blog.csdn.net/sky_limitless/article/details/79527665 to_data 转换为 普通的时间格式 to_t ...