zoukankan      html  css  js  c++  java
  • 【第三章】Shell 变量的数值计算

    一、算数运算符

    shell中常见的算术运算符:

    shell中常见的算术命令:

    1. 整数运算

    方法一:expr 

    • expr命令就既可以用于整数运算,也可以用于相关字符串长度、匹配等的运算处理:
    • expr 1 + 2     +     -    *    /    
    • expr $num1 + $num2 + - * / %;

    注:计算的数字左右都至少有一个空格,

      乘号需要用反斜线屏蔽其特定含义,因为shell会误读星号。

    方法二:$(())
    echo $(($num1+$num2)) + - * / %
    echo $((num1+num2))
    echo $((5-3*2))
    echo $(((5-3)*2))
    echo $((2**3))

    echo $((a++)) 、  echo $((a--))     先输出后加减

    echo $((++a))   、 echo $((--a))  先加减后输出

    sum=$((1+2)); echo $sum

    方法三:$[]
    echo $[5+2] + - * / %
    echo $[5**2]

    方法四:let
    let sum=2+3; echo $sum
    let i++; echo $i

    2. 小数运算

    echo "2*4" |bc
    echo "2^4" |bc
    echo "scale=2;6/4" |bc
    awk 'BEGIN{print 1/2}'
    echo "print 5.0/2" |python

     二、算数运算的实例

    2.1 关于$(())的实例

    实例一:运算示例

    [root@host-131 ~]# echo $((6+2))     #加法
    [root@host-131 ~]# echo $((6-2))      #减法
    [root@host-131 ~]# echo $((6*2))      #乘法  
    [root@host-131 ~]# echo $((6/2))       #除法
    [root@host-131 ~]# echo $((6%2))     #余数
    [root@host-131 ~]# echo $((6**2))     #幂运算

      实例二:各种运算shell脚本示例

    [root@host-131 ~]# cat vartest01.sh 
    #!/bin/bash
    a=6
    b=2
    echo "a-b=$(($a-$b))"
    echo "a-b=$(($a-$b))"
    echo "a*b=$(($a*$b))"
    echo "a/b=$(($a/$b))"
    echo "a**b=$(($a**$b))"
    echo "a%b=$(($a%$b))"
    [root@host-131 ~]# chmod a+x vartest01.sh 
    [root@host-131 ~]# ./vartest01.sh 
    a-b=4
    a-b=4
    a*b=12
    a/b=3
    a**b=36
    a%b=0
    [root@host-131 ~]#

    实例三:实现输入2个数字进行加、减、乘、除功能的计算器

    [root@host-131 ~]# cat var_jisuan.sh 
    #!/bin/bash
    #+,-,*,/ 2018-06-12
    print_useage(){
        printf "Please enter an int
    "
        exit 1
    }
    read -p "Please input first number:" fnum
    if [ -n "`echo $fnum |sed 's/[0-9]//g'`" ];then       #-n选项可以理解为字符串 no zero
        print_useage
    fi
    read -p "Please input the operators:" op
    if [ "${op}" != "+" ]&&[ "$op" != "-" ]&&[ "$op" != "*" ]&&[ "$op" != "/" ];then
        echo "Please use {+|-|*|/}"
        exit 2
    fi
    read -p "Please input second number: " snum
    if [ -n "`echo $snum | sed 's/[0-9]//g'`" ];then
        print_useage
    fi
    echo "${fnum}${op}${snum}=$((${fnum}${op}${snum}))"
    [root@host-131 ~]# chmod a+x var_jisuan.sh 
    [root@host-131 ~]# ./var_jisuan.sh 
    Please input first number:4
    Please input the operators:+
    Please input second number: 5
    4+5=9
    [root@host-131 ~]#

     实例四:高效的计算方法

    [root@host-131 ~]# cat var_jisuan02.sh 
    #!/bin/bash
    read -p "Please input num=num1{+|-|*|/}num2:" num
    echo $(($num))
    [root@host-131 ~]# chmod a+x var_jisuan02.sh 
    [root@host-131 ~]# ./var_jisuan02.sh 
    Please input num=num1{+|-|*|/}num2:3*5
    15
    [root@host-131 ~]# 
    
    或者用如下方法:
    [root@host-131 ~]# cat var_jisuan02.sh 
    #!/bin/bash
    echo $(($1))
    [root@host-131 ~]# sh var_jisuan02.sh 4+5
    9
    [root@host-131 ~]#

     2.2 let运算命令实例

    实例一、监控web服务状态,如果访问两次均失败,则报警。

    #!/bin/bash
    CheckUrl(){    #定义函数
    timeout=5      #定义wget访问超时时间
    fails=0        #初始化网站访问失败次数为0
    success=0      #初始化网站访问成功次数为0
    while true    #持续循环
        do
            wget --timeout=$timeout --tries=1 https://www.cnblogs.com/yangleitao/ -q -O /dev/null  #--tries
    #增加重试次数。 -q 不显示下载过程   -O 下载并以不同的文件名保存 
    
    
            if [ $? -ne 0 ];then
                let fails=fails+1
            else
                let success+=1
            fi
            if [ $success -ge 1 ];then
                echo "success"
                exit 0
            fi
            if [ $fails -ge 2 ];then
                Critical="system is dowm."
                echo $Critical|tee|mail -s "$Critical" abc@ddsaff.com
                exit 2
    
            fi
    done
    }
    CheckUrl #执行函数

      2. 3expr运算命令实例

    实例1:判断一个变量值或者字符串是否为整数?

    [root@host-131 ~]# cat var_expr.sh 
    #!/bin/bash
    #持续等待输入
    while true
    do 
        read -p "Please input:" a
        expr $a + 0 >/dev/null 2>&1        # 参考此博客理解Linux Shell 1>/dev/null 2>&1 含义 - CSDN博客  https://blog.csdn.net/ithomer/article/details/9288353
        [ $? -eq 0 ]&&echo int||echo chars
    done
    [root@host-131 ~]# chmod a+x var_expr.sh 
    [root@host-131 ~]# ./var_expr.sh 
    Please input:yanglt
    chars
    Please input:123
    int
    Please input:^C
    [root@host-131 ~]# 

    实例2:判断输入两个参数后进行混合运算:

    [root@host-131 ~]# cat var_expr01.sh 
    #!/bin/bash
    #n0.1
    [ $# -ne 2 ]&&{
        echo $"USAGE $0 num1 num2"   #打印提示内容
        exit 1
    }
    
    #n0.2
    a=$1
    b=$2
    expr $a + $b + 10 &>/dev/null
    if [ $? -ne 0 ]                #如果返回为0至少有一个不是整数
    then
       echo "Please input two nums."
       exit 2
    fi
    
    #n0.3
    echo "a-b=$(($a-$b))"
    echo "a+b=$(($a+$b))"
    echo "a*b=$(($a*$b))"
    echo "a/b=$(($a/$b))"
    echo "a**b=$(($a**$b))"
    echo "a%b=$(($a%$b))"
    [root@host-131 ~]# chmod a+x var_expr01.sh 
    [root@host-131 ~]# ./var_expr01.sh 5 6
    a-b=-1
    a+b=11
    a*b=30
    a/b=0
    a**b=15625
    a%b=5
    [root@host-131 ~]# 

     实例3:计算字符串长度

    通过expr 计算字符串长度
    [root@host-131 ~]# char="i am is yanglt"
    [root@host-131 ~]# expr length "$char"
    14
    [root@host-131 ~]# expr ${#char}
    14
    [root@host-131 ~]# echo ${char} |wc -L
    14
    [root@host-131 ~]# echo ${char} |awk '{print length($0)}'
    14
    [root@host-131 ~]# echo ${#char}
    14
    [root@host-131 ~]# expr length "$char"
    14
    
    写一个shell脚本打印一段话中字符数小于6的单词。
    [root@host-131 ~]# cat var_expr02.sh
    #!/bin/bash
    for  n in  You are welcome to learn with me shell
    do
        if [ `expr length $n` -lt 5 ]
            then
                echo $n
        fi
    done
    
    [root@host-131 ~]# sh var_expr02.sh
    You
    are
    to
    with
    me
    [root@host-131 ~]# 

       2. 4 bc运算命令实例

    1.将bc作为计算机使用
    [root@host-131 ~]# bc
    bc 1.06.95
    Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'. 
    1+3
    4
    2*4
    8
    2.在命令行下使用,实现运算功能,配合变量运算
    
    [root@host-131 ~]# echo 4+5|bc
    9
    [root@host-131 ~]# echo 4*5|bc
    20
    [root@host-131 ~]# echo 4.5+5.5|bc
    10.0
    [root@host-131 ~]# echo "scale=2;355/113"|bc   #scale=2表示保留两位小数
    3
    [root@host-131 ~]# echo "scale=5;355/113"|bc
    3.14159
    [root@host-131 ~]# echo "scale=5;355/113"|bc
    3.14159
    [root@host-131 ~]# i=4
    [root@host-131 ~]# echo $i+6 |bc
    10
    [root@host-131 ~]# a=`echo $i+6 |bc`
    [root@host-131 ~]# echo $a
    10
    [root@host-131 ~]# 
    
    3、通过一条命令计算输出 1+2+3+...+10 的表达式,并计算结果。
    [root@host-131 ~]# echo `seq -s '+' 10`=`seq -s "+" 10|bc`  #bc计算
    1+2+3+4+5+6+7+8+9+10=55
    [root@host-131 ~]# echo `seq -s '+' 10`="$((`seq -s "+" 10`))"  #$(()) 计算 
    1+2+3+4+5+6+7+8+9+10=55
    [root@host-131 ~]# echo `seq -s '+' 10`=`seq -s " + " 10|xargs expr` #使用expr计算
    1+2+3+4+5+6+7+8+9+10=55
    [root@host-131 ~]# echo `seq -s '+' 10`=$(echo $[`seq -s "+" 10`])    #使用$[]计算
    1+2+3+4+5+6+7+8+9+10=55
    [root@host-131 ~]# 

     2.5 awk、declare实现计算

    awk实现计算:
    [root@host-131 ~]# echo "7.7 3.8 " |awk '{print ($1-$2)}'
    3.9
    [root@host-131 ~]# echo "358 113 " |awk '{print ($1-3)/$2}'
    3.14159
    [root@host-131 ~]# echo "3 9" |awk '{print ($1+3)*$2}'
    54
    [root@host-131 ~]# 
    
    declare实现计算:
    [root@host-131 ~]# declare -i A=20 B=8
    [root@host-131 ~]# A=A+B
    [root@host-131 ~]# echo $A
    28
    [root@host-131 ~]# 

    2.6 $[] 符号的运算

    [root@host-131 ~]# i=5
    [root@host-131 ~]# i=$[i+6]
    [root@host-131 ~]# echo $i
    11
    [root@host-131 ~]# echo $[2**3]
    8
    [root@host-131 ~]# echo $[2/3]
    0
    [root@host-131 ~]# echo $[2%3]
    2
    [root@host-131 ~]# echo $[2 % 3]
    2
  • 相关阅读:
    zoj 3591 Nim 博弈论
    zoj 3529 A Game Between Alice and Bob 博弈论
    zoj 3513 Human or Pig 博弈论
    hdu 3886 Final Kichiku “Lanlanshu” 数位DP
    2013 ACM/ICPC Asia Regional Changsha Online
    2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
    hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
    hdu 1404/zoj 2725 Digital Deletions 博弈论
    zoj 2686 Cycle Game 博弈论
    zoj 2290 Game 博弈论
  • 原文地址:https://www.cnblogs.com/yangleitao/p/9172953.html
Copyright © 2011-2022 走看看