目录

LinuxShellShell数学运算详细讲解

[Linux][Shell][Shell数学运算]详细讲解

目录


0.前置知识

1.if参数

参数意义
-bfile 存在并且是 块⽂件 时返回 true
-cfile 存在并且是 字符⽂件 时返回 true
-dpathname 存在并且是⼀个 ⽬录 时返回 true
-epathname 指定的 ⽂件或⽬录 存在时返回 true
-ffile 存在并且是 ⽂件 时返回 true
-g当由 pathname 指定的 ⽂件或⽬录 存在并且 设置了 SGID 时返回为 true
-hfile 存在并且是 符号链接⽂件 时返回 true ,该选项在⼀些⽼系统上⽆效
-k当由 pathname 指定的 ⽂件或⽬录 存在并且 设置了“粘滞”位 时返回 true
-pfile 存在并且是 命令管道 时返回为 true
-r当由 pathname 指定的 ⽂件或⽬录 存在 并且可读 时返回为 true
-sfile 存在 ⽂件⼤⼩⼤于0 时返回 true
-u当由 pathname 指定的 ⽂件或⽬录 存在并且 设置了 SUID 时返回 true
-w当由 pathname 指定的 ⽂件或⽬录 存在 并且可执⾏ 时返回 true
-o当由 pathname 指定的 ⽂件或⽬录 存在 并且被⼦当前进程的有效⽤户ID所指定的⽤户拥有时 返回 true

2.Unix Shell里面比较字符写法

参数意义
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于
-z空串
=两个字符相等
!=两个字符不等
-n非空串

1.算数运算符号

  • Shell常见的算术运算符号:参见
    • 多了一个 ** :幂运算

2.常见算数运算命令

0.常用算数运算命令

运算操作符与运算命令意义
(())用于整数运算,效率很高
let用于整数运算,类似 (())
expr可用于整数运算,但还有很多其他额外功能
bcLinux下的一个计算机程序(适合整数及小数运算)
$[]用于整数运算
awk即可以用于整数运算,也可以用于小数运算
declare定义变量值和属性, -i 参数可以用于定义整型变量,做运算

1.双括号(())

  • 效率极高

  • 注意 :必须是整数, (()) 不支持浮点数,浮点数需要其他命令计算

    运算操作符与运算命令意义
    ((i=i+1))运算后赋值,不能用 echo ((i=i+1)) 的形式输出表达式的值,要用 echo $((i=i+1)) 输出
    i=$((i+1))(()) 前加 $ ,表示将表达式运算后赋值给 i
    ((8>7&&5==5))进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断
    echo $((2+1))需要直接输出运算表达式的运算结果时,在 (()) 前加 $
  • 简易Shell脚本示例 :一个交互的计算器

    #!/bin/bash
    Usage()
    {
        printf "Error! Please enter an integer\n"
        exit 1
    }
    
    # 接收用户输入的命令,-p参数后面写给用户看到的提示信息
    read -p "Please input your number> " first
    
    # 进行对用户输入判断 --> if语句
    # 限制用户必须输入纯数字
    # []里面前后必须有一个空格,是固定语法
    # -n,如果字符串为空,则条件不成立,如果不为空,则条件成立
    # sed的作用是把字符串进行替换,把所有的数字都替换为空,那么就剩下其他的非数组内容了
    if [ -n "`echo $first | sed 's/[0-9]//g'`" ]
        then
            Usage
    fi
    
    read -p "Please input your operator> " operator
    if [ "$operator" != "+" ] && [ "$operator" != "-" ] && [ $operator != "*" ] && [ $operator != "/" ]
        then
            echo "只允许输入+-*/"
            exit 2
    fi
    
    read -p "Please input your number> " second
    if [ -n "`echo $second | sed 's/[0-9]//g'`" ]
        then
            Usage
    fi
    
    echo $(($first $operator $second))

2.let命令

  • let命令等同于 (())

    • 但是 (()) 效率更高
  • 简易脚本示例 :检测网页状态

    #!/bin/bash
    
    CheckUrl()
    {
        timeout=0
        fails=0
        success=0
    
        while true
        do
            wget --timeout=$timeout --tries=1 snowk.x3322.net:9098 -q -O /dev/null
    
            # 如果状态码!=0,就报错
            if [ $? -ne 0 ]
            then
                let fails+=1
            else
                let success+=1
            fi
    
            if [ $success -ge 1 ]
            then
                echo "It's success :P"
                exit 0
            fi
    
            # 如果出错次数大于2,就告警
            if [ $fails -ge 2 ]
            then
                echo "It's dead :("
                exit 2
            fi
        done
    }
    
    CheckUrl

3.expr命令

  • expr 命令允许在命令行处理数学表达式,简单的计算器命令

    • 具体用法expr --help
  • expr 命令并不是很好用,因为其 基于空格传入参数

    • 很多符号在shell⾥有特殊含义,因此必须得 转义使用
  • 示例

    expr 5 + 3
    expr 5 * 6
  • expr 模式匹配

    • : –> 计算字符串中的字符个数
    • .* –> 任意字符串重复0次或多次
      • 此处可以自定义想匹配的内容
    • 语法expr 字符串 ":" ".*"
    • 示例expr SnowK.jpg ":" ".*jpg"
  • 简单脚本示例

    • expr 判断文件名是否符合要求

      #!/bin/bash
      
      if expr $1 ":" ".*jpg" &> /dev/null
      then
          echo "This is a jpg file"
      else
          echo "It's not a jpg file"
      fi
    • 找出字符长度不大于6的单词

      #!/bin/bash
      
      for str in I am SnowK, this is a example
      do
          if [ `expr length $str` -le 4 ]
          then
              echo $str
          fi
      done

4.bc命令

  • bc命令可以当作命令行计算器

  • 直接 bc 可以进入交互式操作

  • bc 配合管道符计算:计算1~10的和

    echo {1..10} | tr " " "+" | bc

5.中括号[]

  • 语法$[表达式]

6.awk计算

echo "4 8" | awk '{print $1+4*$2}'