在bash脚本编程中,我们经常做一些条件判断, 我们主要用到了三种,test,单中括号,双中括号
经常有看到不同的写法,如:
[ $? –eq ] [[ $myvar == “mysql” ]] test -eq
并且还有看到一些并且和或的写法,如-a,-o,&&,||。
那这些都是怎么结合,有那么多的比较符号,我怎么记住,有什么注意事项。
1.test命令
test是bash的一个内建命令,用来测试后面给的条件是否为真,如
[root@localhost ~]# test -ne [root@localhost ~]# echo $? [root@localhost ~]# test "hello" == "Hello" [root@localhost ~]# echo $?
经常有可能我们有很多判断需求,如判断是否是一个文件,字符串是否为空,数值A是否大于B等,有时会记不住,怎么办呢,方法是man test,可以看到它列出了所有的判断符号和说明:
2.单个中括号[ ]判断
事实上事实上[ 这个是个内建命令,可以执行which [查看
[root@localhost test]# which [
/usr/bin/[
即然是命令,那么命令与后面的参数就得用空格隔开,这也就是为什么在使用[时后面需要有一个空格的原因。所以[1=2]这样的写法将会报错。
单中括号与test命令是等价的。
3.双个中括号[[ ]]判断
双括号是不是也是个命令呢,我们也用which看下:
[root@localhost ~]# which [[
/usr/bin/which: no [[ in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
我们再用type命令看下
[root@localhost ~]# type [[
[[ is a shell keyword
可以看到双中括号是shell中的关键字,在这我们也用type看看test与单中括号:
[root@localhost ~]# type test [ test is a shell builtin [ is a shell builtin
两个中括号也是用来做判断的,与单个中括号相比,从某方面来讲它更安全一些,如:
[root@localhost ~]# unset myvar
[root@localhost ~]# if [ $myvar -eq 0 ];then echo 1;fi
-bash: [: -eq: unary operator expected
[root@localhost ~]# if [[ $myvar -eq 0 ]];then echo 1;fi
1
[[使用==或!=时支持字符串的模式匹配,比如[[ hello == hell? ]],结果为真。
使用=~操作符时支持正则表达式匹配,如(注意右边的匹配串不要加引号):
[root@localhost ~]# [[ “234” =~ [1-9]{3} ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ "234" =~ "[1-9]{3}" ]]
[root@localhost ~]# echo $?
1
4.如何结合-o -a && || :
因为-a与-o是test与单中括号命令的参数,而&&与||是shell中的关键字,所以-a与-o只能在test与单中括号使用,不能在双中括号使用,而&&和||可以在任何情况使用,如
[root@localhost ~]# test -eq -a -eq [root@localhost ~]# echo $? [root@localhost ~]# [ -eq ] || [ -eq ] [root@localhost ~]# echo $?
注意双号号下这两种写法都可以:
[root@localhost ~]# [[ 1 -eq 1 ]] && [[ 2 -eq 3 ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ 1 -eq 1 || 2 -eq 3 ]]
[root@localhost ~]# echo $?
0
另外,在一些需要使用()分组的情况下,因为test与[是命令,它不解析小括号分组,所以不能在这两个命令中使用小括号来分组
[root@localhost ~]# test ( 1 -eq 2 -o 3 -eq 3 )
-bash: syntax error near unexpected token `1'
5.实践中使用建议:
A.尽量使用双中括号来进行判断
B.在test及单中括号使用中,如果有变量,尽量用双引号括起来
C.与或尽量使用&&与||,而不要使用-a -o
完全总结bash中的条件判断test [ [[ 使用的更多相关文章
-
Shell编程中的条件判断(条件测试)
Shell中的条件判断(测试)类型: 1) 整数测试 2) 字符测试 3) 文件测试 条件测试的表达式: (注: expression 与 [] 之间空格不能省略) [ expressi ...
-
Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
-
sql 语句中使用条件判断case then else end
sql 语句中使用条件判断case then else end范例: SELECT les.[nLessonNo] FROM BS_Lesson AS les WHERE les.[sClassCod ...
-
shell中的条件判断以及与python中的对比
shell中比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格. if ....; then ...
-
Linux Shell角本中的条件判断
1.条件判断: if 使用: if condition; then commands; fi if else 使用: if condition; then commands; else if cond ...
-
shell中的条件判断if和测试
(一)条件判断 if 中-z 到 -d 的意思 [ -a file ] 若file存在,则为真. [ -b file ] 若file存在且是一个块特殊文件,则为真. [ -c file ] 若file ...
-
在Less中使用条件判断
好几个月都没写点什么东西了,被外派到Gov开发项目,老旧的系统让开发痛苦不堪,接口文档甚至是2011年的,感觉这几个月的时间都被浪费在做兼容处理上了,并且没学到什么东西,心里挺不是滋味.回到公司后才知 ...
-
rf中的条件判断与循环
条件判断 run keyword if condition name *args ... ELSE IF conditon name *args ...ELSE name *args conditio ...
-
Python中的条件判断、循环以及循环的终止
条件判断 条件语句是用来判断给定条件是否满足,并根据判断所得结果从而决定所要执行的操作,通常的逻辑思路如下图: 单次判断 形式 if <判断条件>: <执行> else: &l ...
随机推荐
-
ADFS3.0与SharePoint2013安装配置(原创)
现在越来越多的企业使用ADFS作为单点登录,我希望今天的内容能帮助大家了解如何配置ADFS和SharePoint 2013.安装配置SharePoint2013这块就不做具体描述了,今天主要讲一下怎么 ...
-
Go+sublime text3的环境搭建
1.安装Go语言. .msi下载地址:http://download.csdn.net/detail/u014075041/9555543 根据提示安装成功! 在命令行中执行 go env 有提示 ...
-
IOS单例
单例就是只有一个实例. 两种常见的创建方法: 1. : static A *a = nil; + (A *)shareInstance { if (!a) a = [[self alloc] init ...
-
JS面向对象概述
这部分内容还是比较难理解的,像借用构造函数这种方法,实际工作中还是很常见的,不过对于后面的寄生理解还有点困难,只能慢慢学习了. 思维导图
-
Hadoop SecondaryNameNode备份及恢复
1.同步各个服务器时间 yum install ntp ntpdate ntp.fudan.edu.cn hdfs-site.xml配置 如果没有配置这一项,hadoop默认是0.0.0.0:5009 ...
-
从bug中学习怎么写代码
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:从bug中学习怎么写代码.
-
Eloquent ORM 之关联查询
小伙伴们好,本文是在我的前一篇随笔的基础上完成的,还没有浏览的同学,请移尊驾哦 Eloquent ORM学习笔记. 前一篇文章用到了leftJoin方法,其实Eloquent对于模块之间的关联查询有自 ...
-
EL显示List里嵌套map(Spring MVC3)返回的model
<c:forEach items="${requestScope.courseList}" var="cMap" varStatus="stat ...
-
深入分析redis cluster 集群
深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://rub ...
-
cas 4.1.4单点登录实战
使用工具 maven-3.3.9 cas-4.1.4 Tomcat-7.0.57-win-x64 cas-sample-Java-webapp 一.Hello cas 1.下载Tomcat,解压:修改 ...