Shell编程学习(六)
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编程学习(六)的更多相关文章
- Linux 下shell 编程学习脚手架
linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...
- shell编程学习之使用jq对json数据进行提取
shell编程学习之使用jq对json提取 jq命令允许直接在命令行下对JSON进行操作,包括分片.过滤.转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上.预编译的二进制文件可以 ...
- shell编程学习笔记(六):cat命令的使用
这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- shell编程学习笔记【原创】
本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...
- shell编程学习笔记(一):编写我的第一段代码
目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...
- shell编程学习笔记之sed编辑器
在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...
- Shell编程学习总结
Shell编程总结 一.Hello World 新建文件test.sh 然后编辑代码: #!bin/bash/ echo “hello world !” cd 到目标目录下: chmod +x ./t ...
- shell编程学习1
1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式. (2)我们可以使用shell和操作系统.uboot等软件系统进 ...
- (七)shell编程学习
1.shell程序练习:创建一个dir文件夹,在dir文件夹里再创建一个cd.c文件 首先vim hello.sh 2.shell中的变量定义和引用 (1)变量定义和初始化.shell是弱类型语言(语 ...
随机推荐
- mysql课外积累
where 与 on 的区别 : ON:针对关联表进行条件筛选,不会影响结果集的数量和主表数据. WHERE:针对结果集进行条件筛选,会影响结果集的数量. LIKE声明中的%和_是什么意思? --%对 ...
- WeUI框架
WeUI框架 WeUI是一套小程序的UI框架,所谓UI框架就是一套界面设计方案,有了组件,我们可以用它来拼接出一个内容丰富的小程序,而有了UI框架,我们就可以让我们的小程序变得更加美观. 体验WeUi ...
- GIT-本地仓库
用户配置 git config --global user.name "name" git config --global user.email "123@qq.com& ...
- Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...
- Octopus501工作站 安装记录
cmake libreadline-dev 没有运行程序,nvidia-smi查看GPU-Util 达到100% 解决方案:需要把驱动模式设置为常驻内存才可以,设置命令:nvidia-smi -pm ...
- SQL,NoSQL和NewSQL的区别
SQL(Structured Query Language):数据库,指关系型数据库.主要代表:SQL Server.Oracle.MySQL.PostgreSQL. NoSQL(Not Only S ...
- php 加载 zip 文件
header('Content-type: application/zip');header('Content-Disposition: attachment; filename="Quer ...
- response.redirect 正在中止线程
问题描述:正在中止线程问题原因:Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件.不执行 Response.End ...
- Java学习-055-Jsoup爬虫通过设置获取响应数据大小的最大值,解决因默认获取 1MB 响应数据导致的无法获取全部的响应数据内容问题
在日常工作中,通常会遇到获取各种网络数据使用的情况,Java中可使用Jsoup(Python中可使用 BeatifulSoup)进行数据的获取及处理. 今天有朋友问,在使用 Jsoup 进行请求数据时 ...
- hive的分桶原理
套话之分桶的定义: 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储.对于 hive 中每一个表.分区都可以进一步进行分桶. 列的哈希值除以桶的个数来决定每条数据划分在哪个桶中.(网上其它定 ...