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

~                                                                                                   
~                                                     

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

简单算术表达式求值

本文主要探讨简单的数学算术表达式求值算法的原理和实现。
  • dnxbjyj
  • dnxbjyj
  • 2017年05月06日 09:17
  • 955

分别用C++和JavaScript 实现四则运算表达式求值

博主16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果。当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的...
  • Cinderella_hou
  • Cinderella_hou
  • 2016年04月22日 15:46
  • 291

玩转Bash脚本:test测试语句

之前写的这篇博文,最近发现讹误太多,又被多家网站(比如推酷,51CTO)转载过了。为避免误人子弟,贻害苍生。今特此更正:关于真值的讨论,尤其关于test测试字符串时的一些错误。还有莫名其妙的 -n 选...
  • guodongxiaren
  • guodongxiaren
  • 2014年08月05日 10:26
  • 3665

C++ 实现 算数表达式求值

好不容易抽出点时间来复习一下数据结构和算法。 看到堆栈部分。有2道题目,第一道是计算C系列括号匹配校验。第二道是计算算数表达式。 第一道题是思路是 跳过 ' ""字符串,/* // 注释以后。 ...
  • watsy
  • watsy
  • 2013年11月21日 20:22
  • 8995

栈的应用_简单表达式求值

#include "sqstack.cpp" #include "sqstack1.cpp" #include void trans(char *exp,char postexp[])     //...
  • qq_37388280
  • qq_37388280
  • 2017年10月24日 14:01
  • 164

['LeetCode']表达式求值

Eval Expression(栈)表达式求值是指给定一个表达式字符串,求得表达式最后的值。 例如给定表达式: 3 + 2 * (4 + 1) ,通过表达式求值后得到的值为13。这里之所以写Leet...
  • zjx409
  • zjx409
  • 2015年06月30日 14:55
  • 718

表达式求值(带括号和小数点)java和c++

最近准备在android上写一个计算器,发现技术太菜根本没法下手,因为不知道括号怎么弄,正好最近上了数据结构的课,发现了逆波兰表示法,于是就先用java写了个表达式求值,不过只能带括号和小数点...
  • wsadjklzxc
  • wsadjklzxc
  • 2015年03月28日 16:29
  • 1065

数据结构之---C语言实现栈的表达式求值(表达式树)

数据结构之---C语言实现栈的表达式求值(表达式树)
  • u012965373
  • u012965373
  • 2015年09月20日 22:44
  • 4961

栈的应用--递归与四则运算表达式求值

递归,是一个直接调用自己或通过一系列的调用语句间接的调用自己的函数。以斐波那契数列为例,对比其非递归和递归函数代码的区别,来让读者深刻了解递归的工作流程。四则运算表达式求值,是利用栈来完成四则运算,首...
  • dengpei187
  • dengpei187
  • 2016年07月11日 09:57
  • 985

c语言:表达式求值实现(包含加减乘除括号)

这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节,所以不能只停留在看懂的层面上,不去实践你永远不知道你到底掌握了没有,加油!   之前的表达式求值不包括括号运算,现将改进后的代码和源代码粘...
  • qq_28598203
  • qq_28598203
  • 2016年04月12日 09:50
  • 3536
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bash 运算表达式求值 test, [],[[]]
举报原因:
原因补充:

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