zoukankan      html  css  js  c++  java
  • Bash脚本编程学习笔记03:算术运算

    简介

    Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence)、结合性(associativity)和值,详见Shell Arithmetic (Bash Reference Manual)

    注意:如果乘号“*”在某些场景中失效,有可能是它被解释成了通配符,可尝试对其转义。

    1+2=3

    在上面这个简单的算术运算中,1和2叫做操作数/运算元(operand),“+”加号叫做操作符/运算符(operator),1+2整个叫做算术表达式(arithmetic expression),对于算术表达式的求值过程叫做evaluate。

    在bash脚本编程中,变量的默认类型是字符串型,因此是无法直接执行算术运算的。

    [root@c7-server ~]# num1=3
    [root@c7-server ~]# num2=4
    [root@c7-server ~]# echo $num1+$num2
    3+4

    即便是使用declare命令显式声明变量为整型,也是不行的。

    [root@c7-server ~]# declare -i num1=3
    [root@c7-server ~]# declare -i num2=4
    [root@c7-server ~]# echo $num1+$num2
    3+4

    在bash中,想要支持算术运算有以下四种方式:

    方法一:内置命令let

    let arg [arg ...]

    每个arg,都是一个算术表达式。

    [root@c7-server ~]# num1=5
    [root@c7-server ~]# num2=10
    [root@c7-server ~]# let sum=$num1+$num2
    [root@c7-server ~]# echo $sum
    15

    一般都会使用一个变量来存储算术表达式的结果,let命令本身是不会将算术表达式的结果返回的。

    [root@c7-server ~]# let $num1+$num2
    [root@c7-server ~]#

    方法二:$[ARITHMETIC EXPRESSION]

    这种方式,马哥有提到,但是在bash的手册中似乎没找到。应该是一种非官方的方式,慎用。(后续在条件和循环结构体的博文中,涉及的算术运算很多都使用了这种方式,当时给忘记了,大家尽量避免使用这种方式)

    [root@c7-server ~]# sum=$[$num1+$num2]
    [root@c7-server ~]# echo $sum
    15

    方法三:Bash算术展开

    这个是bash自身支持的shell展开中的一种。Arithmetic Expansion (Bash Reference Manual)

    $(( ARITHMETIC EXPRESSION ))
    [root@c7-server ~]# sum=$(($num1+$num2))
    [root@c7-server ~]# echo $sum
    15

    方法四:外部命令expr

    需要使用命令替换的方式来赋值。

    [root@c7-server ~]# expr $num1 + $num2
    15
    [root@c7-server ~]# sum=$(expr $num1 + $num2)
    [root@c7-server ~]# echo $sum
    15

    操作符的两边需要有空格,不然操作符无法被正确解释。

    [root@c7-server ~]# expr $num1+$num2
    5+10

    总结

    内置命令let和shell展开中的算术展开是bash所自带的算术运算方式,比较推荐使用这类方式;外部命令expr是来自于CentOS所提供的程序包coreutils;最后的$[...]没有找到其来源,可以不使用它。

    在本实例中只展示了简单的加法运算,在实际使用当中会比较复杂,建议用户可使用一种方式(如算术展开)来熟练即可。

  • 相关阅读:
    numpy中linspace用法 (等差数列创建函数)
    Ubuntu环境下 matplotlib 图例中文乱码
    转载: 广义逆矩阵
    matplotlib.pyplot中add_subplot方法参数111的含义
    转载:(论文) 二次指数平滑法中确定初始值的简便方法
    图像处理之 opencv 学习---opencv 中的常用算法
    图像处理之 opencv 学习---矩阵的操作
    编译异常之static和extern---more than one storage class specified
    格式转换至yuv422转 yuv420
    阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写
  • 原文地址:https://www.cnblogs.com/alongdidi/p/bash_arithmetic_expression.html
Copyright © 2011-2022 走看看