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


0.前置知识

1.if参数

参数 意义
-b file存在并且是块⽂件时返回true
-c file存在并且是字符⽂件时返回true
-d pathname存在并且是⼀个⽬录时返回true
-e pathname指定的⽂件或⽬录存在时返回true
-f file存在并且是⽂件时返回true
-g 当由pathname指定的⽂件或⽬录存在并且设置了SGID时返回为true
-h file存在并且是符号链接⽂件时返回true,该选项在⼀些⽼系统上⽆效
-k 当由pathname指定的⽂件或⽬录存在并且设置了“粘滞”位时返回true
-p file存在并且是命令管道时返回为true
-r 当由pathname指定的⽂件或⽬录存在并且可读时返回为true
-s file存在⽂件⼤⼩⼤于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常见的算术运算符号:参见C算术运算符
    • 多了一个**:幂运算

2.常见算数运算命令

0.常用算数运算命令

运算操作符与运算命令 意义
(()) 用于整数运算,效率很高
let 用于整数运算,类似(())
expr 可用于整数运算,但还有很多其他额外功能
bc Linux下的一个计算机程序(适合整数及小数运算)
$[] 用于整数运算
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}'

相关推荐

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

    2024-07-11 14:54:02       22 阅读
  2. 运算符讲解

    2024-07-11 14:54:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 14:54:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 14:54:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 14:54:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 14:54:02       69 阅读

热门阅读

  1. tessy 单元测试:小白入门指导手册

    2024-07-11 14:54:02       20 阅读
  2. C语言-概述,应用领域

    2024-07-11 14:54:02       19 阅读
  3. c++ 网络编程udp协议 poco模块

    2024-07-11 14:54:02       21 阅读
  4. 动态规划算法-以中学排课管理系统为例

    2024-07-11 14:54:02       25 阅读
  5. ThingsBoard本地windows环境启动

    2024-07-11 14:54:02       26 阅读
  6. Oracle各种连接写法介绍

    2024-07-11 14:54:02       24 阅读
  7. C# 委托和事件

    2024-07-11 14:54:02       20 阅读