[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常见的算术运算符号:参见C算术运算符
    • 多了一个**:幂运算

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}'
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值