Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了 Linux shell编程 中的 字符串运算,今天我们研究 Linux shell编程的算术运算 ,为了方便举例,我们同时对expr命令进行介绍。
一、expr命令的用法
expr(evaluate expressions)命令是Unix/Linux中的一个命令行表达式计算工具,一般用于整数值计算,但也可用于字符串操作。 之些我们也在一些实例使用了这个命令,这次我们对这个命令作一个详细的介绍。
在Linux终端输入命令expr --help,可以查看expr命令的帮助信息。
user @host: ~ $ expr --help
用法:expr 表达式
或:expr 选项--help 显示此帮助信息并退出
--version 显示版本信息并退出将表达式的值列印到标准输出,分隔符下面的空行可提升算式优先级。
可用的表达式有: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 大于ARG2ARG1 + ARG2 计算 ARG1 与ARG2 相加之和
ARG1 - ARG2 计算 ARG1 与ARG2 相减之差ARG1 * ARG2 计算 ARG1 与ARG2 相乘之积
ARG1 / ARG2 计算 ARG1 与ARG2 相除之商
ARG1 % ARG2 计算 ARG1 与ARG2 相除之余数字符串 : 表达式 定位字符串中匹配表达式的模式
match 字符串 表达式 等于"字符串 :表达式"
substr 字符串 偏移量 长度 替换字符串的子串,偏移的数值从 1 起计
index 字符串 字符 在字符串中发现字符的地方建立下标,或者标0
length 字符串 字符串的长度
+ TOKEN interpret TOKEN as a string, even if it is a
keyword like 'match' or an operator like '/'( EXPRESSION ) value of EXPRESSION
请注意有许多运算操作符都可能需要由 shell 先实施转义。
如果参与运算的 ARG 自变量都是数字,比较符就会被视作数学符号,否则就是多义的。
模式匹配会返回"\"和"\"之间被匹配的子字符串或空(null);如果未使用"\"和"\",
则会返回匹配字符数量或是 0。若表达式的值既不是空也不是 0,退出状态值为 0;若表达式的值为空或为 0,
退出状态值为 1。如果表达式的句法无效,则会在出错时返回退出状态值 3。GNU coreutils online help: <http:///software/coreutils/>
请向<http:///team/zh_CN.html> 报告expr 的翻译错误
Full documentation at: <http:///software/coreutils/expr>
or available locally via: info '(coreutils) expr invocation'
已经说得非常详细了。
下面我结合算术运算符的实例来进一步加深对expr命令的认识。
二、Linux Shell脚本编程中的算术运算符
运算符 |
说明 |
+ |
加法 |
- |
减法 |
* |
乘法 |
/ |
除法 |
% |
取余 |
= |
赋值 |
== |
相等。用于比较两个数字,相同则返回 1(true),否则返回0(false)。 |
!= |
不相等。用于比较两个数字,不相同则返回 1(true),否则返回0(false)。 |
对于熟悉C/C++/Java/Javascrpt等语言的用户说,这些运算符很眼熟吧。 Linux Shell脚本编程中的算术运算符 与 C/C++/Java/Javascrpt等语言是相同的。
但是在具体应用上,Linux Shell脚本编程中有3点需要特别注意:
1.赋值运算符=
我们之前也强调过,赋值运算符=两边不能用空格分隔。
例如定义变量var1并初始化赋值为"abc",正确写法是var1="abc"。
user @host: ~ $ var1 = "abc"
var1:未找到命令
user @host: ~ $ var1="abc"
user @host: ~ $ echo $var1abc
user @host: ~ $
2.乘法运行符*
使用乘法运行符*时,通常要在它前面加上转意符/。
3.除了赋值运算符=外,其它运算符两侧均需要用空格与运算对象分隔。
我们结合下面的操作实例来体验。
三、Linux Shell算术运算操作实例
user @host: ~ $ d1=2
user @host: ~ $ d2=3
user @host: ~ $ echo `expr $d1 + $d2`
5
user @host: ~ $ echo `expr $d1 - $d2`
-1
user @host: ~ $ echo `expr $d1 * $d2`
expr: 语法错误
user @host: ~ $ echo `expr $d1 \* $d2`
6
user @host: ~ $ echo `expr $d1 / $d2`
0
user @host: ~ $ echo `expr $d1 % $d2`
2
user @host: ~ $ echo `expr $d1 == $d2`
0
user @host: ~ $ echo `expr $d1 != $d2`
1
user @host: ~ $ echo `expr $d1!=$d2`2!=3
user @host: ~ $
在上面的例子中,我们先后定义了变量d1和d2,并初始化赋值为2和3,然后对d1和d2分别进行加、减、乘、除、取余、相等 和不相等运算。
在进行乘法运算时,如果乘号*前面没有放转义符\,命令会出错:
expr: 语法错误
在最后一条命令
echo `expr $d1!=$d2`
中 不等于运算符!=和运算对象变量d1和d2之间没有放空格来间隔,!=被当成字符串原样输出:
2!=3
特别说明一点,上面实例中echo命令行中使用的是反引号,不是单引号。