shell [[]]-eq -gt

shell中(),[]和[[]]的区别

2011.07.25 No Comments 51 views

 

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.` `.``.``.` `进行算术扩展,而[ ... ]不做

1)在ksh中的test

数字的运算可使用let、(( )) ,其中运算时不需要变量$符号,运算符为 +、-、*、/、% ,不建议使用expr

数字的比较使用 (( )) ,其运算符 >、>=、<、<=、==、!=

可以使用算术扩展,如:(( 99+1 <= 101 ))

字符表达式的比较使用 ` ` ,其运算符 =、!=、-n、-z

文件表达式的测试使用 ` ` ,其运算符 -r、-l、-w、-x、-f、-d、-s、-nt、-ot

逻辑表达式的测试使用 ` ` ,其运算符 !、&&、||

数字比较、字符比较、逻辑测试可以组合,如$ [[ "a" != "b" && 4 -gt 3 ]]

支持bash中的通配符扩展,如:[[ hest = h??t ]] 、[ hest = h*t ]]

使用 (( )) 时,不需要空格分隔各值和运算符,使用 ` ` 时需要用空格分隔各值和运算符。

2)bash与ksh中的 ` ` 不同

在redhat9的bash中也可以使用 ` ` 符号。但是建议严格按照上面的原则使用。

在bash中,数字的比较最好使用 (( )),虽说可以使用 ` `,但若在其内使用运算符 >、>=、<、<=、==、!= 时,其结果经常是错误的,不过若在 ` ` 中使用 [ ] 中的运算符“-eq、-ne、-le、-lt、-gt、-ge”等,还尚未发现有错。因此诸如$ [[ " a" != “b” && 4 > 3 ]] 这类组合(见上)也不可以在bash中使用,其出错率很高。

例:[[ "a" != "b" && 10 > 2 ]] 判断结果就不正常。

诸如 [ 2 \< 10 ]、[[ 2 < 10 ]] 都是不要使用。使用算术扩展最好用 (( 99+1 == 100 )) ,而不要使用[[ 99+1 -eq 100 ]] 。

http://www.linuxwind.com/07/25/597.html

 

转载于:https://blog.51cto.com/wiigood/982339

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值