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



-----参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值