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

来源:互联网 发布:sql 2000 win7 64 编辑:程序博客网 时间:2024/06/17 03:13

注意[ 和test 是 Shell 的内部命令,而[[是Shell的关键字。 且 shell 以0作为true返回

#!/bin/bash
if [ 0 ];then
    echo "0"
fi  
输出 0


 [  ] 单双括号

基本要素:

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

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

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

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

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

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

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

 

 [[  ]] 双方括号

 

基本要素:

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

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

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

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

例如:

[lxj@localhost 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把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

       

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





Shell test 单中括号[] 双中括号[[]] 的区别

在写Shell脚本的时候,经常在写条件判断语句时不知道该用[] 还是 [[]],首先我们来看他们的类别:

$type [ [[ test[ is a shell builtin[[ is a shell keywordtest is a shell builtin

[ 和test 是 Shell 的内部命令,而[[是Shell的关键字。

$test -f settings.py && echo TrueTrue$[ -f settings.py ] && echo TrueTrue

[ 和test 是相等的。

$[ 2 < 1 ] && echo True || echo FalseTrue$[[ 2 < 1 ]] && echo True || echo FalseFalse

既然是命令, 它就和参数组合为一体被 shell 解释,那样比如 ">" "<" 就被 shell 解释为重定向符号了。关键字却不这样。

x=1y=1$[ $x == 1 && $y == 1 ] && echo True || echo False-bash: [: missing `]'False$[[ $x == 1 && $y == 1 ]] && echo True || echo FalseTrue$[ $x == 1 -a $y == 1 ] && echo True || echo FalseTrue

[[中使用&&||表示逻辑与和逻辑或。[中使用-a 和-o 表示逻辑与和逻辑或。

$[[ 'abcd' == a*d ]] && echo True || echo FalseTrue$[ 'abcd' == a*d ] && echo True || echo FalseFalse

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

总结:

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

但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]

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

$[ !(pip list | grep pip) ] && echo True || echo False-bash: [: too many argumentsFalse$[[ !(pip list | grep pip) ]] && echo True || echo FalseTrue

参考

http://blog.csdn.net/taiyang1987912/article/details/39551385http://blog.csdn.net/yongan1006/article/details/7195303

0 0
原创粉丝点击