完全总结bash中的条件判断test [ [[ 使用
在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 ...
随机推荐
- CodeForces 543D:Road Improvement
题目:http://codeforces.com/problemset/problem/543/D 题意:给你一棵树,一开始边都是0,可以使任意的边变成1,对于每一个根节点求使得它到其他任一点的路径上 ...
- MVC 统一异常处理
在出现异常时,我们不希望将错语的原因让客户看见,常常会做一个404错误页面,将所有发生的异常都跳至该页面,并把异常信息写在日志中.步骤如下: 1.让我们看看Global.asax页面Applicati ...
- cdn和反向代理
都是用来加速网站访问速度 cdn和反向代理的基本原理都是使用缓存,区别在于cdn部署在网络提供商的机房,使用户在请求网络服务时,可以从距离自己最近的网络提供商机房获取数据:而反向代理则部署在网站的中心 ...
- python列表二
比如说要交换两个的顺序,用中间变量temp即可,和java的方法一样 >>> mix[1, '小尹', 5, '小虎', 3.5, [1, 2, 2], '葫芦娃', 0, '1', ...
- JAVA经典算法面试40题及答案
现在是3月份,也是每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作.现在的招聘他们有时会给你出一套面试题或者智力测试题,也有的直接让你上机操作,写一段程序.算法的计算不乏出现,基于这个原因我 ...
- UEP-树和表
Model Select:表格要展示的数据Tree DataSource:树的数据源数据源是自定义java类实现接口:ITreeRetriever创建根节点.判断子节点.创建子节点 --数据源 pac ...
- [国嵌笔记][033-034][设置svc模式]
[设置svc模式] 设置CPU为SVC模式 1.因为初始化系统需要有很高的权限,SVC模式具有该权限,所以首先要使系统工作在SVC(0b10011)模式 2.设置cprs为0xd3(0b1101001 ...
- 一个域名最多能对应几个IP地址?,一个IP地址可以绑定几个域名?
一个域名最多能对应几个IP地址?,一个IP地址可以绑定几个域名?谢谢 xikeboy | 浏览 31055 次 推荐于2016-04-24 14:21:14 最佳答案 1.也就是说通常情况下一个域名同 ...
- Binlog的三个业务应用场景
1.什么是binlog binlog是mysql的一种二进制日志文件,用来记录数据的变化.mysql使用binlog进行主从复制,如图: 客户端向master的mysql sever写入数据 当数据发 ...
- Java进阶篇(三)——Java集合类
集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放.Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对 ...