Linux shell脚本数值计算个人心得

Linux shell脚本数值计算个人心得


本篇博客为,个人对与bash数值计算的一些心得与用法。

Bash对于数值是没有明确定义的,在shell里面所有的数值都默认为字符串,并不是单纯的数值。

比如:a=1+2,a并不等于3,而是等于字符串1+2。

整数计算:

整数计算为整数型的数值加减乘除,没有浮点数的数值,就算浮点数的数值进行加减也会忽略小数点后面的数值。

表达式计算方法:

表达式1:$[EXPRESSION]

表达式2:$((EXPRESSION))

[ ] 和 (( )) 也被称为运算符

表达式的运算符两边可以有空格。例如: [a + b]

例子

    输入:
       a=1
       b=1
       c=2
       
       d=$[$a+$b]
       e=$(($b+$c))
       f=$[$d + $b]
       g=$(($e + $c))
       
       echo "$d"
       echo "$e"
       echo "$f"
       echo "$g"
        
    输出:
            + echo d=2
            d=2
            + echo e=3
            e=3
            + echo f=3
            f=3
            + echo g=5
            g=5

表达式计算方式可以在运算符两边拥有空格。

注意:表达式1与bash的测试条件比较相似,但是bash的测试条件是中括号两边有空格而不表达式两边。

测试条件:中括号两边需要空格

[ $a>$b ]

表达式1:运算符两边可以有空格

[a + b]

命令的计算方式:

命令1:let

命令2:expr

命令3:bc

let命令计算:

格式:    let var=$a+$b

let的计算只能计算整数不能计算浮点数,如果是浮点数进行计算的话,也会忽略小数后面的数字。

例如
    输入:
            a=1
            b=1
            c=2
    输出:  
            let d=$a+$b
            echo "d=$d"
            let g=$c-$b
            echo "g=$g"
            let e=$c*$c+$a
            echo "e=$e"

注意:let必须是完整的算术表达式,即有等号两边不能有空格,与上面的表达式不同,切记。

expr计算:

格式1:    var=` expr $a+$b`

格式2:    var=$(expr $a+$b)

$( )等同于` `(这是反引号)

$( )与测试条件中的( )有些相似,但是测试条件中的( )是没有$符号在前面的,需要注意。

expr的加减乘除:    乘号需要用反斜杠来进行转意

+

-

\*

/

expr与let的区别在于expr只计算等号右边的运算表达式,然后将得出的数值复制给变量,let为将整个表达式包涵起来进行计算。不过运算能力等都一样。

注意:expr与let有一点特别需要注意的不同是let的运算符两边不能有空格,而expr的运算符两边必须要有空格。

例如
    
    输入
            a=1
            b=1
            c=2
            
            d=`expr $a+$b`
            echo "d=$d"
            e=$(expr $a+$c)
            echo "e=$e"
            g=`expr $a*$c+$b`
            echo "g=$g"
    
    输出
            ++ expr 1 + 1
              + d=2
              + echo d=2
            d=2
            ++ expr 1 + 2
            + e=3
            + echo e=3
            e=3
            ++ expr 1 ‘*‘ 2 + 1
            + g=3
            + echo g=3
            g=3

expr与let差不多,一般用let比较多,expr的运算能力虽然和let一样,但是expr为外部组件与let内置还是有点运算数度的差别的。

浮点数计算:

bc计算:

bc为一个强大的计算工具,也是外部组件,但是bc可以进行浮点数的计算,并且可以进行进制转换

格式:

echo "scale=2;$a+$b" | bc

浮点运算,有一个很重要的概念就是精度。bc这里的精度指的的是小数的位数。在使用bc来进行除法运算的时候,你会发现默认是取整的,即没有小数部分。所以bc有个参数为scale,这个参数专门用来确定小数点后几位的位数的,需要多少位的小数,就设置为多少位。

注意:只有除法运算的时候才会取整。

例子1:    在命令行进行整数加法
    
        输入
                [[email protected] ~]# echo "1+2" | bc
        输出
                3
         
         
例子2:    在命令行进行浮点数加法
        输入
                [[email protected] ~]# echo "scale=3;1.1254+2.452" | bc
        输出
                3.5774
                
例子3:    用脚本进行计算
          输入
                a=1.455
                b=1.97
                c=2.354
                
                浮点数加法
                d=`echo "$a+$b" | bc`
                echo "d=$d"
                
                浮点数乘法
                e=$(echo "$a*$b" | bc)
                echo "e=$e"
                
                浮点数除法,带scale参数
                f=`echo "scale=3;$a/$b" | bc`
                echo "f=$f"
                
                浮点数除法,不带scale参数
                g=$(echo "$a/$b" | bc)
                echo "g=$g"

        输出
                        浮点数加法输出结果
                ++ bc
                ++ echo 1.455+1.97
                + d=3.425
                + echo d=3.425
                d=3.425
                
                浮点数乘法输出结果
                ++ bc
                ++ echo ‘1.455*1.97‘
                + e=2.866
                + echo e=2.866
                e=2.866
                
                浮点数除法,带scale参数输出结果
                ++ bc
                ++ echo ‘scale=3;1.455/1.97‘
                + f=.738
                + echo f=.738
                f=.738
                
                浮点数除法,不带scale参数输出结果
                ++ bc
                ++ echo 1.455/1.97
                + g=0
                + echo g=0
                g=0

由以上的输出结果可以验证bc进行加减乘除计算的时候,只有除法是在不带scale参数的时候不会取小数位的说法。

自加自减计算:

自加自减是比较简单的一个计算

