转载 http://www.th7.cn/system/lin/201309/44683.shtml

expr bc

在Linux下做算术运算时你是如何进行的呢?是不是还在用expr呢?你会说我还会bc还有其它的呢!

闲话不多扯,干正事!

expr

expr在使用中要注意一些书写,如表达式中量和运算符号之间的空格及一些运算符号需要转义,还有一点需要记住,expr只适用于整数之间的运算!

表达式

expr的help文档中关于表达式部分如下:

  ARG1 | ARG2       若ARG1 的值不为0 或者为空,则返回ARG1,否则返回ARG2   ARG1 & ARG2       若两边的值都不为0 或为空,则返回ARG1,否则返回 0   ARG1 < ARG2       ARG1 小于ARG2  ARG1 <= ARG2      ARG1 小于或等于ARG2  ARG1 = ARG2       ARG1 等于ARG2  ARG1 != ARG2      ARG1 不等于ARG2  ARG1 >= ARG2      ARG1 大于或等于ARG2  ARG1 > ARG2       ARG1 大于ARG2   ARG1 + ARG2       计算 ARG1 与ARG2 相加之和  ARG1 - ARG2       计算 ARG1 与ARG2 相减之差   ARG1 * ARG2       计算 ARG1 与ARG2 相乘之积  ARG1 / ARG2       计算 ARG1 与ARG2 相除之商  ARG1 % ARG2       计算 ARG1 与ARG2 相除之余数

这一部分相信大家用的最多,也对这些比较了解了,下面我们用一个表达式来说明:

$expr 9 + 8 - 7 /* 6 / 5 + /( 4 - 3 /) /* 211

通过结果相信你已知道expr的计算规律,它与我们日常所理解的数学表达式一样,括号的优先级最高,然后是“*”、“/”,而且每个数或符号都需要用空格分隔,结果也是整数。

字符串

expr还可以对字符串进行操作:

  match 字符串 表达式等于"字符串 :表达式"  substr 字符串 偏移量 长度替换字符串的子串,偏移的数值从 1 起计  index 字符串 字符在字符串中发现字符的地方建立下标,或者标0  length 字符串字符串的长度

1)match

expr中的expr match $string substring命令在string字符串中匹配substring字符串(substring字符串可以是正则表达式),然后返回匹配到的substring字符串的长度,若找不到则返回0。

下面我们来个实例:

┌[2013-08-24/7.18  15:00:01]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$str="123 456 789"┌[2013-08-24/7.18  15:00:30]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$expr match "$str" .*56

.*5匹配了6个字符。

2)substr

在shell中可以用{string:position}和{string:position:length}进行对string字符串中字符的抽取。第一种是从position位置开始抽取直到字符串结束,第二种是从position位置开始抽取长度为length的子串。而用expr中的expr substr $string $position $length同样能实现上述功能。

实例:

┌[2013-08-24/7.18  15:19:17]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$str="123 456 789"┌[2013-08-24/7.18  15:19:31]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo ${str:5}56 789┌[2013-08-24/7.18  15:19:59]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo ${str:5:3}56┌[2013-08-24/7.18  15:20:07]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$expr substr "$str" 5 3456

从中可以看出{string:position}和{string:position:length}从0开始计数,而expr substr $string $position $length从1开始。

3)index

expr中的expr index $string substring索引命令功能在字符串$string上找出substring中字符第一次出现的位置,若找不到则expr index返回0。注意它匹配的是字符而非字符串。

实例:

┌[2013-08-24/7.18  15:35:19]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$str="123 456 789"┌[2013-08-24/7.18  15:37:02]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$expr index "$str" b0┌[2013-08-24/7.18  15:37:08]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$expr index "$str" 911

4)length

计算字符串的长度。我们可以用awk中的length(s)进行计算。我们也可以用echo中的echo ${#string}进行计算,当然也可以expr中的expr length $string 求出字符串的长度。

┌[2013-08-24/7.18  15:39:39]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$str="123 456 789"┌[2013-08-24/7.18  15:39:52]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo ${#str}11┌[2013-08-24/7.18  15:39:57]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$expr length "$str"11

bc

重点来了!

bc是一种任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,但是我在实际中还没有找到需要这个用途的场合 。另外一个用途就是用来进行进制转换。

上面我们介绍的expr之支持整数运算,但对于浮点运算就无能为力了,而且expr不能进行指数运算,而都有bc这些都不再话下。

参数

我们先来了解几个有用的参数:

-i 强制交互模式;-l 使用bc的内置库,bc里有一些数学库,对三角计算等非常实用;-q 进入bc交互模式时不再输出版本等多余的信息。

特殊变量

ibase,obase 用于进制转换,ibase是输入的进制,obase是输出的进制,默认是十进制;

scale 小数保留位数,默认保留0位。

交互模式

在shell命令行直接输入bc及能进入bc语言的交互模式。

$bc -l -q4/3                           /*未指定精度默认保留整数*/1scale=5                   /*指定精度为5*/4/31.33333ibase=2                    /*指定进制转换的输入机制为二进制,输出默认为是十进制*/1010104^2                           /*指数运算,注:指数不能为浮点数*/164*a(1)                        /*计算π值,a()是个函数:arctan(),好吧,老师教的都被狗吃了,π值是等于四倍的arctan(1)么?*/3.14159265358979323844quit                            /*退出*/

