Shell脚本中的数值计算:使用数学运算实现数值操作

news2024/10/7 14:31:59

前言

沐风晓月带你学云原生开发,从零开始,我们出发,让知识学习不再难。

🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家
😉😉 💕 座右铭:先努力成长自己,再帮助更多的人,一起加油进步
🍺🍺🍺 💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘

可以关注我的云原生社区:云原生社区
也可以关注我的英语社区:从零开始学英语

文章目录

  • 前言
  • 一. 数据运算命令介绍
  • 二. 综合案例
    • 2.1 let 的使用
    • 2.2 ```[ ]```的使用
    • 2.3 ```(())```的使用
    • 2.4 expr的使用
    • 2.5 bc的使用
  • 总结

一. 数据运算命令介绍

在shell环境中,我们可以使用的数据运算命令有:

在这里插入图片描述

  • expr:用于执行基本的算术和字符串操作。它支持常见的数学运算符,如加法、减法、乘法、除法和取模。例如,expr 5 + 2 将返回 7。

  • let:用于执行算术运算,包括基本的数学运算符、逻辑运算符和位运算符。它还支持自增和自减操作。例如,let “x = 5 + 2” 将将计算结果赋值给变量 x。

  • $(( )):双括号扩展是Shell的算术扩展。它支持数学运算符、逻辑运算符和位运算符。例如,result=$((5 + 2)) 将将计算结果赋值给变量 result。

  • bc:是一个高精度计算器语言。它可以执行复杂的数学计算,包括浮点数运算和数学函数。需要使用 echo 命令来将表达式传递给 bc。例如,echo “5 + 2” | bc 将返回 7。

  • awk:是一种强大的文本处理工具,也可以执行数学计算。它支持基本的数学运算符、内置数学函数和控制结构。例如,echo “5 + 2” | awk ‘{ print $1 + $2 }’ 将返回 7。

  • [] 这个也能用于数据运算,如:

[root@mufeng-69 ~]# a=3
[root@mufeng-69 ~]# b=4
[root@mufeng-69 ~]# result=$[a + b]
[root@mufeng-69 ~]# echo $result
7

二. 综合案例

2.1 let 的使用

使用方法:

自加操作 let n++
自减操作 let n–
简写形式: let no +=6 等同于 let no = no +6
let no-=6 等同于 let no = no - 6

注意:
let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

比如我们在猜数字游戏中:

#!/bin/bash
guess=20
n=0
while ((n < 3))

do
# 让用户输入一个数字
read -p "please input your num:" num
# 判断用户输入的数字与定义好的数字的大小
if [ $num -lt 20 ];then
        echo "your guess is too small"
elif [ $num -gt 20 ];then
        echo "your guess is too bigger"

elif [ $num -eq 20 ];then
        echo "succeed ,you are winer"

else 
        echo "please input a num"
fi
# 我们定义了只有三次机会,每次猜完都n+1
let n++
done

2.2 [ ]的使用

在Shell环境中,方括号 [] 可以用于进行一些基本的数据运算和数值比较。方括号内部可以包含数学表达式和比较表达式。

  • 数学运算:
加法:result=$(($a + $b))result=$[a + b]
减法:result=$(($a - $b))result=$[a - b]
乘法:result=$(($a * $b))result=$[a * b]
除法:result=$(($a / $b))result=$[a / b]
取余:result=$(($a % $b))result=$[a % b]
  • 数值比较:
相等:[ $a -eq $b ]
不等:[ $a -ne $b ]
大于:[ $a -gt $b ]
小于:[ $a -lt $b ]
大于等于:[ $a -ge $b ]
小于等于:[ $a -le $b ]

使用[]的案例:

[root@ecs-c13b ~]# result=$[ 1 + 2 ]
[root@ecs-c13b ~]# echo $result
3
[root@ecs-c13b ~]# NO1=5
[root@ecs-c13b ~]# result=$[ $NO1 + 5 ]
[root@ecs-c13b ~]# echo $result 
10
[root@ecs-c13b ~]# 

2.3 (())的使用

在Shell中,双圆括号 (( )) 是一种进行数学运算和数值比较的特殊结构,常用于Shell的算术扩展

  • 进行数学运算
x=5
y=3
result=$((x + y))
echo $result    # 输出:8
  • 变量赋值
x=5
((x = x + 3))
echo $x    # 输出:8
  • 数值比较: 可以使用双圆括号进行数值比较,并得到布尔值的结果。
