Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}
Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}
在Linux下做算术运算时你是如何进行的呢?是不是还在用expr呢?你会说我还会bc还有其它的呢!
闲话不多扯,干正事!
1expr
expr在使用中要注意一些书写,如表达式中量和运算符号之间的空格及一些运算符号需要转义,还有一点需要记住,expr只适用于整数之间的运算!
1.1表达式
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 \) \* 2
11
通过结果相信你已知道expr的计算规律,它与我们日常所理解的数学表达式一样,括号的优先级最高,然后是“*”、“/”,而且每个数或符号都需要用空格分隔,结果也是整数。
1.2字符串
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" .*5
6

.*5匹配了6个字符。
2)substr
在shell中可以用{string:position}和{string:position:length}进行对string字符串中字符的抽取。第一种是从position位置开始抽取直到字符串结束,第二种是从position位置开始抽取长度为length的子串。而用expr中的expr substr stringstringposition $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 3
456

从中可以看出{string:position}和{string:position:length}从0开始计数,而expr substr stringstringposition $length从1开始。
3)index
expr中的expr index stringsubstring索引命令功能在字符串stringsubstring索引命令功能在字符串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" b
0
┌[2013-08-24/7.18 15:37:08]
├[14+1][~]
└[snowsolf@Ubuntu-LTS-1 ╰_╯]$expr index "$str" 9
11

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

┌[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

2bc
重点来了!
bc是一种任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,但是我在实际中还没有找到需要这个用途的场合 。另外一个用途就是用来进行进制转换。
上面我们介绍的expr之支持整数运算,但对于浮点运算就无能为力了,而且expr不能进行指数运算,而都有bc这些都不再话下。
2.1参数
我们先来了解几个有用的参数:
-i 强制交互模式; -l 使用bc的内置库,bc里有一些数学库,对三角计算等非常实用; -q 进入bc交互模式时不再输出版本等多余的信息。
2.2特殊变量
ibase,obase 用于进制转换,ibase是输入的进制,obase是输出的进制,默认是十进制;
scale 小数保留位数,默认保留0位。
2.3交互模式
在shell命令行直接输入bc及能进入bc语言的交互模式。

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

2.4非交互模式
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"|bc
101010111100

更多参考man文档!
3dc
可能你曾经知道有此命令,也可能你还不知道。dc相比与bc要复杂,但是简单操作还是比较简单。简单的说dc是一直压栈操作,和bc一样,它也可以交互使用,或者与echo一起配合使用。
它也支持浮点运算。
但是现在我还没有想到这种压栈式算术运算有什么有点。
3.1交互模式

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

还有其他命令如:

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

还有其它可以参考对应man文档。
3.2非交互模式
一个算式让你就看的差不多了。
┌[2013-09-16/8.12 20:47:43]
├[7+10][~/shell]
└[snowsolf@Ubuntu-LTS-1 ╰_╯]$echo "4 3 * 2 + 1 -p"|dc
13
算式是:(4 * 3 + 2 - 1)。
是不是很简单!
4(( )) & [ ]
这两个在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

Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}的更多相关文章
- linux shell let, expr 命令详解
linux命令之let.exprshell程序中的操作默认都是字符串操作,在运行数学运算符的时候可能得到意想不到的答案: var=1var=$var+1echo $var 将输出 1+1从这个例子中可 ...
- Linux shell 整数运算 let [ ] (( )) expr以及 浮点数 bc用法(转)
Abstract : 1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算:2)Linux shell 中使用 expr 与 b ...
- Linux shell 变量 数学 运算
Abstract : 1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算: 2)Linux shell 中使用 expr 与 ...
- linux shell脚本之-变量极速入门与进阶(2)
1,$$:显示当前的进程id号 ghostwu@dev:~/linux/shell/how_to_use_var$ cat show_pid.sh #!/bin/bash echo $$ ghostw ...
- linux shell expr 使用
linux shell expr 使用 收藏人:春秋百味 -- | 阅: 转: | | 分享 非原创, 摘自:<LINUX与UNIX Shell编程指南> 17.5 expr用法 expr ...
- Linux shell命令中expr
在Linux shell命令中expr虽然不是很起眼,但是它的作用是非常大的!到目前为止,我个人看来最大的作用就是两个——四则运算和字符串的操作. 先说四则运算,在Shell中四则运算不能简简单单的加 ...
- 阿里Linux Shell脚本面试25个经典问答
转载: 阿里Linux Shell脚本面试25个经典问答 Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命 ...
- shell算术运算与进制运算
(())与let是等效的 arithmetic expression type 与[是等效的 source与.是等效的 其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“b ...
- linux shell & bash
shell & bash shell指允许用户通过文本操作计算机的程序. interactive shell:从是否通过标准输入输出与用户进行交互的角度分为交互式shell(interacti ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
随机推荐
- maven中项目发布jar包不同步
昨天的项目今天运行的时候突然发现今天就不能运行了 严重: Error configuring application listener of class org.springframework.web ...
- java web 程序---猜数字游戏的猜了多少次的代码
思路:用setAttribute()放 ,然后直接输出 Integer str=(Integer)session.getAttribute("count"); int num3= ...
- Web页面获取用户控件页面中服务器控件的值
用户控件页面后台: public string P_Name{get { return txt_P_name.Value; }set { txt_P_name.Value = value; }} We ...
- AIX存储LV PV VG (转载)
1.基本概念:PV 物理卷:普通的直接访问的存储设备,有固定的和可移动的之分,代表性的就是硬盘.vg 卷组:AIX中最大的存储单位,一个卷组由一组物理硬盘组成,也就是由一个或多个物理卷组成.pp 物理 ...
- OD 实验(十五) - 对一个程序的逆向
程序: 打开程序 出现一个 NAG 窗口 这是主界面 点击 Exit 程序出现 NAG 窗口,然后退出 用 PEiD 看一下 是用 VC++ 6.0 写的程序 逆向: 用 OD 载入程序 跑一下程序 ...
- Fiddler监控面板显示ServerIP栏(Fiddler v5.0)
Fiddler监控面板默认没有ServerIP这一栏,添加此栏方法如下: 1.点击Rules下的Customize Rules.js,会打开Fiddler ScriptEditor 2.在脚本中添加对 ...
- Cobalt strike 第二节生成报告
0x00前言: 上一节我们说了怎么连接到服务器 0x01生成报告: 首先打开Cobalt Strike 点击Cobalt Strike -> Preferences Preferences Pe ...
- [转] C#调用外部DLL
原文地址 每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主要是基于win 32平台开发的DLL,ac ...
- python学习——练习题(13)
""" 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个" ...
- python开发最受欢迎的十款工具
python开发最受欢迎的十款工具 dreamyla3个月前 今天小编给正在学习python开发的朋友介绍十款最受欢迎的开发工具,因为在学习python开发过程中少不了IDE或者代码编辑器,想要提高开 ...