以上所有的计算方式都可以进行自加自减,因此这边就直接给出事例。

表达式1:   
                    输入
                            a=1
                            
                            自加1
                            a=$[$a+1]
                            echo "a++: $a"
                    输出
                            + a=2
                            + echo ‘a++: 2‘
                            a++: 2
                            
                            

表达式2:    
                    输入
                            c=2
                            
                            自加1,与表达式1有稍许不同。表达式2可以用++来代表+1
                            ((c++))
                            echo "c++: $c"

                    输出
                            + (( c+++ ))
                            + echo ‘c++: 3‘
                            c++: 3
                    
                    输入
                            c=2
                            
                            自加2,自加大于1的时候就与表达式1差不多了
                            ((c+=2))
                            echo "c++: $c"

                    输出
                            + (( c+++ ))
                            + echo ‘c++: 4‘
                            c++: 4
                            
                            
let计算:
                    输入
                            a=1
                            
                            自加1
                            let a++
                            echo "a++: $a"

                    输出
                            + let a++
                            + echo ‘a++: 2‘
                            a++: 2
                   
                   
                    输入
                            a=1
                            
                            自加2
                            let a+=2
                            echo "a+=: $a"

                    输出
                            + let a++
                            + echo ‘a++: 2‘
                            a++: 2
                            
                            
expr计算:
                    输入    
                            a=1
                                    
                            自加1
                              a=`expr $a + 1`
                              echo "a++: $a"

                    输出
                             ++ expr 1 + 1
                             + a=2
                              + echo ‘a++: 2‘
                             a++: 2

                   
                   
                    输入
                              b=1
                            
                              自加2
                             b=$(expr $b + 2)
                             echo "b+=: $b"

                    输出
                             ++ expr 1 + 2
                             + b=3
                             + echo ‘b+=: 3‘
                             b+=: 3
                            
                         
                                                       
bc计算:
                    输入    
                            a=1
                                    
                            自加1
                            a=`echo "$a+1" | bc`
                            echo "a++: $a"

                    输出
                             ++ bc
                               ++ echo 1+1
                             + a=2
                                    + echo ‘a++: 2‘
                             a++: 2

                   
                   
                    输入
                            b=1
                            
                            自加2
                            b=$(echo "$b+2" | bc)
                            echo "b+=: $b"

                    输出
                             ++ bc
                             ++ echo 1+2
                             + b=3
                             + echo ‘b+=: 3‘
                             b+=: 3

至此,shell脚本的计算大概已经讲的差不多了,以上为个人理解和网上的帖子学习过来的,如果有什么错误的地方希望大家能够指出,谢谢。

时间: 2024-10-01 04:06:37

Linux shell脚本数值计算个人心得的相关文章

Linux Shell脚本攻略(1.10)

1.10 获取.设置日期和延时 很多应用程序需要以不同的格式打印日期.设置日期和时间.根据日期和时间执行某项操作.延时通常用于在程序执行过程中提供一段等待时间(比如1秒).同样的,我们也能够一多种格式打印日期,或者在命令行中设置日期.在类Unix系统中,日期被存储为一个整数,其大小为自世界标准时间起所流逝的秒数.这种计时方式称为纪元时或Unix时间. 1.10.1 获取.设置时间 以下的程序给出了多种用法: #!/bin/bash start=$(date +%s) #获取纪元时间 date #

Linux Shell脚本攻略(1.8)

1.8 使用别名 linux中的别名就相当于windows中的快捷方式,使用别名可以省去用户输入一长串命令序列的麻烦. 1.8.1 创建临时别名(快捷方式) alias new_command='command sequence' #格式说明 alias install='sudo apt-get install' #实例说明 在声明 install='sudo apt-get install'之后,就可以用install代替'sudo apt-get install'了.使用这种方式声明的别名

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

Linux shell脚本流程控制

博主搬家至51CTO,初来乍到,请多指教. 此次我们来通过实例解析Linux shell脚本流程控制 Linux shell脚本流程控制可分为三类:顺序执行,条件选择执行,循环执行 顺序执行:简单理解就是逐行执行脚本内容,逐行解读,逐行执行.(此处不做实例解析) 条件选择执行:可以理解为先进行某一条件的判断选择,再决定执行怎样的脚本内容.常见语句if case 条件选择语句:if if语句用法: 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件

Linux shell脚本中shift的用法说明

Linux shell脚本中shift的用法说明 shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数: run.sh: #!/bin/bash while [ $# != 0 ];do echo "第一个参数为:$1,参数个数为:$#" shift done 输入如下命令运行:run.sh a b c d e f 结果显示如下: 第一个参数为:a

Linux Shell脚本攻略(1.2)

1.2 终端打印 终端是交互式工具,用户可以通过它与shell环境进行交互.在终端中打印文本是大多数shell脚本和工具日常需要执行的基本任务.通过终端打印,人们可以知道系统的运行状态,这对用户来说是至关重要的. echo终端打印 echo "Welcome to Bash" echo 'Welcome to Bash' echo Welcome to Bash 以上三种方法的效果是一样的,输出内容都是"Welcome to Bash",并在末尾添加换行符.在默认情

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux shell 脚本获取和替换文件中特定内容

1.从一串字符串中获取特定的信息 要求1:获取本机IP:menu.lst为系统镜象的IP配置文件,需要从中获取到本机IP信息(从文件获取信息) 1 timeout 1 2 default 0 3 4 title live 5 find --set-root /casper/vmlinuz 6 kernel /casper/vmlinuz boot=casper ignore_uuid showmounts ip=eth0,10.0.66.66,255.255.240.0,10.0.64.3 7