双方括号[[]]的用法:

1、先举个例子说明:

假如你要再判断某个目录是否存在,又想当然写成:

$ [ -f exists.txt && -d exists_folder ]; echo $?
bash: [: missing `]'

结果提示漏了右括号,那是因为 && 被 bash 预先解析了,而不是当成 test 的参数传递。

  • && 表示如果左边的命令正常执行了,那么继续执行右边的命令,相当于没有 else 部分的 if 语句简化版。

  • 而 || 表示如果左边的命令不是正常执行了,那么继续执行右边的命令,相当于没有 then 部分的 if 语句(或者 if not)。

从效果看也可以分别当成逻辑与和逻辑或的。

所以上面那条命令以 [ -f exists.txt 明显是个不完整命令,漏了个 [

修正如下:

$ [ -f exists.txt ] && [ -d exists_folder ]; echo $?

换回一般写法也应该是:

$ test -f exists.txt && test -d exists_folder; echo $?

好的,到了这里开始引入正题:

2、上面我们用 [ -f exists.txt && -d exists_folder ] 来表示复合条件,结果发现这是一个坑,于是 bash 后来从 ksh 抄来一个特性来填这个坑。

把单括号换成双括号就 OK 了:

$ [[ -f exists.txt && -d exists_folder ]]; echo $?

震惊之情溢于言表,&& 不是隔开两个命令么,怎么用两个方括号又合法了?

前面说说单方括号是语法糖,因为只是 test 命令的另一种写法,bash 最后会调用程序 test,一般就是 /usr/bin/test。

双方括号是「关键词」,关键词就是 bash 自己内建的语法分析:

[root@noi ~]# type [[
[[ is a shell keyword

就因为这是关键词,所以被双方括号包围的代码都有另外一种意义,||< 这些符号的意义都被改变了,就和其它编程语言的用法一样了。

例如再比较大小时,对 > 不再需要转义了:

[root@noi ~]# [[  >  ]];echo $?

但依然是表示按字符串比较,不是按数字:

[root@noi ~]# [[  <  ]];echo $?

可以看作增强版的 test,因为逻辑与和逻辑或已经可以直接用 ||,所以 -o 就不能用了,其余的参数和 test 基本一样。

因为可以使用&&和||等逻辑运算符,比较数字以外的运算推荐使用双方括号[[]]。比如上文中的:

$ [[ -f exists.txt && -d exists_folder ]]; echo $?

这时,如果我就想比较数字,有两种方案:

第一种:使用-gt、-lt、-ge、-le等等符号:

[root@noi ~]# [[  -lt  ]];echo $?

第二种:使用双小括号:

#使用双小括号,字符之间不用空格隔开
[root@noi ~]# ((<));echo $?

3、[[]]还可以用 =~ 来检查是否匹配正则,简单的就不用劳烦 grep 了:

[root@noi ~]# [[ abc =~ a ]];echo $?

[root@noi ~]# [[ hello =~ hell? ]];echo $?

[root@noi ~]# [[ hello =~ hel00? ]];echo $?

本节结束,请看后续双小括号闪亮登场。

Bash中的括号(二)的更多相关文章

  1. Bash中的括号(一)

    初学Bash脚本编程,里面的各种括号,绝对是一个大坑,为了救人救己,以防再度入坑,特记录如下: 一.单小括号: 1.创建子Shell.单个小括号用来创建一个子shell,子shell允许你在不影响当前 ...

  2. Bash中的括号(三)

    1.两个小括号用来对整数进行算术运算和逻辑运算,比如. 例如给变量赋值: $ a=+; echo $a + $ (( b = + )); echo $b 1+1 只是一个字符串,而 b 就是一个算术表 ...

  3. bash 中 小括号的作用

    单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ...

  4. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  5. shell中各种括号的作用()、(())、[]、[[]]、{}

    一.小括号,圆括号() 1.单小括号 ()    ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...

  6. (转载)Bash 中的特殊字符大全

    转自:https://linux.cn/article-5657-1.html Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是she ...

  7. bash中(),{},(()),[],[[]]的区别

    前言:在bash中遇到各种括号,同时在进行字符数值比较判定时,总是不断出现问题,于是通过参考<advanced bash-scripting guide>,同时在centos 6.7版本上 ...

  8. shell 中各种括号的作用()、(())、[]、[[]]、{}

    一.小括号,圆括号 () 1.单小括号 () 命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

  9. Bash 中的特殊字符大全【转】

    Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...

随机推荐

  1. 看看如何解决“SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录”的问题

    今天安装Sql Server之后,出现SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录的问题是由于sql server只设置了Windows身份验证, ...

  2. [Android实例] 推荐给你们一个好用的ListView、RecyclerView适配器

    https://github.com/vihuela/RecyclerViewHelpper 如果用过RecyclerView的人都知道,高度不会包裹,然后写法好像也不是很简洁,甚至点击事件不好设 置 ...

  3. 基于Nginx的开墙方案

    Kubernetes集群内部通过服务名能进行相互调用,但如果Kubernetes中的pod需要调用外部服务,而且这些外部服务是属于不同的安全区域,就面临开墙的问题,因为Kubernetes Pod能够 ...

  4. 十二.spring-boot使用spring-boot-freemarker

    ①.在springMVC中:它代表着view层组件 ②.为什么使用freemarker:简单容易学.逻辑分明 ③.freemarker优点:它不依赖servlet.网络或者web环境 一.创建一个ma ...

  5. 解决安卓TextView高度和textSize大小不一致问题

    在设计安卓界面的时候我发现一个TextView在布局上占用的高度和属性textSize的大小不一样,要比textSize要来的大(比如textSize="12dp",实际的高度大概 ...

  6. Fragment与Activity传递数据

    MainActivity如下: package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activit ...

  7. vue-resource文档详细解读

    Vue可以构建一个完全不依赖后端服务的应用,同时也可以与服务端进行数据交互来同步界面的动态更新.Vue通过插件的形式实现了基于AJAX,JSPNP等技术的服务端通信. vue-resource是一个通 ...

  8. Elastic修改副本数量

    分片的个数在创建之后是无法再增加和减少的,除非你另外建一个索引库,而副本是可以在运行的时候,动态增加和减少.因此,在创建索引库时,规划好分片(Shard)是非常重要的,而在插入大量数据时可以先将副本书 ...

  9. 【笔记】探索js 的this 对象 (第二部分)

    了解this 对象之后 我们明白了this 对象就是指向调用函数的作用域 那么接下来我们便要清除函数究竟在哪个作用域调用 找到调用的作用域首先要了解一下几点: 1.调用栈: 调用栈就是一系列的函数,表 ...

  10. 删除其他硬盘的Windows文件夹

    删除其他硬盘的Windows文件夹 学习了:https://blog.csdn.net/drbing/article/details/50881461 有效果,必须先改文件夹的所属,然后才能修改权限: ...