• Linux(三) 科学计算


    • expr命令

      最初,Bourne shell提供一种专有命令来计算数学等式.expr命令允许处理命令行中的灯饰,但是很笨拙:

    expr 1+5

      expr命令能够区分一些不同的数学操作符和字符串操作符

      

       在脚本或命令行中使用标准操作符会出现问题,尽管在expr命令中他们可以正常运行.shell中许多expr命令操作符(如星号)有其他含义.在expr命令中使用他们会生成一些奇怪的结果

      

      要解决此问题,在传送给expr命令的字符可能被错误解析前,需要使用shell转义字符(反斜杠)来识别它们:

      

    • 使用括号( [ ] )

      bash shell包含expr命令,使其与Bouneshell保持兼容.当为一个变量指定一个数学值时,可以 用美元符号和方括号($[operation])把数学等式括起来:

    var1=$[1 + 5]
    echo $var1
    # 6
    var2=$[$var1 * 2]
    echo $var2
    # 12

      在bash shell脚本中计算数学等式有一个主要限制.

    var1=100
    var2=45
    var3=$[$var1 / $var2]
    echo The final result is $var3
    # The final result is 2

      Bash shell 的数学操作只支持整数算法, 如果想做任何类型的实际的计算,这是一个很大的限制. Z shell (zsh)支持浮点算数运算,如果在shell脚本中需要浮点计算,可以考虑使用z shell

      

    • 浮点解决方案

      有几种克服bash整数限制的解决方案.最普遍的解决方法是使用内置的bash计算器(称为bc)

      1) bc的基本知识

        bash计算器实际上是一种编程语言,该语言允许在命令行中输入浮点表达式,然后解释 表达式并计算它们,最后返回结果.bash计算器可以识别: 数字(证书和浮点) , 变量(简单变量和数组) , 注释(以英镑符号开始的行或C语言的/* */对) , 表达式 , 编程语句 , 函数 .可以使用bc命令从shell提示符访问bash计算器.

        

        在这个例子以输入表达式12*5.4开始, bash计算器返回结果.计算器对每一个后续键入的表达式都进行计算并显示结果.要退出bash计算器,必须输入quit

        浮点算术被称为scale的内置变量控制.必须把这个值设置为想要的十进制小数位数,否则得不到想要的结果

        

         scale变量的默认值是0.在设置scale值之前,bash计算器提供0小数位的答案.将scale变量值设为4之后,bash计算器显示为4位小数位的答案.-q命令行参数禁止bash计算器的荣誉欢迎标语

        除了普通的数字,bash计算器也识别变量, 一旦定义了变量值,可以在整个bash计算器会话中使用该变量.print语句允许打印变量和数字

        

       2) 在脚本中使用bc

        使用 反引号字符管道 可在脚本中使用bc

    #!/bin/bash
    var1=`echo " scale=4; 3.44 / 5" | bc`
    echo The answer is $var1
    
    # 输出: The answer is .6880

        也可以使用在shell脚本中定义的变量

    #!/bin/bash
    var1=100
    var2=45
    var3=`echo " scale=4; $var1 * $var2" | bc`
    var4=`echo "scale=4; $var3 * $var2" | bc`
    echo The final result is $var4
    
    # 输出: The final result is 202500

        在shell脚本中,可以把输出赋值给变量. 使用该技术,可以吧脚本中每个操作和表达式放在单独的行中,使其更加清晰并便于阅读. 在bash计算器内创建的变量只在bash计算器内有效,而不能用在shell脚本中

    #!/bin/bash
    var1=10.46
    var2=43.67
    var3=33.2
    var4=71
    
    var5=`bc EOF
    scale=4
    a1 = ($var1 * $var2)
    b1 = ($var3 * $var4)
    a1 + b1
    EOF
    `
    
    echo The final answer for this mess is $var5
    
    # 输出: The final answer for this mess is 2813.9882
    • 退出脚本

      为了向shell表明,命令已经处理完毕,每条运行在shell中的命令都使用一个退出状态.这个退出状态时一个介于0好255之间的证书值,当命令运行完成时,命令就会把退出状态传递给shell.可以捕捉这个值并在您的脚本中使用它.

      1) 核对退出状态

        Linux提供 $? 特殊变量来保存最后一条命令执行结束的退出状态.如果想核对一条命令的退出状态,必须在这条命令运行完成之后立即查看或使用变量 $? . 它会改变为shell执行的最后一条命令的退出状态值

    date
    # 输出: Sat Sep 29 10:01:00 EDT 2020
    echo $?
    # 输出: 0

        按照惯例,一条命令成功完成的退出状态是 0.如果命令执行错误, name退出状态就是一个正整数

    asdfg
    # 输出: -bash: asdfg: command not found
    echo $?
    # 输出: 127

        Linux退出状态码

        

       2) 退出命令

        默认情况下,shell脚本中最后一条命令的退出状态退出. 可以把它改为返回自己的退出状态码. exit命令允许在脚本结束时,指定一个退出状态

    #!/bin/bash
    # testing the exit status
    var1=10
    var2=30
    var3=$[ $var1 + $var2 ]
    echo The answer is $var3
    exit 5

    # 输出: The answer is 40
    echo $?
    # 显示: 5

        应该谨慎使用这个功能,因为退出状态代码最高是255, 如果大于255, 退出状态码会进过计算自动降低到适合 0-255范围之内的数. 计算规则是: 用要返回的状态码和256求余(如300和256的余数是44, 44就是退出状态码)

  • 相关阅读:
    Luogu P4316 绿豆蛙的归宿 题解报告
    Luogu P1850 换教室(NOIP 2016) 题解报告
    Rainbow的信号 题解报告
    $CH5105 Cookies$ 线性$DP+$贪心
    算法竞赛 $0×50$ 动态规划 (+一本通
    $CH5104 I-country$ 线性$DP$
    洛谷$2014$ 选课 背包类树形$DP$
    $SP703 Mobile Service DP$
    $POJ1015 Jury Compromise Dp$/背包
    $POJ1742 Coins$ 多重背包+贪心
  • 原文地址:https://www.cnblogs.com/lab-zj/p/12932409.html
Copyright © 2020-2023  润新知