在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. Vijos P1784 数字统计【模拟】

    数字统计 背景 来自 NOIP2010 普及组 第一题 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如在给定范围[2, 22],数字2在数2中出现了1次,在数12中出现了1 ...

  2. [bzoj1914] [Usaco2010 OPen]Triangle Counting 数三角形

    跑去看了黄学长的题解.. 第一次听说级角排序= =因为一直见计算几何就跑= = 级角排序就是按 原点和点连起来的边 与x轴正半轴构成的角的角度 排序...排序完效果就是逆时针旋转地枚举每个点. 要求的 ...

  3. c语言中的堆、栈和内存映射

    Code Area(代码区):程序代码指令.常量字符串,只可读. Static Area(静态区):存放全局变量/常量.静态变量/常量. 该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值 ...

  4. c语言变量类型联想

    int float char *(指针) 已经定义:单个变量 单个相同类型在内存中顺序存放:数组 不同单个类型在内存中顺序存放:结构体 不同类型在内存中自由存放:链表 其中结构体与链表类型需运用时提前 ...

  5. js BOM DOM

    BOM对象 BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相关的动作. 简而言之就是使 JavaScript ...

  6. nth-child()选择器小结

    之前也用到过nth-child,只是当时理解的不够透彻.今天回过头去看这个知识点时,发现了一个易错点. 浏览器支持情况: 所有主流浏览器都支持nth-child()选择器,除了IE8及更早的版本. 下 ...

  7. phpstorm ctrl+shift+F键不管用,不弹出搜索弹框

    般热键冲突搜狗默认简繁切换组合键位ctrl+shift+F故outlook2011按三建且失效应该能看搜狗输入状态简繁变搜狗设置按键-取消选简繁切换热键即在任务栏的语言地方点击一下再点击语言首选项.进 ...

  8. 解Linux SSH命令大全,新手必看SSH命令

    下面介绍一些基本的常用的Linux SSH命令,都是一些很简单的Linux SSH命令,新手掌握了这几个,一般管理一般的vps或者linux主机就可以了!     我们的教程介绍了putty的使用方法 ...

  9. 织梦首页、列表页调用文章body内容的两种方法

    http://blog.csdn.net/langyu1021/article/details/52261411 关于首页.列表页调用文章body内容的两种方法,具体方法如下: 第一种方法: {ded ...

  10. python 序列

    序列 序列是python中的一种数据结构,这种数据结构根据索引来获取序列中的对象 有6种内建序列类:list,tuple,string,unicode,buffer,xrange. 其中xrange比 ...