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

原创 2013年12月04日 12:55:06
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bash 逻辑运算表达式值 test , [], [[]]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

test 与 [] 是等价的, [[]] 是对[] 的功能扩充,但老版本的bash或精简版bash可能不支持。

****************************************
test 测试, 逻辑运算府区分字符串与数字
****************************************
----------------------------------------
[root@hjj ~]# test 1=2 && echo ok
ok
错误原因,运算符两边必须用空格分开,不能连在一起
而let 语句为变量赋值则=两边不能由空格
----------------------------------------

========================================
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
****************************************
============================================================
[] 测试<, > 要加转以符\,  <, > 字符串
============================================================

----------------------------------------
错误原因: < 号前没有加\
ot@hjj ~]# [ 1 < 2 ] && echo ok
ok
[root@hjj ~]# [ 1 > 2 ] && echo ok
ok
----------------------------------------


ot@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

********************************************************************************
[[]] 表达式, 能够支持<, > 运算符而不用转义, 能够支持&&, ||运算府
********************************************************************************
[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
abcroot 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

~                                                                                                   
~                                                     

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

栈----实则运算表达式求值(1)

我们先来看,对于“9+(3-1)x3+10÷2 ”,如果用后缀法表示应该是什么样地那:“9 3 1 - 3 * + 10 2 /+” ,这样的表达式就叫后缀表达式,叫后缀的原因在于所有的符号都要在运...

string运算表达式

  • 2010年07月17日 10:14
  • 5KB
  • 下载

四则混合运算表达式处理

  • 2012年03月10日 10:36
  • 572KB
  • 下载

数学运算表达式形式的验证码 C# Asp.Net

http://www.cnblogs.com/sunnylike/archive/2009/04/08/1431710.html   /*-----------------------------...

计算算术运算表达式

  • 2012年01月10日 09:50
  • 94KB
  • 下载

运算表达式计算库

  • 2007年07月26日 17:01
  • 73KB
  • 下载

nodejs003-运算表达式/条件判断/循环语句/垃圾回收

一、运算表达式 二、条件判断 三、循环条件 四、执行模式 五、垃圾回收

四则混合运算表达式处理

  • 2011年11月01日 20:10
  • 501KB
  • 下载

堆栈的应用--计算机对运算表达式编译

在源程序的表达式中,常出现这样的形式:A*B+C/D,这种形式便于我们理解,但是由于加入了运算符优先级,运算的最终顺序不是按照从左至右,因而不便于计算机的理解。这个时候运用堆栈可以较好地完成这个任务。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bash 运算表达式求值 test, [],[[]]
举报原因:
原因补充:

(最多只允许输入30个字)