Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}
Linux-shell-算术运算{expr、bc、dc、(( ))和[ ]}
在Linux下做算术运算时你是如何进行的呢?是不是还在用expr呢?你会说我还会bc还有其它的呢!
闲话不多扯,干正事!
expr
expr在使用中要注意一些书写,如表达式中量和运算符号之间的空格及一些运算符号需要转义,还有一点需要记住,expr只适用于整数之间的运算!
表达式
expr的help文档中关于表达式部分如下:
ARG1 |& ARG2 若两边的值都不为0 或为空,则返回ARG1,否则返回 <<==!=>=>+-*/% ARG2 计算 ARG1 与ARG2 相除之余数
这一部分相信大家用的最多,也对这些比较了解了,下面我们用一个表达式来说明:
$ + - \* / + \( - \) \*
通过结果相信你已知道expr的计算规律,它与我们日常所理解的数学表达式一样,括号的优先级最高,然后是“*”、“/”,而且每个数或符号都需要用空格分隔,结果也是整数。
字符串
expr还可以对字符串进行操作:
match 字符串 表达式等于
1)match
expr中的expr match $string substring命令在string字符串中匹配substring字符串(substring字符串可以是正则表达式),然后返回匹配到的substring字符串的长度,若找不到则返回0。
下面我们来个实例:
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$ match .*
.*5匹配了6个字符。
2)substr
在shell中可以用{string:position}和{string:position:length}进行对string字符串中字符的抽取。第一种是从position位置开始抽取直到字符串结束,第二种是从position位置开始抽取长度为length的子串。而用expr中的expr substr $string $position $length同样能实现上述功能。
实例:
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$ ${str: --/ ::+][~-LTS- ╰_╯]$ ${str::--/ ::+][~-LTS- ╰_╯]$ substr
从中可以看出{string:position}和{string:position:length}从0开始计数,而expr substr $string $position $length从1开始。
3)index
expr中的expr index $string substring索引命令功能在字符串$string上找出substring中字符第一次出现的位置,若找不到则expr index返回0。注意它匹配的是字符而非字符串。
实例:
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$ index --/ ::+][~-LTS- ╰_╯]$ index
4)length
计算字符串的长度。我们可以用awk中的length(s)进行计算。我们也可以用echo中的echo ${#string}进行计算,当然也可以expr中的expr length $string 求出字符串的长度。
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$--/ ::+][~-LTS- ╰_╯]$ length
bc
重点来了!
bc是一种任意精度的计算语言,注意是一种语言,它提供了一些语法结构,比如条件判断、循环等,可以说是很强大的,但是我在实际中还没有找到需要这个用途的场合 。另外一个用途就是用来进行进制转换。
上面我们介绍的expr之支持整数运算,但对于浮点运算就无能为力了,而且expr不能进行指数运算,而都有bc这些都不再话下。
参数
我们先来了解几个有用的参数:
---q 进入bc交互模式时不再输出版本等多余的信息。
特殊变量
ibase,obase 用于进制转换,ibase是输入的进制,obase是输出的进制,默认是十进制;
scale 小数保留位数,默认保留0位。
交互模式
在shell命令行直接输入bc及能进入bc语言的交互模式。
$bc -l -/
=
/
=
^
*a()
非交互模式
bc也可以进行非交互式的运算,方法是与echo一起使用。
┌[--/ ::+][~-LTS- ╰_╯]$ |bc
--/ ::+][~-LTS- ╰_╯]$ |bc -l --/ ::+][~-LTS- ╰_╯]$ |bc
--/ ::+][~-LTS- ╰_╯]$ |
更多参考man文档!
dc
可能你曾经知道有此命令,也可能你还不知道。dc相比与bc要复杂,但是简单操作还是比较简单。简单的说dc是一直压栈操作,和bc一样,它也可以交互使用,或者与echo一起配合使用。
它也支持浮点运算。
但是现在我还没有想到这种压栈式算术运算有什么有点。
交互模式
┌[--/ ::+][~/-LTS-
-
-
*
-
/
-
+
*
还有其他命令如:
还有其它可以参考对应man文档。
非交互模式
一个算式让你就看的差不多了。
┌[--/ ::+][~/-LTS- ╰_╯]$ |
算式是:(4 * 3 + 2 - 1)。
是不是很简单!
(( )) & [ ]
这两个在shell中比较常见,这两个和expr命令有些类似,也是用于整数计算。
他们支持的运算符号有如下:
|+ ||&+ &&<
<=
==
!=
>=
>
+
-
*
/
%
带+号的两个运算符其实是shell支持的运算符。
这两个对与expr的优点是:运算符号全部不需要转义。
我们一味的在shell中用那些别人没用过的命令来做同一件事,但不要忘了(( ))和[ ]是shell中常见的,而且非常实用,但并非是你常用的!
实例:
┌[--/ ::+][~/-LTS- ╰_╯]$ $(( + --/ ::+][~/-LTS- ╰_╯]$ $(( * --/ ::+][~/-LTS- ╰_╯]$ $(( - ---/ ::+][~/-LTS- ╰_╯]$ $(( % --/ ::+][~/-LTS- ╰_╯]$ $[ % --/ ::+][~/-LTS- ╰_╯]$ $[ - ---/ ::+][~/-LTS- ╰_╯]$ $[ * --/ ::+][~/-LTS- ╰_╯]$ $[ +
评论暂时关闭