可以把数值计算的相关命令分为三类:
1、是计算表达式的值:expr
2、整数算术运算:let 或 ((…))
3、修改变量的类型,然后直接运算
一:计算表达式的值
命令:expr
功能:expr命令可以做字符串比较操作和计算表达式的值。
其中,expr命令的字符串比较操作基本被[[…]]结构代替。不过,expr的另一个功能,计算整数表达式的值,还是会经常用到的。
expr命令支持的整数算术运算表达式格式:
① 求和
expr exp1 + exp2
注意:各项中间必须要有空格,下同↓↓↓
② 求差
expr exp1 – exp2
③ 求积
expr exp1 \* exp2
注意求积表达式的区别,在“*”前要加转义符号“\”
④ 求商
expr exp1 / exp2
⑤ 取余
expr exp1 % exp2
举例:
function_testTwo( )
{
i=1
echo `expr $1 + 8` >>test7 #需要注意的是expr命令中的变量需要进行引用;$1 是引用位置参数。
echo $1
echo `expr $i + 1` >>test7 #同时变量i也需要进行引用
}
注意:expr $1 + 8这是一句命令,如果想要引用这个命令的结果,则必须用命令替换来获取命令的输出。可以通过反引号或者$(…)来进行命令替换。
二:计算算术表达式
命令:let 或 ((…))
注意区分结构:“((…))”与“[[…]]”。前者是计算整数表达式命令,后者是测试命令test的简写:点击打开链接
支持的命令:
① 求和
let var=exp1+exp2
let “var=exp1+exp2”
((var = exp1 + exp2))
分析:三种写法,结果完全一样。同时,第一种写法,整数算术表达式之间决不能有空格。剩下两种写法,在任何地方加不加空格没区别,包括等号两边,下同 ↓↓↓
② 求差
let var=exp1-exp2
③ 求积
let var=exp1*exp2
④ 求商
let var=exp1/exp2
⑤ 取余
let var=exp1%exp2
除了上述五种算术运算之外,let和((…))结构还支持+=、-=、*=、/=、%=,就不一一罗列了,基本差不多写法。
三、两种的区别:
expr命令相对于let或((…))命令来说的区别:
1、不同一:对象不是太一样:一个是表达式,一个是算术表达式(有等号)
expr命令是计算表达式的值,并返回表达式最终的计算结果。
虽然let和((…))命令也可以计算表达式的值,但是,并不会返回表达式的计算结果,而是返回的是一种出口状态。如果表达式的计算结果为0,则出口状态为1;表达式的计算结果非0,出口状态为0。点击打开链接
举例:
(( 5+5 ))
echo "The status is $?"
分析:((5+5))最终不会有标准输出的产生,伴随的只有一个是否成功的出口状态。
上面这个例子的出口状态为0,如果是((5>9)),则出口状态为1。
总结来说就是:let和((…))命令的计算表达式功能一般没用,expr用来计算并返回表达式的最终结果。
反过来同样适用,let和((…))命令主要用来计算等式,而expr命令并不能。所以,let和((…))命令与expr命令的分工还是挺明确的。
不过其实可以通过((…))得到表达式的值,不过需要与$符号一起使用:$(( expression ))
比如:i=$(( i+1 )),和i=$( expr $i + 1 )或i=`expr $i + 1` (反引号),结果一样。
2、不同二:写的有点不一样
expr expression 与 let var=expression 或 ((var=exprssion))
expr的expression中的变量需要通“$”来引用才可以正常使用,但是在let和((…))结构中不需要,可以直接对变量进行操作。
并且expr中的expression各项必须要有空格,而let和((…))结构如果"var=expression",加了双引号,则中间怎么写都无所谓。
四、修改变量的类型,然后直接运算
通过typeset或declare命令进行变量声明:
如果把变量声明为了整数变量,则可以直接执行算术运算,而不需要使用expr或let命令。
如果不通过typeset或declare命令对变量进行声明,则shell将会把赋予变量的值看做字符串。所以才有expr或let命令进行执行。
使用typeset把变量声明成整型:-i
① 脚本举例test.sh:
typeset -i number=3
number=number/3
echo $number
number=6/3
echo $number
输出:3 2
分析:输出的为,直接计算的结果
如果没有对变量类型进行声明:
② 脚本举例test.sh:
number=3
number=number/3
echo $number
输出:number/3
分析:因为在number=number/3这一句,没有对number进行变量引用,而是作为了number/3字符串的一部分。
③ 脚本举例test.sh
number=3
number=$number/3
echo $number
输出:3/3
④ 脚本举例test.sh:
number=6/3
echo $number
输出:6/3
总结:
在上述四个例子中,只有例1对变量进行了整型声明,也只有例1的表达式是直接计算得到了结果,剩下的三个例子,均没有计算,而是作为字符串进行处理。
typeset命令也可以设置变量的权限,比如修改为只读
typeset -r var
这样可以保证那些重要的不会变的参数,能够不被误修改。一般用declare的较多,可以help declare进行查看。