热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Shell脚本中的数学运算与变量引用(第三部分)

在本文中,我们将深入探讨Shell脚本中的数学运算和变量引用。Shell提供了多种方法来进行数学计算,主要包括`expr`、`$(())`和`let`。我们将详细解析这三种方法的具体应用和特点,帮助读者更好地理解和使用这些工具。

        今天我们来看看 shell 中的数学计算和引用。在 shell 中的计算方法有三种:1、expr;2、();3、let。下来我们来仔细的看看这三种数学计算:

        1、第一种:expr

            格式:expr 操作数1 操作符 操作数2

            举例:

            ① expr 1 + 2      TMP=$(expr 1 + 2)

图片.png

            ② expr 1 + 4 / 3   TMP=$(expr 1 + 4 / 3)

图片.png

        由此我们可以看出在 expr 的数学计算中,它是不支持浮点数的计算的,另外在赋值变量的时候还有一种写法。

            ③ expr 1 + 2 * 3(?)

图片.png

        我们看到在第一次执行的时候报语法错误,这是因为在 bash 脚本中,* 被赋予0到任意一个字符,我们当做乘法运算时,必须得加上转义符(\)才能进行正确的乘法计算。

        那么由此可以看出第一种数学计算的格式要求相对严格一点。

        2、第二种:()

            格式:$((操作数1 操作符 操作数2))

            举例:TMP=$((1 +   3))

图片.png

        我们可以看出第二种数学计算的格式相对来说要求较松。

        3、第三种:let

            格式:let "[变量][操作符] 操作数1 操作符 操作数2"

            举例:

            ① let "3+4"

            ② let "TMP=3+4"

图片.png

        我们看到第三种数学计算的格式要求松,而且计算灵活

        那么我们学习 shell 中的数学计算有什么实际用途呢?下来我们就来看一个例子,一个简单的脚本:

        当 /tmp 目录下文件占用率达到 80% 时,对磁盘文件进行特定的清理,当达到设定值时对管理员发一封邮件报警。

        实现步骤:

        a> 使用 df 命令对 /tmp 目录进行查看

图片.png

        b> 对磁盘占用率进行计算

图片.png

        我们之前说过它是不支持浮点数计算的,因此我们先 *100 再进行相除操作。我们看到在进行除法操作之后它的占用率不等于 13%,这是因为它还有一部分空间是给 root 用户使用的。

        c> 判断是否达到特定值,我们把之前的写成一个脚本

#! /bin/bash
df /tmp
ABC=$(expr 5820284 \* 100 / 49410864)
echo $ABC
if [ $ABC -gt 10 ]
then
    echo "Warning ..."
fi

        我们来看看结果

图片.png

        我们看到已经达到 10% 了。

        d> 根据第三步的结果决定报警,并将它写入到 /home/aston/test/warning.txt 文件中,再加上日期信息

#! /bin/bash
df /tmp
ABC=$(expr 5820284 \* 100 / 49410864)
echo $ABC
if [ $ABC -gt 10 ]
then
    echo "$(date) Warning [Disk greater than 10%!!!]" >> /home/aston/test/warning.txt
fi

        我们来看看结果

图片.png

        我们此时已经实现报警的功能。

        下来我们来看看 shell 中的引用。那么什么叫引用呢?引用便是对 shell 脚本、程序、终端命令、变量以及字符串等结果的反馈。引用的类型如下所示

"" 双引号
`   反引号
''  单引号
\  反斜线

        那么我们为什么要进行引用呢?引用的目的就是为了防止不必要的误会

        举例:

        ① echo hello world * 与 echo "hello world *"

图片.png

        我们的本意是输出 hello world *,可是在第一种情况下,我们不加 "",便导致了它将 * 命令解读成输出全部的文件了。

        ② echo "hello "world "  welcome"

图片.png

        我们看到第一种与第二种的区别了,第二种由于双引号没加完,因此它执行的结果会和我们想象的不一样。

        1、双引号:使用双引号可引用除字符 $、`、\ 外的任意字符或字符串

        举例:echo "%#$^ $hello world"

图片.png

        我们看到只输出了 world,并没有 hello。

        2、单引号:它与双引号类似,不同的是 shell 会忽略任何引用值。

图片.png

        3、反引号:它用于将系统命令的输出到变量。

        ① echo  `hello`  (错 ×)

        ② echo `date`    (对 √)

图片.png

        4、反斜线:如果下一个字符有特殊含义,反斜线防止 shell 误解其含义。

        下述字符包含有特殊意义:& * + ^ $ ` " | ?

图片.png

        我们看到在 & 后面的时候,它是报错了。因为 & 表示由退出的含义,因此在它前面加 \ 则会让 shell 忽略其特殊含义,以防止误解。


推荐阅读
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 本文介绍了如何在三台CentOS 7.5虚拟机上通过Docker部署RabbitMQ集群,包括环境准备、容器创建、集群配置及故障处理等内容。 ... [详细]
  • 本文介绍了如何在 Linux 系统上构建网络路由器,特别关注于使用 Zebra 软件实现动态路由功能。通过具体的案例,展示了如何配置 RIP 和 OSPF 协议,以及如何利用多路由器查看工具(MRLG)监控网络状态。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • Python作为一种广泛使用的高级编程语言,以其简洁的语法、强大的功能和丰富的库支持著称。本文将详细介绍Python的主要特点及其在现代软件开发中的应用。 ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • 本文详细介绍如何在Android模拟器上安装TaintDroid的过程,包括解决源代码链接失效及服务器文件变动等问题,旨在帮助后续用户避免不必要的麻烦。 ... [详细]
  • 本文探讨了管道符在Shell编程中的应用,详细解释了它作为进程间通信工具的功能,以及如何利用管道符实现命令间的高效数据传输。 ... [详细]
  • 四月个人任务:Linux基础操作与网络管理
    本文介绍了两项主要任务:编写一个脚本来检测192.168.1.0/24子网中当前在线的IP地址,以及如何在Linux系统中挂载Windows网络共享目录。通过具体步骤和代码示例,帮助读者理解和掌握相关技能。 ... [详细]
  • ipvsadm命令简介:ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。在fedora14、Linux6.0之后系统中 ... [详细]
  • 本文详细介绍了如何在Ubuntu操作系统中安装和配置Maven,包括必要的环境准备和验证步骤。 ... [详细]
  • Mac环境下Java与Ant自动化构建环境搭建指南
    本文详细介绍了如何在Mac操作系统上为测试工程师搭建Java和Ant开发环境,包括环境变量配置等关键步骤。 ... [详细]
  • 本文详细介绍了在Mac操作系统中使用Python连接MySQL数据库的方法,包括常见的错误处理及解决方案。 ... [详细]
  • GitHub基础指南:项目代码的部署与管理
    GitHub是一个广泛使用的开源代码托管平台,支持版本控制与协作开发。本文将指导开发者如何在GitHub上高效地管理和分享项目代码,包括项目的创建、代码的上传与下载等基本操作。 ... [详细]
  • 本文探讨了如何使Shell和程序同时响应Ctrl-C信号的方法,即通过将两者置于同一进程组并将其设为终端的前台进程组。 ... [详细]
author-avatar
up61
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有