x=5
y=3
((x > y)) && echo "x 大于 y" || echo "x 不大于 y"    # 输出:x 大于 y
  • 表示递增和递减
((x++))((x--))

案例实战:

#!/bin/bash

# 定义两个变量
x=10
y=5

# 执行数学运算并赋值给变量
result=$((x + y))

echo "x + y = $result"

# 变量递增操作
((x++))
echo "x++ = $x"

# 变量递减操作
((y--))
echo "y-- = $y"

# 数值比较
if ((x > y)); then
  echo "x 大于 y"
else
  echo "x 不大于 y"
fi

执行结果:

x + y = 15
x++ = 11
y-- = 4
x 大于 y

2.4 expr的使用

expr 是 Shell 环境中用于执行基本的数学运算和字符串操作的命令。它可以进行算术计算、字符串比较和提取子字符串等操作。

  • 算术运算:
加法:expr 5 + 2 将返回 7。
减法:expr 5 - 2 将返回 3。
乘法:expr 5 \* 2 将返回 10。注意乘法运算符 * 需要使用反斜杠 \ 进行转义。
除法:expr 10 / 2 将返回 5。
取模:expr 10 % 3 将返回 1
  • 字符串操作:
1.  字符串长度:expr length "Hello" 将返回 5,表示字符串 "Hello" 的长度。
2. 子字符串提取:expr substr "Hello, World" 8 5 将返回 "World",
   表示从第 8 个字符开始截取长度为 5 的子字符串。
  • 数值比较:
相等比较:expr 2 = 2 将返回 1,表示两个数值相等。
不等比较:expr 2 != 3 将返回 1,表示两个数值不相等。
大于比较:expr 5 \> 3 将返回 1,表示前者大于后者。
小于比较:expr 3 \< 5 将返回 1,表示前者小于后者。

注意:在使用 expr 进行数学计算时,数值和运算符之间需要有空格分隔,并且乘法运算符 * 需要使用反斜杠 \ 进行转义。在字符串操作和数值比较时,运算符和操作数之间也需要有空格分隔。

案例实战:

#!/bin/bash

# 定义两个变量
x=10
y=5

# 执行算术运算
sum=$(expr $x + $y)
difference=$(expr $x - $y)
product=$(expr $x \* $y)
quotient=$(expr $x / $y)
remainder=$(expr $x % $y)

echo "Sum: $sum"
echo "Difference: $difference"
echo "Product: $product"
echo "Quotient: $quotient"
echo "Remainder: $remainder"

# 执行字符串操作
string1="Hello,"
string2=" World!"
concatenated=$(expr "$string1" : '\(.*\)')$string2
substring=$(expr substr "$concatenated" 7 5)

echo "Concatenated: $concatenated"
echo "Substring: $substring"

# 执行数值比较
if expr $x '>' $y > /dev/null; then
  echo "x 大于 y"
else
  echo "x 不大于 y"
fi

2.5 bc的使用

bc是一个高级数据运算工具, 这个工具包含了计算器的很多选项和功能。

  • 基础运算
[root@ecs-c13b ~]# echo "4 * 0.5" |bc
2.0
[root@ecs-c13b ~]# echo "$NO1 * 0.5" |bc
2.5
  • 设置小数精度: scale
[root@ecs-c13b ~]# echo "scale=2;3/8"| bc
.37
[root@ecs-c13b ~]# echo "scale=2;3/7"| bc
.42
[root@ecs-c13b ~]# echo "scale=2;3/10"| bc
.30
  • 二进制和十进制转换
[root@ecs-c13b ~]# no=10
[root@ecs-c13b ~]# echo $no
10
[root@ecs-c13b ~]# echo "obase=2;$no" |bc
1010
十进制
[root@ecs-c13b ~]# no=10000011110000
[root@ecs-c13b ~]# echo $no
10000011110000
[root@ecs-c13b ~]# echo "obase=10; ibase=2;$no"|bc
8432
  • 计算平方根
[root@ecs-c13b ~]# test=zmgaosh1234567
[root@ecs-c13b ~]# echo $test
zmgaosh1234567
[root@ecs-c13b ~]# length=${#test}
[root@ecs-c13b ~]# echo $length
14

案例实战: 写一个计算器的脚本

#!/bin/bash

while true; do
  # 提示用户输入表达式
  read -p "请输入要计算的表达式 (输入 'q' 退出): " expression

  # 检查用户是否选择退出
  if [ "$expression" = "q" ]; then
    echo "感谢使用计算器!"
    break
  fi

  # 执行计算
  result=$(echo "$expression" | bc -l)

  # 输出结果
  echo "计算结果: $result"
  echo
