在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 [ [[ 使用的更多相关文章

  1. Shell编程中的条件判断(条件测试)

    Shell中的条件判断(测试)类型: 1) 整数测试 2) 字符测试 3) 文件测试 条件测试的表达式:        (注: expression 与 [] 之间空格不能省略) [ expressi ...

  2. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  3. sql 语句中使用条件判断case then else end

    sql 语句中使用条件判断case then else end范例: SELECT les.[nLessonNo] FROM BS_Lesson AS les WHERE les.[sClassCod ...

  4. shell中的条件判断以及与python中的对比

    shell中比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格. if ....; then          ...

  5. Linux Shell角本中的条件判断

    1.条件判断: if 使用: if condition; then commands; fi if else 使用: if condition; then commands; else if cond ...

  6. shell中的条件判断if和测试

    (一)条件判断 if 中-z 到 -d 的意思 [ -a file ] 若file存在,则为真. [ -b file ] 若file存在且是一个块特殊文件,则为真. [ -c file ] 若file ...

  7. 在Less中使用条件判断

    好几个月都没写点什么东西了,被外派到Gov开发项目,老旧的系统让开发痛苦不堪,接口文档甚至是2011年的,感觉这几个月的时间都被浪费在做兼容处理上了,并且没学到什么东西,心里挺不是滋味.回到公司后才知 ...

  8. rf中的条件判断与循环

    条件判断 run keyword if condition name *args ... ELSE IF conditon name *args ...ELSE name *args conditio ...

  9. Python中的条件判断、循环以及循环的终止

    条件判断 条件语句是用来判断给定条件是否满足,并根据判断所得结果从而决定所要执行的操作,通常的逻辑思路如下图: 单次判断 形式 if <判断条件>: <执行> else: &l ...

随机推荐

  1. bzoj:3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛

    Description     约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡 ...

  2. [bzoj2333] [SCOI2011]棘手的操作 (可并堆)

    //以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个节点,标号从1 ...

  3. Gym101473A Gym101473E Gym101473F-前缀和

    代码: #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #i ...

  4. 关于python 2.7要求输出汉字问题

    对于python 2.7,使用print u'好好学习'会出现异常.可用以下作为汉字输出,获取数据(字符串)时,用unicode(str, "utf8")生成unicode对象 p ...

  5. TCP 和 UDP

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  6. 微信小程序初使心得【微信小程序快速入门】

    摘要: 2016年推出微信小程序,时至今日,历经几个版本的更新,已形成了相对实用和稳定的服务平台.本文简单的介绍了微信小程序的入门用法,今后会继续关注和实践. 2016年推出微信小程序,时至今日,历经 ...

  7. .27-浅析webpack源码之事件流make(2)

    上一节跑到了NormalModuleFactory模块,调用了原型方法create后,依次触发了before-rsolve.factory.resolver事件流,这节从resolver事件流开始讲. ...

  8. dede 你所上传的软件类型不在许可列表,请更改系统对扩展名限定的配置

    后台,系统,系统基本参数,附件设置格式

  9. Python3 引入模块的方法

    例子 import random 产生随机整数 import random secret = random.randint(0,10)

  10. 数据库复习总结(16)-case关键字(数据透视)

    case语法: 练习1:将性别的0.1显示为男.女 select * from StudentInfo --case:对结果集中的列进行判断 --例1:显示学生信息,性别以"男女" ...