非交互模式

bc也可以进行非交互式的运算,方法是与echo一起使用。

┌[2013-08-24/7.18  18:42:27]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo "scale=5;9+8-7*6/5^2"|bc          /*优先级^ > *、/ > +、- */15.32000┌[2013-08-24/7.18  18:45:35]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo "s(2/3*a(1))"|bc -l                         /*还记得sina(30°)等于0.5么?皇上! ^_^*/.49999999999999999998┌[2013-08-24/7.18  18:49:13]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo "scale=5;sqrt(15)"|bc                   /*开方*/3.87298┌[2013-08-24/7.18  18:49:18]├[14+1][~]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo "ibase=16;obase=2;ABC"|bc101010111100

更多参考man文档!

dc

可能你曾经知道有此命令,也可能你还不知道。dc相比与bc要复杂,但是简单操作还是比较简单。简单的说dc是一直压栈操作,和bc一样,它也可以交互使用,或者与echo一起配合使用。

它也支持浮点运算。

但是现在我还没有想到这种压栈式算术运算有什么有点。

交互模式

┌[2013-09-16/8.12  20:33:53]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$dc23-p      /*输出(3 - 2)*/-14*p          /*输出(-1 * 4)*/-42/p       /*输出(-4 / 2)*/-23.4+p      /*输出(-2 + 3.4)*/1.44d        /*复制栈顶值*/*p         /*输出(4 * 4)16q         /*退出*/

还有其他命令如:

c           清除压栈d           复制栈顶的值p           输出栈顶值q           退出交互模式

还有其它可以参考对应man文档。

非交互模式

一个算式让你就看的差不多了。

┌[2013-09-16/8.12  20:47:43]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo "4 3 * 2 + 1 -p"|dc13

算式是:(4 * 3 + 2 - 1)。

是不是很简单!

(( )) & [ ]

这两个在shell中比较常见,这两个和expr命令有些类似,也是用于整数计算。

他们支持的运算符号有如下:

 |    位或+ ||   若前后两者都不为0,则返回1,否则返回0 &  位与+ &&  若前者为0,不再对后者进行处理,否则对后者处理,后者不为0时返回1 <  <= == != >= >  +  -  *  /  % 

带+号的两个运算符其实是shell支持的运算符。

这两个对与expr的优点是:运算符号全部不需要转义。

我们一味的在shell中用那些别人没用过的命令来做同一件事,但不要忘了(( ))和[ ]是shell中常见的,而且非常实用,但并非是你常用的!

实例:

┌[2013-09-16/8.12  20:47:51]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $(( 2 + 5 ))7┌[2013-09-16/8.12  21:11:14]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $(( 2 * 5 ))10┌[2013-09-16/8.12  21:11:19]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $(( 2 - 5 ))-3┌[2013-09-16/8.12  21:11:23]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $(( 2 % 5 ))2┌[2013-09-16/8.12  21:11:29]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $[ 2 % 5 ]2┌[2013-09-16/8.12  21:11:45]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $[ 2 - 5 ]-3┌[2013-09-16/8.12  21:11:50]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $[ 2 * 5 ]10┌[2013-09-16/8.12  21:11:55]├[7+10][~/shell]└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo $[ 2 + 5 ]7

