shell 中的算术运算

工作中经常会写一些shell脚本来完成任务,在编写shell的过程中常常涉及一些算术运算,下面我就对经常用到的几种算术运算命令做简单的总结。

  常用的算术运算命令有 expr , bc,let,$(())

 

1.  let

  let 命令是我在shell中用到最多的一个命令,它简单易用,支持自加自减操作。我经常用它在for和while循环中实现整数值的加一操作。

  需要注意的一点是,我们知道shell中的变量需要加$符号的,但是在用到let命令的时候,变量前是不需要加$的


 

[bazar@test /home/bazar]$a=5

[bazar@test /home/bazar]$let a=a+5

[bazar@test /home/bazar]$echo $a

10

[bazar@test /home/bazar]$let a++

[bazar@test /home/bazar]$echo $a

11

[bazar@test /home/bazar]$let a--

[bazar@test /home/bazar]$echo $a

10

[bazar@test /home/bazar]$let a+=3

[bazar@test /home/bazar]$echo $a

13

[bazar@test /home/bazar]$let a=a+0.5

-bash: let: a=a+0.5: syntax error: invalid arithmetic operator (error token is ".5")

[bazar@test /home/bazar]$

可以看到let是不支持浮点运算的,通过help let来看下let的详细功能


 

id++, id-- variable post-increment, post-decrement

++id, --id variable pre-increment, pre-decrement

-, + unary minus, plus

!, ~ logical and bitwise negation

** exponentiation

*, /, % multiplication, division, remainder

+, - addition, subtraction

<<, >> left and right bitwise shifts

<=, >=, <, > comparison

==, != equality, inequality

& bitwise AND

^ bitwise XOR

| bitwise OR

&& logical AND

|| logical OR

expr ? expr : expr

conditional operator

=, *=, /=, %=,

+=, -=, <<=, >>=,

&=, ^=, |= assignment

 

通过help信息可以看到,let除了支持整数的加减乘除,还支持逻辑运算和位操作等(又涨姿势了:))。

 

2.  expr 

  这又是一个很常用的命令。

  expr 也一般用于整数值的运算,如:

 


 

[bazar@test /home/bazar]$expr 10 + 10

20

[bazar@test /home/bazar]$b=20

[bazar@test /home/bazar]$c=`expr $b + 5`

[bazar@test /home/bazar]$echo $c

25

[bazar@test /home/bazar]$d=`expr $b \* 5 + 10`

[bazar@test /home/bazar]$echo $d

110

[bazar@test /home/bazar]$d=`expr $d \/ 2 - 5`

[bazar@test /home/bazar]$echo $d

50

使用expr的时候需要注意两点:

1.操作数运算符间用空格隔开,否则报错

2.使用*和/的时候需要转义下

 

  但是expr的另外一个强大的功能是字符串操作,如:


 

1.获取字符串长度

str="abcd"

expr length $str

echo ${#str}

expr "$str" : ".*"

 

2.查找子串的位置

str="abc"

expr index "$str" "a" #返回1

expr index "$str" "b" #返回2

expr index "$str" "x" #返回0

expr index "$str" "" #返回0

 

3.选取子串

str="abcdef"

i=5

expr substr "$str" 1 3 # 从第一个位置开始取3个字符, abc

expr substr "$str" 2 "$i" # 从第二个位置开始取5个字符, bcdef

expr substr "$str" 4 "$i" # 从第四个位置开始取5个字符, def

 expr的详细使用说明请使用 man expr 查看

 

  另外想说的一点是,在想了解任何一个新命令或者软件的时候,我们最先去查的应该是他的帮助信息或者帮助文档,因为只有命令的实现者是最清楚该命令的功能的。

 

3. $((operation))


 

[bazar@test /home/bazar]$a=1

[bazar@test /home/bazar]$b=4

[bazar@test /home/bazar]$d=$((a+b))

[bazar@test /home/bazar]$echo $d

5

这种方法一般用在for和while循环中的计数变量上,不经常用,在别人的脚本中看到过这种写法

 

4. bc

  以上几个命令都是不支持浮点运算的,但是bc不但可以支持浮点运算,它还支持一些更高级的其他操作,如:


 

[bazar@test /home/bazar]$echo "1.22 * 3.71"

1.22 * 3.71

[bazar@test /home/bazar]$echo "1.22 * 3.71"|bc

4.52

[bazar@test /home/bazar]$echo "1.223 * 3.71"|bc

4.537

 可以看到,在进行浮点运算的时候,结果的默认精度与输入的操作数有关,但是是可以设置的。


 

[bazar@test /home/bazar]$echo "scale=4; 1.223 * 3.71"|bc #scale设定小数精度

4.5373

[bazar@test /home/bazar]$echo "scale=5; 1.223 * 3.71"|bc

4.53733

[bazar@test /home/bazar]$echo "scale=3; 8 / 3"|bc

2.666

 

进制转换


 

[bazar@test /home/bazar]$n=7

[bazar@test /home/bazar]$echo "obase=2; ${n}"|bc

111

[bazar@test /home/bazar]$n=8

[bazar@test /home/bazar]$echo "obase=2; ${n}"|bc

1000

[bazar@test /home/bazar]$b=1010100000

[bazar@test /home/bazar]$echo "obase=10; ibase=2; ${b}"|bc #ibase入参进制,obase输出进制

672

[bazar@test /home/bazar]$echo "obase=16; ibase=2; ${b}"|bc

2A0

[bazar@test /home/bazar]$c=2AB

[bazar@test /home/bazar]$echo "obase=10; ibase=16; ${c}"|bc

683

 

幂运算


 

[bazar@test /home/bazar]$d=100

[bazar@test /home/bazar]$echo "sqrt(${d})"|bc

10

[bazar@test /home/bazar]$echo "10^3"|bc

1000

 

当然bc还支持其他更复杂的运算,这里就不一一列举。只要在写脚本遇到数学运算的时候知道哪些命令可以实现就可以了,具体使用方法到时候再查帮助文档。

 

能够实现数学运算的不止这几个命令,awk,sed等同样可以。

 

另外的一个小技巧就是,在写脚本时我们可能会遇到判断入参或者变量是不是一个数值,一个比较好的方法就是用入参或者变量与0相加,通过返回状态来判断,如:


 

#!/bin/bash

 

##判断入参是不是数字

expr ${1} + 0 >/dev/null 2>&1

 

if [ $? -eq "0" ];then

echo "参数是数字"

else

echo "参数不是数字"

fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值