Bash中的括号(二)
双方括号[[]]的用法:
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中的括号(二)的更多相关文章
- Bash中的括号(一)
初学Bash脚本编程,里面的各种括号,绝对是一个大坑,为了救人救己,以防再度入坑,特记录如下: 一.单小括号: 1.创建子Shell.单个小括号用来创建一个子shell,子shell允许你在不影响当前 ...
- Bash中的括号(三)
1.两个小括号用来对整数进行算术运算和逻辑运算,比如. 例如给变量赋值: $ a=+; echo $a + $ (( b = + )); echo $b 1+1 只是一个字符串,而 b 就是一个算术表 ...
- bash 中 小括号的作用
单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ...
- 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...
- shell中各种括号的作用()、(())、[]、[[]]、{}
一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...
- (转载)Bash 中的特殊字符大全
转自:https://linux.cn/article-5657-1.html Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是she ...
- bash中(),{},(()),[],[[]]的区别
前言:在bash中遇到各种括号,同时在进行字符数值比较判定时,总是不断出现问题,于是通过参考<advanced bash-scripting guide>,同时在centos 6.7版本上 ...
- shell 中各种括号的作用()、(())、[]、[[]]、{}
一.小括号,圆括号 () 1.单小括号 () 命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...
- Bash 中的特殊字符大全【转】
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
随机推荐
- 如何在form初始化时自动隐藏FOLDER列
方法1:直接设定PROMPT列和数据列ITEM的VISIBLE属性为No 方法2:在WHEN-NEW-FORM-INSTANCE触发器里: l_old_itm := :system.cursor_it ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
- 【mybatis】mybatis中放置IN查询拼接sql过长,IN查询进行分批次查询的处理
需要使用的切割list集合的工具类,链接:https://www.cnblogs.com/sxdcgaq8080/p/9376947.html 处理逻辑,原本的一个LIst,进行切割,循环进行myba ...
- node.js创建并引用模块
app.js var express = require('express'); var app = express(); var con = require('./content'); con.he ...
- 通配置文件的方式控制java.util.logging.Logger日志输出
转自:http://zochen.iteye.com/blog/616151 简单的实现了下利用JDK中类java.util.logging.Logger来记录日志.主要在于仿照log4j方式用配置文 ...
- 剖析ASP.NET Core(Part 3)- UseMvc(译)
原文:https://www.stevejgordon.co.uk/asp-net-core-anatomy-part-3-addmvc 发布于:2017年4月环境:ASP.NET Core 1.1 ...
- linux中断流程详解
异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核 ...
- maven工程小红叉处理方法
搞了个Maven工程在Eclipse上,刚开始说JDK版本不对,编译的时候老报错误,很容易搞明白, 本地JDK版本为1.7.0_79: diamond operator is not supporte ...
- 帮助更语义化的显示时间的jQuery插件 - tidyTime.js
来源:GBin1.com 网站或者web应用开发过程中,难免会遇到需要展示时间的地方,例如,留言时间或者发布帖子的时候,那么大家是不是相关过使用更加符合语义学的方式来显示时间呢? 08:15 显示成 ...
- LR中判断HTTP返回状态
有天,有个人问:我在做b/s测试,请问如何保存从服务器传回来的http头的信息,怎么能得到http状态,和状态200进行比较? 后来,我给出的代码如下: Action() {int i; // [WC ...