转自:
http://blog.csdn.net/u013961718
https://www.shiyanlou.com/courses/running
test 和 [ ]
test是一条内置命令, test 根据表达式expr 求值的结果返回 0(真)或 1(假),可以用echo $?查看返回的退出状态。[等价于test,即test expr 和 [ expr ] 是等价的。
test的三个基本作用是判断文件、判断字符串、判断整数。test中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。注意:< 和 >在bash中表示重定向,所以如果要使用需要转义。
[ 是一个命令,所以在后面接测试命令的时候一定要加空格,而‘]'并不是命令的一部分,它的存在是为了规避bash语法检查规则,如果没有它会出现错误。
在进行字符变量的非空检查时,如果 -n 没有接变量,比如[ -n ]则会把 ] 作为-n的参数,从而条件测试返回’true‘,继而,如果如[ -n $string ]判断string是不是非空的话,就算string是空的,也不会返回false,解决办法就是用双引号把变量引用括起来。如[ -n "$string" ]。
[[ ]]
[[ ]] 是bash的一个关键字,功能比test强大的多。支持字符串的模式匹配,字符串比较时可以把右边的作为一个模式(这是右边的字符串不加双引号的情况下。如果右边的字符串加了双引号,则认为是一个文本字符串。),而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。
[[ ]] 没有文件扩展和字符分割,但存在参数扩展和命令替换。
注意:使用[]和[[]]的时候不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]的结果为“假”,但[[ 1==2 ]]的结果为“真”!后一种显然是错的。
如果字符串并没有被初始化, 那么它里面的值未定义. 这种状态被称为"null" (注意这与零值不同)。
let 和 (( ))
let 和 (( )) 功能基本一样,主要进行算数运算,也可以进行整数比较。
如果表达式求值为 0,则设置退出状态为 1;如果求值为非 0 值,则设置退出状态为 0