shell中if条件字符串、数字比对,[[ ]]和[ ]区别

shell 括号

test 和 []符号

二者是同样的,在命令行里test expr和[ expr ]的效果相同。要注意的有:正则表达式

  1. test中可用的比较运算符只有==和!=
  2. 二者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。
  3. 不管是字符串比较仍是整数比较都千万不要使用大于号小于号。固然,若是你实在想用也是能够的,对于字符串比较可使用尖括号的转义形式,若是比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0.

test 的基本做用

test的三个基本做用是判断文件、判断字符串、判断整数。支持使用与或非将表达式链接起来。shell

[[]] 符号

这是内置在shell中的一个命令,支持字符串的模式匹配(使用=~操做符时甚至支持shell的正则表达式)。逻辑组合能够不使用test的-a,-o而使用&&,||这样更亲切的形式(针对c、Java程序员)。固然,也不用想的太复杂,基本只要记住:bash

  1. 字符串比较时能够把右边的做为一个模式(这是右边的字符串不加双引号的状况下。若是右边的字符串加了双引号,则认为是一个文本字符串。),而不单单是一个字符串,好比[[ hello == hell? ]],结果为真。
  2. 使用[]和[[]]的时候不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]的结果为“假”,但[[ 1==2 ]]的结果为“真”!后一种显然是错的。

let和(())符号

二者也是同样的(或者说基本上是同样的,双括号比let稍弱一些)。主要进行算术运算(上面的两个都不行),也比较适合进 行整数比较,能够直接使用熟悉的<,>等比较运算符。能够直接使用变量名如var而不须要$var这样的形式。支持分号隔开的多个表达式测试

"[]" , "[[]]" 和 "(())"对比

  1. 首先,尽管很类似,可是从概念上讲,两者是不一样层次的东西。
    1. "[[",是关键字,许多shell(如ash bsh)并不支持这种方式。ksh, bash(听说从2.02起引入对[[的支持)等支持。
    2. "["是一条命令, 与test等价,大多数shell都支持。在现代的大多数sh实现中,"["与"test"是内部(builtin)命令,换句话说执行"test"/"["时不会调用/some/path/to/test这样的外部命令(若是有这样的命令的话)。
  2. [[]]结构比Bash版本的[]更通用。在[[和]]之间的全部的字符都不会被文件扩展或是标记分割,可是会有参数引用和命令替换。用[[ ... ]]测试结构比用[ ... ]更能防止脚本里的许多逻辑错误。好比说,&&,||, <和> 操做符能在一个[[]]测试里经过,但在[]结构会发生错误。
  3. (( ))结构扩展并计算一个算术表达式的值。若是表达式值为0,会返回1或假做为退出状态码。一个非零值的表达式返回一个0或真做为退出状态码。这个结构和先前test命令及[]结构的讨论恰好相反。
  4. [ ... ]为shell命令,因此在其中的表达式应是它的命令行参数,因此串比较操做符">" 与"<"必须转义,不然就变成IO改向操做符了(请参看上面2中的例子)。在[[中"<"与">"不需转义;因为"[["是关键字,不会作命令行扩展,于是相对的语法就稍严格些。例如在[ ... ]中能够用引号括起操做符,由于在作命令行扩展时会去掉这些引号,而在[[ ... ]]则不容许这样作。
    file
相关文章
相关标签/搜索