详解shell脚本[][[]]-n-z的含义解析
在写脚本的时候,总是搞不懂[] [[]]的区别,这次写⼀个总结,把它掌握牢固
[]和test
两者是⼀样的,在命令⾏⾥test expr和[ expr ]的效果相同。
test的三个基本作⽤是判断⽂件、判断字符串、判断整数。⽀持使⽤ ”与或⾮“ 将表达式连接起来。
test中可⽤的⽐较运算符只有==和!=,两者都是⽤于字符串⽐较的,不可⽤于整数⽐较,整数⽐较只能使⽤-eq, -gt这种形式。
⽆论是字符串⽐较还是整数⽐较都千万不要使⽤⼤于号⼩于号。当然,如果你实在想⽤也是可以的,对于字符串⽐较可以使⽤尖括号的转义形式,如果⽐较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0.
[[ ]]
这是内置在shell中的⼀个命令,它就⽐刚才说的test强⼤的多了。⽀持字符串的模式匹配(使⽤=~操作符时甚⾄⽀持shell的正则表达式)。逻辑组合可以不使⽤test的-a,-o⽽使⽤&& ||。
字符串⽐较时可以把右边的作为⼀个模式(这是右边的字符串不加双引号的情况下。如果右边的字符串加了双引号,则认为是⼀个⽂本字符串。),⽽不仅仅是⼀个字符串,⽐如[[ hello == hell? ]],结果为真。
注意:使⽤[]和[[]]的时候不要吝啬空格,每⼀项两边都要有空格,[[ 1 == 2 ]]的结果为“假”,但[[ 1==2 ]]的结果为“真”!
1. ⾸先,尽管很相似,但是从概念上讲,⼆者是不同层次的东西。
"[[",是关键字,许多shell(如ash bsh)并不⽀持这种⽅式。ksh, bash(据说从2.02起引⼊对[[的⽀持)等⽀持。
"["是⼀条命令,与test等价,⼤多数shell都⽀持。在现代的⼤多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执⾏"test"/"["时不会调⽤/some/path/to/test这样的外部命令(如果有这样的命令的话)。
2.[[]]结构⽐Bash版本的[]更通⽤。在[[和]]之间的所有的字符都不会被⽂件扩展或是标记分割,但是会有参数引⽤和命令替换。
⽤[[ ... ]]测试结构⽐⽤[ ... ]更能防⽌脚本⾥的许多逻辑错误。⽐如说,&&,||,<;和>操作符能在⼀个[[]]测试⾥通过,但在[]结构会发⽣错误。
3.(( ))结构扩展并计算⼀个算术表达式的值。如果表达式值为0,会返回1或假作为退出状态码。⼀个⾮零值的表达式返回⼀个0或真作为退出状态码。这个结构和先前test命令及[]结构的讨论刚好相反。
4.[ ... ]为shell命令,所以在其中的表达式应是它的命令⾏参数,所以串⽐较操作符">" 与"<"必须转义,否则就变成IO改向操作符了(请参看上⾯2中的例⼦)。在[[中"<"与">"不需转义;
由于"[["是关键字,不会做命令⾏扩展,因⽽相对的语法就稍严格些。例如
在[ ... ]中可以⽤引号括起操作符,因为在做命令⾏扩展时会去掉这些引号,⽽在[[ ... ]]则不允许这样做。
5.[[ ... ]]进⾏算术扩展,⽽[ ... ]不做
6.[[ ... && ... && ... ]] 和 [ ... -a ... -a ...] 不⼀样,[[ ]] 是逻辑短路操作,⽽ [ ] 不会进⾏逻辑短路
应⽤场景分析:
1、在中括号中,判断变量的值,加不加双引号的问题?
-z 判断变量的值,是否为空; zero = 0
- 变量的值,为空,返回0,为true
- 变量的值,⾮空,返回1,为false
-n 判断变量的值,是否为空 name = 名字
- 变量的值,为空,返回1,为false
- 变量的值,⾮空,返回0,为true
正则匹配尖括号pid="123"
[ -z "$pid" ] 单对中括号变量必须要加双引号
[[ -z $pid ]] 双对括号,变量不⽤加双引号
[ -n "$pid" ] 单对中括号,变量必须要加双引号
[[ -z $pid ]] 双对中括号,变量不⽤加双引号
2、多个条件判断,[] 和 [[]] 的区别?
2.1:[[ ]] 双对中括号,是不能使⽤ -a 或者 -o的参数进⾏⽐较的;
&& 并且 || 或 -a 并且 -o 或者
[[ ]] 条件判断 && 并且 || 或
[[ 5 -lt 3 || 3 -gt 6 ]] ⼀个条件,满⾜,就成⽴或者的关系
[[ 5 -lt 3 || 3 -gt 6 ]] ⼀个条件满⾜,就成⽴或者的关系
[[ 5 -lt 3 ]] || [[3 -gt 6 ]]
[[ 5 -lt 3 ]] || [[3 -gt 6 ]] 写在外⾯也可以
&& 必须两个条件同时满⾜,和上述⼀样,这⾥想说明的问题的是:
[[ 5 -lt 3]] -o [[ 3 -gt 6 ]] [[ 5 -lt 3 -o 3 -gt 6 ]]
[[ 5 -lt 3 -a 3 -gt 6 ]] [[ 5 -lt 3 -a 3 -gt 6 ]]
-a 和 -o就不成⽴了,是因为,[[]] 双对中括号,不能使⽤ -o和 -a的参数
直接报错:
2.2 [ ] 可以使⽤ -a -o的参数,但是必须在 [ ] 中括号内,判断条件,例如:
[ 5 -lt 3 -o 3 -gt 2 ] 或者条件成⽴
[5 -lt 3 ] -o [ 3 -gt 2] 或者条件,这个不成⽴,因为必须在中括号内判断
如果想在中括号外判断两个条件,必须⽤&& 和 || ⽐较
[5 -lt 3 ] || [ 3 -gt 2]
[5 -gt 3 ] && [ 3 -gt 2] 成⽴
相对的,|| 和 && 不能在中括号内使⽤,只能在中括号外使⽤
3、当判断某个变量的值是否满⾜正则表达式的时候,必须使⽤[[ ]] 双对中括号
单对中括号,直接报错:
到此这篇关于详解shell脚本[] [[]] -n -z 的含义解析的⽂章就介绍到这了,更多相关shell [] [[]] -n -z 内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论