shell 计算2的更多相关文章

  1. shell计算小问题

    1.shell处理两数相加时报错: req_all=$(($hits+$misses)) error: invalid arithmetic operator (error token is &quo ...

  2. shell 计算

    1.整数计算 n=$((/)) echo $n 输出 2(注意必须是两个括号) exper / / 注意这里不支持括号,a%b,a/b后取余 output: 1 2.小数计算 bc <<& ...

  3. Linux shell 计算两个文件的并集、交集、差集

    假设我们现在有两个文件 a.txt .b.txt a.txt 中的内容如下: a c 1 3 d 4 b.txt 中的内容如下: a b e 2 1 5 # Example 01 计算并集: [roo ...

  4. shell 计算时间差

    #!/bin/bash #date_5='awk 'BEGIN{print strftime("%H:%M",(systime()-300))}'' #ps -ef | grep ...

  5. shell 计算文件交并差

    交集 $ sort a b | uniq -d 并集 $ sort a b | uniq 差集a-b $ sort a b b | uniq -u 文件乱序 cat tmp.txt | awk 'BE ...

  6. Linux Shell 计算脚本执行过程用了多长时间

    #!/bin/bash starttime=`date +'%Y-%m-%d %H:%M:%S'` #执行程序 endtime=`date +'%Y-%m-%d %H:%M:%S'`start_sec ...

  7. shell中的调试与计算

    shell 计算  2.正确方法   1)使用let   var=1   let "var+=1"   echo $var   输出结果为2,这次没有悲剧   注意:   a)经我 ...

  8. shell,计算指定行的和,计算指定列的和

    有一个文本文件,里面某行某列为数字,那么如何用shell计算指定行(列)的和,方法如下 计算指定行的和: awk 'NR==3{for(i=1;i<=NF;i++)sum=sum+$i;}END ...

  9. shell编程总结

    一.学习 shell脚本之前的基础知识 [linux shell中的特殊符号] 1. * :代表零个或多个字符或数字. test后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来. 2. ...

随机推荐

  1. CentOS中的环境变量配置文件

    CentOS的环境变量配置文件体系是一个层级体系,这与其他多用户应用系统配置文件是类似的,有全局的,有用户的,有shell的,另外不同层级有时类似继承关系.下面以PATH变量为例. 1.修改/etc/ ...

  2. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

  3. 安装Ubuntu的那些事儿

    这是博主第一次写博客,本人虽然目前就读的专业属计算机,但目前也是属于新手上路的那一类人.正好不久前解决了一个困扰了我很久的问题 ,现在拿出来给大家分享一下. 上个学期学校的工作室给大家集中普及linu ...

  4. 腾讯php经历

    12年毕业至今,一年C#,2年php,几个月node,因为一些原因再次离职,接到腾讯互娱的php面试电话,匆匆准备了一番,便去了科兴科技园腾讯的高大上办公楼. 1.笔试 试题大部分网上都有,例如: 用 ...

  5. Android Studio导入github下载的project和module

    前言:我们以前eclispe时代, 经常都是跑到github浏览第三方开源资源,然后下载下来,运行一下sample之类的,学习没有接触的第三方安卓库,但是到了Android Studio,在githu ...

  6. C#递归遍历子目录与子目录中的文件

    [转载]作者:weixingstudio 采用C#,通过指定一个路径,来递归的遍历所有的子目录以及子目录中的文件,建一个类似资源管理器的目录树 先递归的遍历所有的子目录,如果没有子目录以后,则遍历所有 ...

  7. [No0000A7]批处理经常用到的变量及批处理>NUL详细介绍

    绝对路径是指调用绝对的程序位置的路径,例如: start C:\Windows\test.exe 相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如: start %WINDIR%\te ...

  8. BZOJ1500[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  9. CentOS 7搭建SVN服务器

    安装步骤如下: 1.yum install subversion 2.查看安装版本 svnserve --version 3.创建SVN版本库目录 mkdir -p /var/svn/svnrepos ...

  10. h5+mui

    参考链接http://blog.csdn.net/tbwood/article/details/42081861 待补充