Shell 编程基础之 [ 与 [[ 的异同
一、简介
[ 与 test 等价,是 bash 的内部命令,GNU/linux 系统的 coreutils 软件包通常带 /usr/bin/test 和 /usr/bin/[ 命令。如果我们不用绝对路径指 明,通常我们用的都是bash 自带的命令。
[[ 是 bash 关键字(据说从2.02起引入对[[的支持)
二、异同分析
相同点
- 都支持算术比较 ("gt"、"ge"、"eq"、"ne"、"lt"、"le")
user@ae01:~$ [ -lt ]&&echo true||echo false
trueuser@ae01:~$ [ -gt ]&&echo true||echo false
falseuser@ae01:~$ [[ -lt ]]&&echo true||echo false
trueuser@ae01:~$ [[ -gt ]]&&echo true||echo false
false - 都支持字符串比较("<"、">" 但具体使用有些不同)
关于字符串比较。[...]、[[...]]中都可以对字符串进行比较,比较的顺序是"字典顺序"。对ascii字符来讲,码表中排列在前的较小,如A<B,A<a, 1<2。再强调一次,这里只要用了"<"、">",就表示是字符串比较,那么9 > 100为真,因为这实际上等价于‘9’ > ‘100’,9在码表中排在1后面,所以字符串"9"大于字符串"100"。user@ae01:~$ [ \< ]&&echo true||echo false
falseuser@ae01:~$ [ \> ]&&echo true||echo false
true注意转义字符\的使用,否则bash会认为是标准输出重定向。
user@ae01:~$ [[ < ]]&&echo true||echo false
trueuser@ae01:~$ [[ > ]]&&echo true||echo false
false - 都支持简单模式的匹配
user@ae01:~$ [ test = test ]&&echo true||echo false
trueuser@ae01:~$ [ test = t*t ]&&echo true||echo false
trueuser@ae01:~$ [ test = t..t ]&&echo true||echo false
falseuser@ae01:~$ [ test = t??t ]&&echo true||echo false
trueuser@ae01:~$ [[ test = test ]]&&echo true||echo false
trueuser@ae01:~$ [[ test = t*t ]]&&echo true||echo false
trueuser@ae01:~$ [[ test = t..t ]]&&echo true||echo false
falseuser@ae01:~$ [[ test = t??t ]]&&echo true||echo false
true模式匹配类似文件名的统配符的扩展规则。还要注意等号右端的模式不能用引号括起,使用引用关闭了某些元字符的特殊功能。
不同点
- 逻辑与和逻辑或
- [ 逻辑与:-a;逻辑或:-o]
[ 1 -lt 2 ]:true; [ b > a ]:trueuser@ae01:~$ [ -lt -a b > a ]&&echo true||echo false
trueuser@ae01:~$ [ -gt -a b > a ]&&echo true||echo false
falseuser@ae01:~$ [ -gt -o b > a ]&&echo true||echo false
true - [[ 逻辑与:&&;逻辑或:|| ]]
[ 1 -lt 2 ]:true; [ b > a ]:trueuser@ae01:~$ [[ -lt && b > a ]]&&echo true||echo false
trueuser@ae01:~$ [[ -gt && b > a ]]&&echo true||echo false
falseuser@ae01:~$ [[ -gt || b > a ]]&&echo true||echo false
true
- [ 逻辑与:-a;逻辑或:-o]
- 命令行参数
"[["是关键字,不会做命令行扩展,所以在[[中"<"与">"不需转义,但是相对的语法就稍严格些。例如在[ ... ]中可以用引号括起操作符,因为在做命令行扩展时会去掉这些引号,而在[[ ... ]]则不允许这样做user@ae01:~$ [ "-z" "" ]&&echo true||echo false
trueuser@ae01:~$ [[ "-z" "" ]]&&echo true||echo false
-bash: conditional binary operator expected
-bash: syntax error near `""' - 算术扩展
[[ ... ]]进行算术扩展,而[ ... ]不行,[ ... ]需要使用$(())user@ae01:~$ [ + -eq ]&&echo true||echo false
-bash: [: +: integer expression expected
falseuser@ae01:~$ [ $((99+1)) -eq ]&&echo true||echo false
trueuser@ae01:~$ [[ + -eq ]]&&echo true||echo false
true
Shell 编程基础之 [ 与 [[ 的异同的更多相关文章
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- 6-2 shell编程基础
shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...
- shell编程基础进阶
为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...
- 基于Linux系统的Shell编程-基础篇
1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...
随机推荐
- 在eclipse中遇到cannot open output file xxx.exe: Permission denied 的解决办法
该问题出现的原因主要原因是,编译后运行的程序未能正确关闭,解决方法:删除debug目录即可 同理在vc6.0遇到同样问题时,删除debug目录,或者重启vc6.0即可
- C++箴言:理解typename的两个含义
C++箴言:理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class ...
- Apache Shiro 学习记录1
最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...
- ThinkPhp 验证码不显示图片
验证码不显示原因分析: 1.先确保是否开启了 gd库 2.页面是否存在bom头 3.导入的ORG.Util.Image是否存在 4.入口文件中是否有define('APP_DEBUG', TRUE); ...
- multipart/form-data和application/x-www-form-urlencoded的区别
在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 下边是说明: application/x-www-form-urle ...
- windows vim修改字体
C:\Program Files (x86)\Vim\vim74 目录下,在vimrc_example.vim和mswin.vim中添加: set guifont=Consolas:h11
- poj 1733
这题离散化+并查集,没看出关dp什么事.(那他为什么放到dp里面) 用Si记录前i项的和.拆成两个点,i*2表示与第i个相同,i*2+1表示与第i个不同.用并查集判断.区间[a,b]就可以看成Sb-S ...
- Unity3D LuaBundleLoader(基于cslua)
说明:异步加载lua的bundle,会优先加载cache目录下bundle(一般更新的资源都在cache下) using System; using UnityEngine; using System ...
- libeventReferenceManual阅读笔记
一.01_intro.html Example:A low-level ROT13 server with Libevent 这是一个利用event实现的server实例 Example:A simp ...
- ffmpeg-20160908[09,10,13,15,19,21,22,24]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...