bash 运算表达式求值 test, [],[[]]


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值