%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bash 逻辑运算表达式值 test , [], [[]]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
test 与 [] 是等价的, [[]] 是对[] 的功能扩充,但老版本的bash或精简版bash可能不支持。
****************************************
test 测试, 逻辑运算府区分字符串与数字
****************************************
----------------------------------------
[root@hjj ~]# test 1=2 && echo ok
ok
错误原因,运算符两边必须用空格分开,不能连在一起
1=2需要写成1空格=空格2 这种方式。
而let 语句为变量赋值则=两边不能有空格
这是bash语句不同于其它语言的地方。
进一步解释: 我阅读了test 的程序源码, 1=2是1个参数, 1个参数总是返回成功!
1空格=空格2是3个参数,3个参数(如果操作符是=符号,它会用strcmp比较左边,右边的字符串)
----------------------------------------
========================================
test 测试 =, 实际是字符串比较
========================================
[root@hjj ~]# test 1 = 1 && echo ok
ok
[root@hjj ~]# test 1 = 2 && echo ok
[root@hjj ~]# test a = b && echo ok
[root@hjj ~]# test a = a && echo ok
ok
========================================
test 测试 eq 只能用于整数比较
========================================
[root@hjj ~]# test 1 -eq 1 && echo ok
ok
[root@hjj ~]# test 1 -eq 2 && echo ok
[root@hjj ~]# test a -eq a && echo ok
bash: test: a: integer expression expected
看了代码才直到,这是三参数比较,左边一个整数,右边一个整数
****************************************
精简表达式 [ ] , 可以取代test
****************************************
============================================================
[] 测试<, > 要加转以符\, <, > 字符串
============================================================
----------------------------------------
错误原因: < 号前没有加\ , 因为bash 把< 当成重定向字符了.
[root@hjj ~]# [ 1 < 2 ] && echo ok
bash: 2: No such file or directory
----------------------------------------
[root@hjj ~]# [ 1 \> 2 ] && echo ok
[root@hjj ~]# [ 1 \< 2 ] && echo ok
ok
----------------------------------------
由此可见, \< , \> 是按字符串比较
[root@hjj ~]# [ 10 \< 2 ] && echo ok
ok
[root@hjj ~]# [ 10 \> 2 ] && echo ok
----------------------------------------
========================================
[] 内部测试 && || 操作符需要用-a -o 代替
========================================
[root@hjj ~]# [ 1 -lt 2 && 2 -lt 3 ] && echo ok
bash: [: missing `]'
[root@hjj ~]# [ 1 -lt 2 -a 2 -lt 3 ] && echo ok
ok
看了test代码我才知道, 这个test 程序也有不少逻辑而且要保证其是正确的!!
让人感叹脚本原来是这样工作的!
********************************************************************************
[[]] 表达式, 能够支持<, > 运算符而不用转义, 能够支持&&, ||运算府
********************************************************************************
[root@hjj ~]# [[ 2 > 1 ]] && echo ok
ok
[root@hjj ~]# [[ 1 > 2 ]] && echo ok
[root@hjj ~]# [[ 2 > 1 && 3 > 2 ]] && echo ok
ok
[root@hjj ~]# [[ 2 > 1 && 2 > 3 ]] && echo ok
[root@hjj ~]# [[ b > a ]] && echo ok
ok
[root@hjj ~]# [[ a > b ]] && echo ok
[root@hjj ~]#
总结:
-eq, -ne, -lt, -gt, -le, -ge 只能用于整形比较
=, !=, <, > 只用于字符串
此外测试字符串是否为空: -z, -n ,要当心,理解其真正含义.
[] 内的组合条件用-a, -o
[[]] 内的组合条件可以用 && , ||
另外,bash 算术表达式求值用$(()), 或$[] 来计算
---------------------------------------
字符串变量的比较,= == 都可以, 字符串变量最好加上双引号
否则,可能出现 too many arguments
----------------------------------------
[root ~]$ a="abc def"
[root ~]$ echo $a
abc def
[root ~]$ if [ $a = "abc def" ] ;then echo yes;else echo no;fi
bash:root [: too many arguments
no
[root ~]$ if [ "$a" = "abc def" ] ;then echo yes;else echo no;fi
yes
----------------------------------------
if 语句(测试语句)的简单写法
----------------------------------------
[root ~]$ [ "$a" = "abc def" ] && echo yes || echo no
yes
[root ~]$ [ "$a" = "abc defd" ] && echo yes || echo no
no