【重点】Shell入门教程:流程控制(2)条件判断的写法
第三节:条件判断的写法
if条件判断中,if的语法结构中的“条件判断”可以有多种形式。测试结果是真是假,就看其传回的值是否为0。
条件测试的写法,有以下10种:
1.执行某个命令的结果
这里的命令,可包括管道命令,例如:命令1 | 命令2 | 命令3,称为 pipeline,其结束状态为最后一个命令执行的结果。
举例:
#!/bin/bash if grep -q "rm" fn.sh; then
echo "find in command."
else
echo "not find."
fi
行3,在条件测试中,执行命令时:grep -q "rm" fn.sh,它是寻找fn.sh文件里是否有关键词rm。选项-q表示不显示,仅借助$?来传回执行结果。
2.传回某个命令执行结果的相反值
其形式为: ! 命令
注意,! 和 命令之间要有“空格符”隔开。
如果命令传回值为0,则加上 ! 之后传回值为1;反之,如果命令传回值为非0,则加上 ! 后,传回值为0。
举例:
#!/bin/bash if ! grep -q "rm" fn.sh; then
echo "not find."
else
echo "find rm command"
fi
3.使用复合命令:((算术))
如果算式的运算结果不为0,则传回真值(0),否则如果运算结果为0,则传回假值(1)。再举例如下:
| ((算式)) | 运算结果 | 判断真假值 |
|---|---|---|
| ((0)) | 0 | 假 |
| ((1)) | 1 | 真 |
| ((8)) | 8 | 真 |
| ((-1)) | -1 | 真 |
| ((2-2)) | 0 | 假 |
| ((5*6)) | 30 | 真 |
| ((20<30)) | 数字比较运算为真 | 真 |
| ((20&&30)) | 逻辑AND运算为真 | 真 |
| ((20&&0)) | 逻辑AND运算为假 | 假 |
| ((0&&1)) | 逻辑AND运算为假 | 假 |
| ((10||0)) | 逻辑OR运算为真 | 真 |
| ((0||1)) | 逻辑OR运算为真 | 真 |
| ((0||0)) | 逻辑OR运算为假 | 假 |
4.使用Bash关键字‘[[’、‘]]’组成的式子:[[ 判断式 ]]
判读式会传回真假值,传回0为真,非0为假。
注意:[[ 的后面、]] 的前面,至少要有一个(含)以上的“空格符”才行。
举例:
#!/bin/bash if [[ str > xyz ]]; then
echo "字符串str比较大"
else
echo "字符串str比较小"
fi
执行结果:显示“字符串str比较小”
5.使用内置命令:test 判断式
test是Bash的内置命令,可传回“判断式”的结果,真值传回0,假值传回1。
举例:
#!/bin/bash if test "str" \> "xyz"; then
echo "字符串str比较大"
else
echo "字符串str比较小"
fi
执行结果:显示“字符串str比较小”
要特别注意的是:大于符号 > 对Bash而言是特殊字符,要用 \ 予以转义,不然,无法得到正确的测试结果。
6.使用内置命令:[ ]
格式为:[ 判断式 ]
[] 和 test 的用法是相同的,两者可改写互换。
举例:
#!/bin/bash if [ "str" \> "xyz" ]; then
echo "字符串str比较大"
else
echo "字符串str比较小"
fi
执行结果:显示“字符串str比较小”
要特别注意的是:大于符号 > 对Bash而言是特殊字符,一样要用 \ 予以转义。
此例的第1行,可改写成test的用法
if test "str" \> "xyz"; then
7.使用 -a、-o 进行逻辑组合:
注意: -a、-o 是放在 [ ] 里面的!
举例:
[ -r filename1 -a -x filename1]
如果 filename1 可读且可执行,则为真。-o 即 “且”之意。
[ -r filename1 -o -x filename1]
如果filename1可读或可执行,则为真。-o即“或”之意。
8.命令1 && 命令2
&& 称为逻辑的AND,其运作方式是:如果“命令1”执行结果为真,才会执行“命令2”;如果两个皆为真,则传回真值0,否则传回假值1。
#!/bin/bash a=20
if grep -q "rm" fn.sh && [ $a -lt 100 ]; then
echo "ok"
else
echo "not ok"
fi
&& 的特性,经常拿来当做是一种隐形的if语法。例如:
[ -z "$PS1" ] && return
代码意思是:先判断 $PS 变量值是否为空,如果是,就执行return命令,由子Shell环境返回到父Shell,这等于是结束执行该Script。等同于以下if语句:
if [ -z "$PS1" ]; then
return;
fi
再来看一例:
[ -f /proc/net/if_inet6 ] && echo '这部主机支持IPv6'
往后,凡是“[ 判断式 ] && 指令”的形式,就视为一种隐形的 if-then 语法。
9.命令1 || 命令2
|| 称为逻辑的OR,其运作方式是:如果“命令1”执行结果为假,才会执行“命令2”;如果两个之中有一个为真,则传回真值0,否则传回假值1。
#!/bin/bash a=200
if grep -q "rm" fn.sh || [ $a -lt 100 ]; then
echo "ok"
else
echo "not ok"
fi
|| 的特性,也可当做是一种隐形的if语法。例如:
prefix="/home"
defpath="/usr/local/bin"
[ -z ${prefix:-} ] || prefix=${defpath%/*}
行3,因 $prefix非空,所以,${prefix:-} 变量扩展的传回值为prefix的变量值(非空),[ -z ${prefix:-} ] 对空值的条件测试失败,其结果为假,根据 || 的特性,会接着执行 prefix=${defpath%/*},它会由 $defpath 后方删去样式 /* 的最短字符串,即删去 /bin,因此,$prefix的值为 /usr/local。
本例可改写成if语法如下:
prefix="home"
defpath="/usr/local/bin"
if [ ! -z ${prefix:-} ]; then
prefix=${defpath%/*}
fi
10.&& 和 || 合用
&& 和 || 合用,也可以有 if-then-else 的效果,例如:
[ -n ${DEBUG:-} ] && set -v || set +v
这行代码,使用 -n 测试变量DEBUG是否有设非空值,如果有,表示要进行排错,接着执行AND的下一个指令:set -v;如果无,则不进行排错,而执行逻辑OR的下一个指令:set -v,它会把显示程序的功能关闭。
本例可改写if语法如下:
if [ -n "$DEBUG" ]; then
set -v
else
set +v
fi
往后,凡是“[ 判断式 ] && 指令1 || 指令2”的形式,就视为一种隐形的 if-then-else 的语法。
最后总结:
在上述这些条件测试的方法中,[[]] 和 test、[] 的意思和用法是相近的,但 [[]] 比 test 和 [] 更自由一点,因为 [[]] 不必担心某些Bash特殊字符对运算符的影响,不必写一堆转义字符的怪字符,如 [[ str < xyz ]] 是正确的语法,但在 [] 中却要写成 [ str \< xyz ],这种陷阱很容易忘记,一旦忘了写转义字符,要发现错误所在,就不容易了。在 [[]] 中,<、>、&&、、|| 等都可以自由地使用,不必使用转义字符。
除了[[]]之外,在Bash中,(())也不必理会上述提到的特殊字符的影响。
下面,还有一点要特别注意的:
在 [[ 判断式 ]] 中,如果使用 == 或 != ,且在这两个运算符右方的字符串没有加上单引号或双引号,则 == 和 != 会视为想要对比该字符串所形成的“样式”,如果相等,传回0,如果不符,传回1。
举例:
#!/bin/bash a="str"
if [[ $a == ??? ]]; then
echo "Match"
fi
行4,[[ $a == ??? ]] 的意思是说,用 $a 的值,对比样式 ??? (3个字符的字符串)。
但如果把行4改成:
if [[ $a == "???" ]]; then
那意思就不同了,此时 == 变成了是判断 $a 和 字符串 ??? 是否相等。
【重点】Shell入门教程:流程控制(2)条件判断的写法的更多相关文章
- 廖雪峰Java1-3流程控制-3条件判断
1.if条件判断的格式 if (条件) { 代码块 } if (条件) { 代码块1 } else { 代码块2 } if (条件1) { 代码块1 } else if { 代码块2 } else { ...
- Python流程控制-2 条件判断
条件判断 条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块. 在Python语法中,使用if.elif和else三个关键字来进行条件判断. if语句的一般形式如下 ...
- shell编程 之 流程控制(条件语句和循环语句)
1 if ...else... 基本格式: if condition then commend else commend fi 当然也可以写到一行,用[ ]表明边界,用:表示分行.比如: if [ $ ...
- ansible-playbook流程控制-when条件判断
1. ansible-playbook添加判断 when相当于shell脚本里的if 判断,when语句就是用来实现这个功能的,它是一个jinja2的语法,但是不需要双大括号,用法很简单 1 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Shell入门教程:流程控制(1)命令的结束状态
在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...
- Shell命令和流程控制
Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...
- shell脚本之流程控制
shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语 ...
- Python3.7.4入门-2流程控制工具
2 流程控制工具 记得在语句后加冒号 2.1 while # Fibonacci series: # the sum of two elements defines the next a, b = 0 ...
随机推荐
- HTML 学习笔记 JavaScript (prototype)
原博地址:http://www.cnblogs.com/dolphinX/p/3286177.html 原博客的作者是一个非常牛逼的前端大神,我作为一个初学者,在此借助大神的博客进行自己的学习.在这里 ...
- SQLMAP参数介绍
转自:http://zhan.renren.com/bugpower?gid=3602888498044629629&checked=true SQLMAP参数介绍 sqlmap的使用方式:p ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 访问频率限制功能实现、防止黑客扫描、防止恶意刷屏
很多软件组件,大家都能想到了,大家也能做出来,但是成熟稳定.可靠.易用.功能全面,可信任,可相信,可开源就不是很容易,需要树立良好的口碑才可以. 1:往往会有黑客,进行撞库挖掘漏洞,很多系统的账户有可 ...
- 记录android显示流程
mtk平台: displayclient->deque->数据放入显存->surfaceflinger->分发数据到surfacetexture(OnFrameAvailabl ...
- 利用缓存实现APP端与服务器接口交互的Session控制
与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...
- jquery更改输入框type为密码框password
很蛋疼的一个问题: <input type="text" id="e1" value="123" /> 用juqery将文本框变 ...
- FineUI官方论坛出现空白页的解决办法!
问题描述:访问FineUI官方论坛或者QQ互联登陆时,可能会出现空白页面! 解决办法:清空站点Cookie! 下面分别介绍Chrome.Firefox.IE下清空站点Cookie的方法: ...
- SQLite剖析之事务处理技术
前言 事务处理是DBMS中最关键的技术,对SQLite也一样,它涉及到并发控制,以及故障恢复等等.在数据库中使用事务可以保证数据的统一和完整性,同时也可以提高效率.假设需要在一张表内一次插入20个人的 ...
- Windows操作系统组策略应用全攻略
作者:佚名出处:IT专家网论坛2007-07-23 13:31 一.什么是组策略 (一)组策略有什么用? 说到组策略,就不得不提注册表.注册表是Windows系统中保存系统.应用软件配置的数据库,随着 ...
- 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...