Shell中[和[[的异同
1. 概念上来说
"[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(据说从2.02起引入对[[的支持)等支持。
"["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调
2. 相同:二者都支持算术比较和字符串比较表达式(具体使用可能有点不同)
(1)"-gt", "-lt"是算术比较操作符,用于比较整数的大小。
(2)">", "<"是字符串比较操作符,用于比较字符串的大小,使用字典顺序,与当前的locale有关。
(3).关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A<B,A<a, 1<2。再强调一次,这里只要用了"<"、">",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。只要搞清楚了何时是算术比较,何时是串比较,一般就不会出错了。
(4)建议在使用数值比较的时候,使用let,(())命令,否则容易出错;
2.1 “[“用法
$ [ 2 -lt 10 ]&&echo true&&echo false
true
$ [ 2 -gt 10 ]&&echo true||echo false
false
$ [ 2 \< 10 ]&&echo true||echo false #you should use "\<"
false
$ [ 2 \> 10 ]&&echo true||echo false #you should use "\>"
true
2.2 “[[“用法
$ [[ 2 -gt 10 ]]&&echo true||echo false
false
$ [[ 2 -lt 10 ]]&&echo true||echo false
true
$ [[ 2 < 10 ]]&&echo true||echo false
false
$ [[ 2 > 10 ]]&&echo true||echo false
true
3. 相同:都支持简单的模式匹配
这里的模式匹配要简单得多,类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起,使用引用关闭了某些元字符的特殊功能
3.1 “[“用法
$ [ test = test ]&&echo true||echo false #normal compare
true
$ [ test = t*t ]&&echo true||echo false #pattern match.
true
$ [ test = t..t ]&&echo true||echo false #not match.
false
$ [ test = t??t ]&&echo true||echo false #note that "?", not "." stands for one single character here
true
$ [ test = "t??t" ]&&echo true||echo false #alert: don't quote the pattern,使用引用关闭了?的特殊功能
false
3.2 “[[“用法
$ [[ test = test ]]&&echo true||echo false #normal compare
true
$ [[ test = t*t ]]&&echo true||echo false #pattern match.
true
$ [[ test = t..t ]]&&echo true||echo false #not match.
false
$ [[ test = t??t ]]&&echo true||echo false #note that "?", not "." stands for one single character here
true
$ [[ test = "t??t" ]]&&echo true||echo false # alert: don't quote the pattern,使用引用关闭了?的特殊功能
false
4. 不同点
4.1 逻辑与和逻辑或
(1)"[":逻辑与:"-a";逻辑或:"-o";
(2)"[[":逻辑与:"&&";逻辑或:"||"
$ [[ 1 < 2 && b > a ]]&&echo true||echo false
true
$ [[ 1 < 2 -a b > a ]]&&echo true||echo false
bash: syntax error in conditional expression
bash: syntax error near `-a'
$ [ 1 < 2 -a b > a ]&&echo true||echo false
true
$ [ 1 < 2 && b > a ]&&echo true||echo false #wrong syntax
bash: [: missing `]'
false
$ [ 1 < 2 \&\& b > a ]&&echo true||echo false #aslo wrong
bash: [: &&: binary operator expected
false
4.2 命令行参数
(1)[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符">" 与"<"必须转义,否则就变成IO重定向了;
(2)由于"[["是关键字,不会做命令行扩展,所以在[[中"<"与">"不需转义,但是相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做;
$ [ "-z" "" ]&&echo true||echo false
true
$ [ -z "" ]&&echo true||echo false
true
$ [[ "-z" "" ]]&&echo true||echo false
bash: conditional binary operator expected
bash: syntax error near `""'
$ [[ -z "" ]]&&echo true||echo false
true
4.3 [[ ... ]]进行算术扩展,而[ ... ]不做
$ [[ 99+1 -eq 100 ]]&&echo true||echo false
true
$ [ 99+1 -eq 100 ]&&echo true||echo false
bash: [: 99+1: integer expression expected
false
$ [ $((99+1)) -eq 100 ]&&echo true||echo false
true
4.4 正则表达式匹配"=~"
regular expression match. This operator was introduced with version 3 of Bash.
The =~ Regular Expression matching operator within a double brackets test expression.
转自:https://blog.csdn.net/ysdaniel/article/details/7905818
Shell中[和[[的异同的更多相关文章
- Linux Shell 中 > 和 >> 的异同点和应用场景
Linux Shell 中 > 和 >> 的异同点和应用场景 > 和 >> 的异同点 举例说明(start.sh 为某个服务的启动脚本,start.log 为某服务 ...
- linux shell 中的sleep命令
开始还以为是这样的语法: sleep(1), 后面发现是: linux shell 中的sleep命令 分类: LINUX 在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小 ...
- shell 中的与、或表达式
今天总结一下linux shell中逻辑关机表达方式.逻辑与的表达: 1).if [ $xxx=a -a $xx=b ] 注:-a表示and的意思 2).if [ $xxx=a ] && ...
- shell简单用法笔记(shell中数值运算)二
shell中变量值,如果不手动指定类型,默认都是字符串类型: 例如: a= b= c=$a+#b echo $c 结果会输出:123+456 shell中,如果要进行数值运算,可以通过一下方法: 方法 ...
- shell中{}的妙用
shell中${}的妙用 1. 截断功能 ${file#*/}: 拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}: 拿 ...
- shell中命令之间数据的传递
1.管道 "|" ls | cat -n > out.txt 2. 子shell 2.1 子shell 说明 在shell脚本中可以用()操作符可以定义一个子shell #/ ...
- shell中&&和||的使用方法
测试题: [ -z "" ] && echo 0 || echo 1 的结果是多少 看看这两个 && || 的用户 http://blog.csd ...
- 任督二脉之Shell中的正则表达式
VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...
- shell中条件判断if中的-z到-d的意思
shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 ...
随机推荐
- python基础之列表、元组
一.列表 列表(list)是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[ ]内可以有多个任意类型的值,逗号 ...
- STM32的VDD与VDDA
http://bbs.21ic.com/icview-1651072-1-1.html VDD VSS 就是平常的电源与地.后面带A的都是模拟量的电源.
- 第13讲 | 套接字Socket:Talk is cheap, show me the code
第13讲 | 套接字Socket:Talk is cheap, show me the code 基于 TCP 和 UDP 协议的 Socket 编程.在讲 TCP 和 UDP 协议的时候,我们分客户 ...
- 如何在 Docker 环境下自动给 .NET 程序生成 Dump
前言 之前"一线码农"大佬有写文章介绍了如何在 windows 下自动 dump,正好手里有个在 docker 环境下 dump 的需求,所以在参考大佬文章的基础上,有了本篇. ...
- js动态加载HTML元素时出现的无效的点击事件
项目中列表数据中隐藏着详情数据, 图一: 详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面 图二: js文件中的这些js的点击事件无效: j ...
- 如何为应用选择最佳的FPGA(上)
如何为应用选择最佳的FPGA(上) How To Select The Best FPGA For Your Application 在项目规划阶段,为任何一个项目选择一个FPGA部件是最关键的决策之 ...
- 英特尔内存革新助平安云 Redis 云服务降本增效
英特尔内存革新助平安云 Redis 云服务降本增效 英特尔 傲腾 数据中心级持久内存的引入,为平安云的降本增效开启了一条新的道路.通过对平安云 Redis 数据库产品的支持,用户能享受到性能优异且价格 ...
- BeetleX之Vue ElementUI生成工具
BeetleX.WebFamily在新版本的功能中引入了一个全新的功能,通过这一功能可以大大节省UI的开发工作量.组件集成了一个图形化的UI编辑器,可以连接数据库对数据表或查询快速度生成编辑和数据查询 ...
- MySQL必知必会复习笔记(1)
MySQL必知必会笔记(一) MySQL必知必会是一本很优秀的MySQL教程书,并且相当精简,在日常中甚至能当成一本工作手册来查看.本系列笔记记录的是:1.自己记得不够牢的代码:2.自己觉得很重要的代 ...
- Qt自定义信号槽的使用浅析+实例
1. Qt中自定义信号槽的使用 Qt框架提供的信号槽在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号和槽,使用connect()对自定义的信号槽进行连接. 如果想要使用自定义 ...