全部博文(48)
分类: Python/Ruby
2010-02-02 22:51:08
测试字符串,文件 使用[[]] ;测试数值计算结果 使用(())
1. [[ ]] 表达式,测试字符串和文件
用来扩展测试命令, 因为这种表现形式可能对某些语言的程序员来说更容易熟悉一些.是一个, 并不是一个命令.
使用[[]]而不使用[] 原因有:
(1)能够防止脚本中的许多逻辑错误:&&, ||(而不是使用 –a –o ,与bash统一)
<, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错.
(2) 阻止分词 // 在[] 需要加双引号
(3) $a>$b
1.1 字符串测试
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
测试 意义
[[ -z $str ]] 字符串为"null", 意思就是字符串长度为零,即和空格是有区
[[ -n $str ]] 字符串不为"null"
[[ $str1 == $str2 ]] 相等, 两侧一定要有空
[[ $str1 = $str2 ]] 同上
[[ $str1 != $str2 ]] 不等,两侧一定要有空格
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注意点:1)表达式和[[]]之间要有空格
2)[[]]中如果不是表达式或文件测试就看成字符串然后 -n 即可得出答案如果有!
可以理解为 ! -n eg:[[ ! "hello" ]]
3)比较关系两侧无空格相当于 [[一个字符串]]
4) [[]] 可以避免 []中的忘记测试的变量引用起来带来的坏处,但还是养成好习惯加上引用
[ -n $xy ] && echo suc # + '[' -n ']' + echo suc suc
[ -n "$xy" ] && echo suc # + '[' -n '' ']'
2.1 文件测试
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
用法 意义 用法 意义
[[ -b $file ]] 块设备 [[ -r $file ]] 文件可读
[[ -c $file ]] 字符设备 [[ -s $file ]] 文件大小不为零
[[ -d $file ]] 目录 [[ -w $file ]] 文件可写
[[ -e $file ]] 文件存在 [[ -x $file ]] 文件可执行
[[ -f $file ]] 普通文件 [[ -p $file ]] 命名管道
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2. (( )) 表达式,测试数值计算结果
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
用法 意义
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注意点:1)表达式和[[]]之间无需空格
2) 关系操作符两侧也无需有空格
3) (( )) 中使用 < > <= >= = = #abs里漏了 = =操作符, 但是 =号不支持,在算式表达式中被理解为赋值.
4) 字符串比较使用 [[ ]] 不能使用 (( )) 原因是在(( )) 是扩展并计算一个算术表达式的值, NULL字符串(即没定义或为空的字符串)会转换为0
5)(())只支持整型比较
3.浮点数测试
由于(())只支持整型比较,
$ [[ 12 > 3 ]] && echo ok || echo no # no 字符比较,输出错误结果
解决之道:
1) bc
echo "2.1> 3.22" | bc #(( 1==$(echo "2.1> 3.22" | bc) )) && echo ok || echo no
2) awk
awk -v a=0.7 -v b=0.5 'BEGIN{print(a>b)?"a is big":"b is big"}'