shell if 解释(三) --逻辑判断

1. 关于文件和目录

-f 判断某普通文件是否存在
-d 判断某目录是否存在
-b 判断某文件是否块设备
-c 判断某文件是否字符设备
-S 判断某文件是否socket(待修正)
-L 判断某文件是否为符号链接(待修正)
-e 判断某东西是否存在(待修正)
-p 判断某文件是否为pipe 或是 FIFO

2. 关于文件的属性

-r 判断文件是否为可读的属性
-w 判断文件是否为可以写入的属性
-x 判断文件是否为可执行的属性
-s 判断文件是否为非空白文件
-u 判断文件是否具有SUID的属性
-g 判断文件是否具有SGID的属性
-k 判断文件是否具有sticky bit的属性

3. 两个文件之间的判断与比较

例如[ test file1 -nt file2 ]
-nt 第一个文件比第二个文件新
-ot 第一个文件比第二个文件旧
-ef 第一个文件与第二个文件为同一个( link 之类的文件)

4. 逻辑的(and)与(or)

&& 逻辑的 AND 的意思, -a 也是这个意思
|| 逻辑的 OR 的意思, -o 也是这个意思

5. 运算符相关

运算符号代表意义
= 等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
!= 不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
< 小于 应用于:整型比较 在[] 中,不能使用 表示字符串 > 大于 应用于:整型比较 在[] 中,不能使用 表示字符串
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式
-z 空字符串
-n 非空字符串

6.1 test 命令

# test 1 = 1 && echo 'ok'
ok

# test -d /etc/ && echo 'ok'
ok

# test 1 -eq 1 && echo 'ok'
ok

# if test 1 = 1 ; then echo 'ok'; fi
ok
**注意:所有字符 与逻辑运算符直接用“空格”分开,不能连到一起。test 1=1就是错误的!**

6.2 [] 表达式

# [ 1 -eq 1 ] && echo 'ok'
ok

# [ 2 < 1 ] && echo 'ok'
-bash: 2: No such file or directory

# [ 2 < 1 ] && echo 'ok'
# [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok'
ok

# [ 2 -gt 1 && 3 -lt 4 ] && echo 'ok'
-bash: [: missing `]'

注意:在[] 表达式中,常见的>, <需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。
不直接支持<, >运算符,还有逻辑运算符|| , && 它需要用-a[and] –o[or]表示

6.3 [[]] 表达式

# [ 1 -eq 1 ] && echo 'ok'
ok

# [[ 2 < 3 ]] && echo 'ok'
ok

#[[ 2 < 3 && 4 > 5 ]] && echo 'ok'
ok

[[ 2 < 3 -a 3 > 4 ]] && echo "ok"
-bash: syntax error in conditional expression
-bash: syntax error near `-a'

注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| && ,不再使用-a -o

华丽丽的分割线


另外一部份总结:

bash shell中与[ ]的区别

一,[[用"&&"而不是"-a"表示逻辑"与",用"||"而不是"-o"表示逻辑"或":

# [[ 1 < 2 && b > a ]] && echo true || echo false
true

# [[ 1 < 2 -a b > a ]] && echo true || echo false
bash: syntax error in conditional expression
bash: syntax error near `-a’

# [ 1 < 2 -a b > a ] && echo true || echo false
true

# [ 1 < 2 && b > a ]&& echo true || echo false #wrong syntax
bash: [: missing `]‘
false

二,[ ... ]为shell命令,所以在其中的表达式应是它的命令行参数,所以串比较操作符”>” 与”<”必须转义,否则就变成IO改向操作符了。[[中"<"与">"不需转义:

# [ 2 < 10 ] && echo true || echo false #you should use “<”
-bash: 10: No such file or directory
false

# [[ 2 < 10 ]] && echo true || echo false
false

三,...进行算术扩展,而[ ... ]不做。

# [[ 99+1 -eq 100 ]] && echo true || echo false
true

# [ 99+1 -eq 100 ] && echo true || echo false
bash: [: 99+1: integer expression expected
false

# [ $((99+1)) -eq 100 ] && echo true || echo false
true

四,[[]]能用正则,而[]不行

# [ "test.php" == *.php ] && echo true || echo false
false

# [[ "test.php" == *.php ]] && echo true || echo false
true

# [[ "t.php" == [a-z].php ]] && echo true || echo false
true

# [ "test.php" == "*.php" ] && echo true || echo false
false

# [[ "test.php" == "*.php" ]] && echo true || echo false
false

注意:双引号("")的作用

四、性能比较

bash的条件表达式中有三个几乎等效的符号和命令:

test,[]和[[]]。通常,大家习惯用if [];then这样的形式。而[[]]的出现,根据ABS所说,是为了兼容><之类的运算符。以下是比较它们性能,发现[[]]是最快的。

$ time (for m in {1..100000}; do test -d .;done;)
real 0m0.658s
user 0m0.558s
sys 0m0.100s

$ time (for m in {1..100000}; do [ -d . ];done;)
real 0m0.609s
user 0m0.524s
sys 0m0.085s

$ time (for m in {1..100000}; do `-d`.``;done;)
real 0m0.311s
user 0m0.275s
sys 0m0.036s

不考虑对低版本bash和对sh的兼容的情况下,用[[]]是兼容性强,而且性能比较快,在做条件运算时候,可以使用该运算符。

http://www.cnblogs.com/chengmo/archive/2010/10/01/1839942.html
http://blog.csdn.net/lzueclipse/article/details/6864400

你可能感兴趣的:(shell if 解释(三) --逻辑判断)