shell脚本----[]与[[ ]]的区别与联系

 [  ] 单双括号

基本要素:

[ ] 两个符号左右都要有空格分隔

内部操作符与操作变量之间要有空格:如  [  “a”  =  “b”  ]

字符串比较中,> < 需要写成\> \< 进行转义

[ ] 中字符串或者${}变量尽量使用"" 双引号扩住,避免值未定义引用而出错的好办法

[ ] 中可以使用 –a –o 进行逻辑运算

[ ] 是bash 内置命令:[ is a shell builtin

[ ] 实际上是bash 中 test 命令的简写。即所有的 [ expr ] 等于 test expr。

 [[  ]] 双方括号

基本要素:

[[ ]] 两个符号左右都要有空格分隔

内部操作符与操作变量之间要有空格:如  [[  “a” =  “b”  ]]

字符串比较中,可以直接使用 > < ,无需转义

[[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配,例如:如果*没有被双引号扩住,可以匹配所有字符

例如:

[[email protected] lxjwork]$ [[ "ab"=a* ]] && echo "ok"

ok

[[ ]] 内部可以使用 &&  || 进行逻辑运算

[[ ]] 是bash  keyword:[[ is a shell keyword

[[ ]] 其他用法都和[ ] 一样

[[ ]] 和 [ ] 都可以和 ! 配合使用

优先级

!  >  && > ||

逻辑运算符  < 关系运算符

逻辑运算符  : !  &&  || -a  -o

关系运算符  : <  >  \> \<  ==  = !=  – eq –ne  -gt -ge  –lt  -le

三、 比较

[[]] 运算符只是[]运算符的扩充。 [[]] 能够支持<,>符号运算不需要转义符,[]中必须转义:\> \< 。

[[]]是以字符串比较大小。里面支持逻辑运算符:&& ||  ,不再使用-a -o  。

对 test 命令来说, 用 -eq 要进行数字比较,而你此时传入字符串,就报错了。

[[ expr ]] 是bash中真正的条件判断语句,其语法更符合编程习惯 (比如 &&, || 的用法),在 [[ ]] 中 故意传字符串给 -eq 不会报错,bash实现中直接把非整数的字符串直接转换成了 0 (你可以自行验证,在 [[ ]] 中的,任何需要整数,但是提供又是其它不能转换成整数的字符串,都变成了0)。 这应该是bash实现中的没有对 [[ ]] 中 -eq 操作符两边的内容进行检查导致的。 对于我们来说,没必要钻这些东西,我们应该保证自己代码中的需要用到整数的时候,总是提供整数。

四、 [[  ]] 比[ ] 具备的优势

①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。

时间: 2024-08-10 23:42:28

shell脚本----[]与[[ ]]的区别与联系的相关文章

shell脚本中的[]/[[]]区别

转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/details/6836382 shell 括号 学习shell的时候总是被shell里的条件判断方式搞得头疼,经常不知道改 用[],[[]],((

shell脚本介绍,shell脚本结构和执行方式,date命令的用法,shell脚本中的变量简介

笔记内容: 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量 笔记日期:2017-11-21 20.1 shell脚本介绍 Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令

单独运行shell脚本与crontab运行shell脚本的区别

crontab运行脚本存在两大问题:环境变量和路径,从而导致单独运行脚本没问题,但用crontab运行就报错. 1.环境变量 描述问题:crontab: usage error: no arguments permitted after this option 因为crontab不提供环境,所以需要自己在shell中加入,或者全部用绝对路径.简单的方法:控制台输入 [[email protected] ~]# echo $PATH /your/path/1:/your/path/2------

详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]

概述 很多时候我们在写shell脚本的时候总会碰到不同的括号,那么这些不同的括号有什么区别呢? $() 用于命令交换 说明:平时脚本用的``符号也是用于命令交换的哦,和$() 的操作是一样的 ${ } 用于变量替换,这里每次调用环境的时候是需要带一个${ } 但是不带也不会影响 这个定义了变量的范围,比较不容易出错 $[ ] --条件判断用的比较多 用于算术计算,注意里面出现的只有数字 如果在里面输出其他非数字的就报错: $(()) 这个效果和$[ ] 差不多,两个都是计算的 [ ] 条件表达式

shell 脚本中双引号 单引号 反引号 的区别

转自:http://blog.csdn.net/iamlaosong/article/details/54728393 最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所以需要生成最近几天的日期,以便检测文件是否存在,看下面的脚本中如何使用双引号.单引号.反引号: OPDATE=`date -d '-1 day' +%Y%m%d` for i in $(seq 10) do FILEDATE=`date -d "-$i day" +%Y%m%d` echo

Ubuntu下shell脚本运行异常:bash和dash的区别

Ubuntu下我用bash到语法写了一个shell脚本(准确的说是把书上的脚本敲进电脑),在ubuntu下,用sh test.sh来运行,但是出现了意料之外到结果,比如echo -e "\nTest\n"到执行就不同,直接用sh test.sh运行,会打印出-e(作为字符串);而直接在终端中输入echo -e "\nTest\n"是不会输出"-e"的. 我就在想是什么原因,后来终于发现是Ubuntu下sh默认指向dash. echo $SHELL

Windows 和 Linux 中的换行与回车的区别,Windows下编写的Shell脚本,直接放到linux/unix下执行会报错

首先: CR(Carriage Return)表示回车 LF(Line Feed)表示换行 Dos和Windows采用回车+换行(CR+LF)表示下一行而UNIX/Linux采用换行符(LF)表示下一行苹果机(MAC OS系统)则采用回车符(CR)表示下一行 Windows下编写的Shell脚本,直接放到linux/unix下执行会报错,就是因为行结束符不一样导致的. 现在好多文本工具都提供了转换功能,如我常用的,也是最强大的工具 (个人感受,不是打广告):notepad++. 原文地址:htt

shell脚本进阶

一.流程控制 流程控制语句,即用来实现对程序流程的选择.循环和返回等进行控制的语句. 1.条件判断 (1)if条件判断 普通if条件判断 格式: 嵌套if条件判断 格式: (2)case判断 简洁版多分支if语句,当if语句有多个elif时可以使用case语句代替,语言更简洁容易理解.使用场景:判断某个变量值是否为多种情形中的一种时使用. 格式: 示例: 执行结果: 2.循环 循环执行就是将循环体内的代码重复运行多次:运行的次数由进入循环的条件和退出循环决定. (1)for循环 格式: 列表:变

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child