done

执行结果:

root@mufeng-69 ~]# chmod +x a.sh 
[root@mufeng-69 ~]# ./a.sh 
请输入要计算的表达式 (输入 'q' 退出): 3+2
计算结果: 5

请输入要计算的表达式 (输入 'q' 退出): 3 * 3
计算结果: 9

请输入要计算的表达式 (输入 'q' 退出): 5/4
计算结果: 1.25000000000000000000

请输入要计算的表达式 (输入 'q' 退出): 

总结

shell脚本中的数学运算,在后面写shell脚本中经常使用,尤其是递增,递减,以及判断是否相等。

我是沐风晓月,我在csdn等你。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高数基础6

目录 导数与微分 导数的定义式&#xff1a; 导数的第二个定义式&#xff1a; 左右导数 区间内可导 例题&#xff1a; 例题2&#xff1a; 微分 微分的概念 例题&#xff1a; 导数的几何意义&#xff1a; 切线方程与法线方程 例题&#xff1a; 连续可导可微之间的关系…

短视频矩阵系统源码开发部署分享

短视频矩阵系统源码开发需要用到以下技术&#xff1a; 1.前端技术&#xff1a;HTML、CSS、JavaScript、Vue.js等前端框架。 2.后端技术&#xff1a;Java、Python、PHP等后端语言及相关框架&#xff0c;如Spring Boot、Django、Laravel等。 3.移动开发技术&#xff1a;Androi…

文本匹配模型实验报告-text2vec

文本匹配模型实验报告-text2vec 尽管基于BERT的模型在NLP诸多下游任务中取得了成功&#xff0c;直接从BERT导出的句向量表示往往被约束在一个很小的区域内&#xff0c;表现出很高的相似度&#xff0c;因而难以直接用于文本语义匹配。为解决BERT原生句子表示这种“坍缩”现象&a…

软件开发流程的演变:敏捷开发(XP、SCRUM)、DevOps(CI/CD)的概念

一、软件开发流程的演变 二、传统瀑布模型 1.瀑布模型特点 软件开发的各项活动严格按照线性方式进行 当前活动接受上一项活动的工作结果 当前活动的工作结果需要进行验证 2.瀑布模型优缺点 优点 开发的各个阶段比较清晰 强调早期计划及需求调查 适合需求稳定的产品开发 缺点…

权限获得第一步

根据题目提示flag就是某个密码&#xff0c;并且flag不是常规形式 打开文件后看起来是一个linux的用户密码段 反正最后两个最可疑了&#xff0c;linux中密码的存储形式是MD5加密 第一个数据解码失败 第二个密文解密成功 果然不是常规形式&#xff0c;常规的flag一本都是是英文加…

在Linux系统下使用Ventoy制作Windows安装U盘

文章目录 介绍Ventoy 简介PE 简介 制作 Ventoy U 盘安装 Ventoy将 Ventoy 安装到 U 盘 制作 PE 辅助系统下载优启通下载操作系统 ISO 镜像 安装操作系统准备工作安装系统 介绍 Ventoy 简介 Ventoy 是一个制作可启动 U 盘的开源工具。有了 Ventoy &#xff0c;就无需反复地格式…

IDE/记录VS2015WinSDK安装过程中增删的系统组件和环境变量

文章目录 概述看看"干净OS环境"安装VS软件后系统目录变化环境变量变化新增的组件程序 Qt及其VS插件安装后安装WinSDK后安装Win10SDK前安装WinSDK后 卸载VS2015其他软件的影响 概述 本文旨在&#xff0c;通过记录干净OS环境下 VS2015、Qt、WinSDK 软件安装前后&#…

使用mount临时挂载出现mount error(13): Permission denied

问题报错 mount error(13): Permission denied Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) //报错信息&#xff0c;提示账号密码错误&#xff0c;其实并不是 添加secntlmssp参数即可&#xff1b;中途可能需要等一些时间 mount -t cifs -o usernamelisi,p…

在低配Windows上部署原版llama.cpp

现在大语言模型的部署&#xff0c;通常都需要大的GPU才能实现&#xff0c;如果是仅仅想研究一下&#xff0c;大语言模型的算法&#xff0c;我们是很想能够直接在我们的工作电脑上就能直接运行的&#xff0c;llama.cpp就是很好的实现。 LLaMa.cpp使用int4这种数值格式&#xff…

【js步骤引导】基于jquery实现步骤引导进度条效果(附源码)

【写在前面】 步骤引导条这个功能其实在我们很多业务系统中是最常见的&#xff0c;尤其是快递订单、审批流程、上传资源等涉及步骤操作的业务中广泛应用&#xff0c;因此今天我也详细的和大家讲讲如何基于jquery去实现步骤引导效果&#xff0c;支持上一步下一步的切换。 【涉…

【云计算】HBase表操作

文章目录 前言一、shell创建二、操作 前言 HBase是一个分布式、可扩展的、非关系型的NoSQL数据库。它是建立在Hadoop HDFS上的一个开源的数据库管理系统。HBase的设计目标是提供高可靠性、高可扩展性、高性能、高延迟、高容错性和高可用性。 HBase是一种面向列的数据库&#…

【多智能体合作】Self-Organized Group for Cooperative Multi-agent Reinforcement Learning

【多智能体合作】Self-Organized Group for Cooperative Multi-agent Reinforcement Learning 本文提出了一个自主分组机制&#xff0c;这种机制具有 选举指挥官&#xff08;CE&#xff09; 和 消息总结&#xff08;MS&#xff09; 的功能。 在 CE 中&#xff0c;每隔 T个时间步…

【无标题】机器学习——朴素贝叶斯

朴素贝叶斯&#xff08;Naive Bayesian algorithm&#xff09;是有监督学习的一种分类算法&#xff0c;它基于“贝叶斯定理”实现&#xff0c;该原理的提出人是英国著名数学家托马斯贝叶斯。 一、贝叶斯定理 P(A) 这是概率中最基本的符号&#xff0c;表示 A 出现的概率。比如在…

Spark 4/5

4. 启动Spark Shell编程 4.1 什么是Spark Shell spark shell是spark中的交互式命令行客户端&#xff0c;可以在spark shell中使用scala编写spark程序&#xff0c;启动后默认已经创建了SparkContext&#xff0c;别名为sc 4.2 启动Spark Shell Shell /opt/apps/spark-3.2.3-bi…

实战深入了解redis+消息队列如何实现秒杀

SpringBoot Redis RabbitMQ 实现高并发限时秒杀 所谓秒杀&#xff0c;从业务角度看&#xff0c;是短时间内多个用户“争抢”资源&#xff0c;这里的资源在大部分秒杀场景里是商品&#xff1b;将业务抽象&#xff0c;技术角度看&#xff0c;秒杀就是多个线程对资源进行操作&…

配置NIS服务器及客户端

在服务端安装所需软件包 设置主机名和NIS域名 编辑 NIS服务器主配置文件 最下面编辑访问控制 建立测试用户 配置NFS&#xff0c;否则客户端切换用户时&#xff0c;用户没有家目录 安装NFS所需软件包 Nfs-utils 给两个共享目录权限&#xff0c;编辑NFS配制文件 共享两个目录 重…

12.JavaWeb-Spring Boot + 物业管理项目

1.Spring Boot 概念 自动处理应用程序幕后的各种杂事&#xff08;Spring框架的应用程序的配置和部署过程&#xff09;&#xff0c;让你专注于做那些使应用程序独特的工作 1.1 Spring Boot的核心功能 1.1.1 自动配置 Spring Boot根据应用程序的依赖和配置信息&#xff0…

计算机网络——自顶向下方法(第二章学习记录)

本章学习应用层 网络应用是计算机网络存在的理由。 网络应用程序体系结构 现代网络应用程序有两种主流体系结构&#xff1a;客户—服务器体系结构和对等(P2P)体系结构 客户—服务器体系结构&#xff08;client-server )&#xff0c;在这个结构中&#xff0c;有一个总是打开的…

SAP CAP篇五:为CAP添加Fiori Elements程序(2)

本文目录 本系列之前的文章新建Fiori Elements Application选择Application TypeData SourceEntity SelectionProject InformationLaunchpad Setting 修改manage-books文件夹子文件夹 webapp重命名 annotations.cds更新fiori-service.cdsmanifest.json 添加services.cds到app文…

哈工大计算机网络课程传输层协议之:拥塞控制原理剖析

哈工大计算机网络课程传输层协议之&#xff1a;拥塞控制原理剖析 文章目录 哈工大计算机网络课程传输层协议之&#xff1a;拥塞控制原理剖析拥塞成因和代价&#xff1a;场景1拥塞成因和代价&#xff1a;场景2拥塞成因和代价&#xff1a;场景3如何进行拥塞控制拥塞控制的方法TCP…