Linux Shell 脚本编程基础知识篇—shell 运算命令详解

ℹ️大家好,我是练小杰,本文继续Linux shell脚本编程的基础知识内容,接着讲算术运算命令的详细操作~~
复习:【shell简介以及基本操作】
更多Linux 相关内容请点击👉“Linux专栏”~

在这里插入图片描述

文章目录

  • let运算命令的用法
    • let 的高级用法
    • ⚠️注意
  • expr命令的用法
    • expr中用反引号计算表达式
    • expr计算字符串的长度
  • bc命令的用法
    • bc 的基本用法
    • 非交互模式
    • bc 的常用选项
  • $[]符号的运算
  • 读取从键盘输入的数据(read命令)
    • 举例
    • 利用read命令进行shell变量运算

在这里插入图片描述

let运算命令的用法

let命令的语法: let 赋值表达式
let赋值表达式的功能等同于“((赋值表达式))

  • 举例
#!/bin/bash
a=3
b=4
let c=a*b
echo $c   #输出:12 
((z=a*b)) 
echo "$z"  #输出:12 

let 的高级用法

  • 复合赋值
#!/bin/bash
a=3
b=4
let "a += b"  # 等同于 a = a + b
echo $a    #输出:7
  • 逻辑运算
    let 可以执行逻辑运算,如 &&(逻辑与)、||(逻辑或)、!(逻辑非)等
#!/bin/bash
a=3
b=4
c=0
#  let 进行逻辑运算
let "result = a > b && c == 0"
echo $result  # 输出: 0 (表示 false)

let "result = a < b || c != 0"
echo $result  # 输出: 1 (表示 true)
  • 位运算
    let 也支持位运算,如 &(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)
#!/bin/bash

a=5   #二进制: 0101
b=3   #二进制: 0011

#使用 let 进行位运算
let "c = a & b"
echo $c  
# 输出: 1 (因为 0101 & 0011 = 0001)

let "c = a | b"
echo $c  
# 输出: 7 (因为 0101 | 0011 = 0111)

let "c = a ^ b"
echo $c  
# 输出: 6 (因为 0101 ^ 0011 = 0110)

let "c = ~a"
echo $c  
# 输出: -6 (因为 ~0101 = 1010, 在补码表示中为 -6)

let "c = a << 1"
echo $c  
# 输出: 10 (因为 0101 << 1 = 1010)

let "c = a >> 1"
echo $c  
# 输出: 2 (因为 0101 >> 1 = 0010)
  • 自增和自减
#!/bin/bash
a=1
# let 进行自增
let "a++"
echo $a  # 输出: 2

# let 进行自减
let "a--"
echo $a  # 输出: 1

⚠️注意

  1. 空格问题
    使用 let 时,如果表达式中包含空格,必须使用引号将表达式括起来,否则会导致语法错误
let "a = a + 1"  # 正确
let a=a+1        #表达式不能有空格
let a = a + 1    # 错误
  1. 变量作用域
    let 是在当前 Shell 环境中执行的,因此修改变量的值会影响到后续的脚本执行

  2. let 只能处理整数运算,如果需要进行浮点运算,可以使用 bc 或其他工具。

expr命令的用法

expr(evaluate (求值) expressions (表达式)) 命令既可以用于整数运算,也可以用于相关字符串长度、匹配等的运算处理。
在使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则会报错。

expr 2 + 1  #输出:3
expr 3 \* 3   #输出: 9
#使用乘号时,必须使用反斜线屏蔽其特定含义,否则shell可能会误解*号的含义

expr中用反引号计算表达式

#!/bin/bash
i=5
i=`expr $i + 2`
echo $i #输出: 7

expr计算字符串的长度

str="my CSDN is Lxj"
expr length "$str"  #输出:14
echo ${#str}  		 #输出:14

bc命令的用法

bc是unix/Linux下的计算器,因此,除了可以作为计算器来使用,还可以作为命令行计算工具使用。
bc具有的特殊性来看,如果是小数,则选择bc运算没有问题,若是整数场景,可用“(())”、let、expr等。

  • 例子:
[root@lian ~]# bc  
2+5
7
[root@lian ~]# i=`echo "scale=4;3.2/1.3" | bc` 
该表达式的意思: 计算3.2/1.3的值,然后将该值保留4位小数  
[root@lian ~]# echo $i 
2.4615 

bc 的基本用法

  • 直接在终端输入 bc 命令,可以进入交互式计算器模式
$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1 + 1
2
5 / 2
2
scale=2
3 / 2
1.50
quit

非交互模式

使用 echoprintf 将表达式传递给 bc

# 基本运算
echo "1 + 1" | bc
# 输出: 2

echo "5 / 2" | bc
# 输出: 2

# 设置小数点精度
echo "scale=2; 5 / 2" | bc
# 输出: 2.50

# 复杂运算
echo "scale=5; (3.14 * 2) / 7" | bc
# 输出: .89714

bc 的常用选项

-l--mathlib :加载数学库,提供更多的数学函数,如 s(正弦)、c(余弦)、a(反正切)、l(自然对数)、e(指数函数)等。

echo "scale=5; s(3.1415926535 / 2)" | bc -l
#输出: 1.00000

-q 或 --quiet:静默模式,不显示欢迎信息和警告信息

echo "1 + 1" | bc -q
# 输出: 2

$[]符号的运算

#!/bin/bash
i=$[2+5]
echo $i #输出:7

读取从键盘输入的数据(read命令)

  • read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

  • read 命令语法:read [-options] [variables]

  • options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。

  • optionsvariables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

  • read命令的参数
    在这里插入图片描述

举例

[root@lian ~]# read -p "Input a string:" str
Input a string:I am LXJ!
[root@lian ~]# echo $str 
I am LXJ!

利用read命令进行shell变量运算

[root@lian ~]# read -p "Please Input a integer:"i= i
Please Input a integer:i=6
[root@lian ~]# read -p "Please Input a integer:"j= j
Please Input a integer:j=4
[root@lian ~]# echo $[i+j]
10

想要了解更多内容点击👉“练小杰的CSDN”!!!
今天星期一,再坚持4天就是星期五了!!!💪
明天见,各位大佬!!😄

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx单向链表 ngx_list_t

目录 基本概述 数据结构 接口描述 具体实现 ngx_list_create ngx_list_init ngx_list_push 使用案例 整理自 nginx 1.9.2 源码 和 《深入理解 Nginx&#xff1a;模块开发与架构解析》 基本概述 Nginx 中的 ngx_list_t 是一个单向链表容器&#xff0c;链表中的每一个节…

KVM虚拟机管理脚本

思路&#xff1a; 在/opt/kvm下创建一个磁盘文件&#xff0c;做差异镜像&#xff0c;创建一个虚拟机配置文件&#xff0c;做虚拟机模版 [rootnode01 ~]# ls /opt/kvm/ vm_base.qcow2 vm_base.xml创建虚拟机的步骤&#xff1a;首先创建虚拟机的差异镜像&#xff0c;然后复制虚…

芯片Tapeout power signoff 之IR Drop Redhawk Ploc文件格式及其意义

数字IC后端工程师在芯片流程最后阶段都会使用redhawk或voltus进行设计的IR Drop功耗signoff分析。必须确保静态&#xff0c;动态ir drop都符合signoff标准。 在做redhawk ir drop分析前&#xff0c;我们需要提供一个redhawk ploc供电点坐标。 数字IC设计后端实现前期预防IR D…

流批一体向量化计算引擎 Flex 在蚂蚁的探索和实践

编者按&#xff1a;Flex是蚂蚁数据部自研的一款流批一体的向量化引擎&#xff0c;Flex是Fink和Velox的全称&#xff0c;也是Flexible的前缀&#xff0c;被赋予了灵活可插拔的寓意。本文将重点从向量化技术背景、Flex架构方案和未来规划三个方面展开论述。 作者介绍&#xff1a;…

Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集I-FGSSM介绍I-FGSSM代码实现I-FGSSM算法实现攻击效果 代码汇总ifgssm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch…

全面Kafka监控方案:从配置到指标

文章目录 1.1.监控配置1.2.监控工具1.3.性能指标系统相关指标GC相关指标JVM相关指标Topic相关指标Broker相关指标 1.4.性能指标说明1.5.重要指标说明 1.1.监控配置 开启JMX服务端口&#xff1a;kafka基本分为broker、producer、consumer三个子项&#xff0c;每一项的启动都需要…

HTML制作一个普通的背景换肤案例2024版

一&#xff0c;完整的代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>换肤</t…

《计算机组成及汇编语言原理》阅读笔记:p86-p115

《计算机组成及汇编语言原理》学习第 6 天&#xff0c;p86-p115 总结&#xff0c;总计 20 页。 一、技术总结 1.if statement 2.loop 在许多编程语言中&#xff0c;有类种循环&#xff1a;一种是在程序开头检测条件(test the condition),另一种是在程序末尾检测条件。 3.C…

CSS(三)盒子模型

目录 Content Padding Border Margin 盒子模型计算方式 使用 box-sizing 属性控制盒子模型的计算 所有的HTML元素都可以看作像下图这样一个矩形盒子&#xff1a; 这个模型包括了四个区域&#xff1a;content&#xff08;内容区域&#xff09;、padding&#xff08;内边距…

MySQL外键类型与应用场景总结:优缺点一目了然

前言&#xff1a; MySQL的外键简介&#xff1a;在 MySQL 中&#xff0c;外键 (Foreign Key) 用于建立和强制表之间的关联&#xff0c;确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。 主要体现在引用操作发生变化时的处理方式&…

MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版

目录 引入&#xff1a; null 与not null default&#xff1a; comment列描述 &#xff1a; not null 和 default&#xff1a; zerofill &#xff1a; 主键&#xff1a;primary key 复合主键&#xff1a; 自增长:auto_increment 唯一键&#xff1a;unique key 外键&a…

基于NodeMCU的物联网窗帘控制系统设计

最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;仿智能家居&#xff09;”项目中的“家电控制设计”中的“窗帘控制”子项目&#xff0c;最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…

Webpack在Vue CLI中的应用

webpack 作为目前最流行的项目打包工具&#xff0c;被广泛使用于项目的构建和开发过程中&#xff0c;其实说它是打包工具有点大材小用了&#xff0c;我个人认为它是一个集前端自动化、模块化、组件化于一体的可拓展系统&#xff0c;你可以根据自己的需要来进行一系列的配置和安…

java日志框架:slf4j、jul(java.util.logging)、 log4j、 logback

SLF4J--抽象接口 SLF4J (Simple Logging Facade for Java) 是一个为各种 Java 日志框架提供简单统一接口的库。它的主要目的是将应用程序代码与具体的日志实现解耦&#xff0c;使得在不修改应用程序代码的情况下&#xff0c;可以轻松地切换不同的日志框架。 jul-to-slft4j.ja…

命令行之巅:Linux Shell编程的至高艺术(中)

文章一览 前言一、输入/输出及重定向命令1.1 输入/输出命令1.1.1 read命令1.1.2 echo命令 1.2 输入/输出重定向1.3 重定向深入讲解1.4 Here Document1.4.1 /dev/null 文件 二、shell特殊字符和命令语法2.1 引号2.1.1 双引号2.1.2 单引号2.1.3 倒引号 2.2 注释、管道线和后台命令…

一文理解机器学习中二分类任务的评价指标 AUPRC 和 AUROC

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在机器学习的二分类任务中&#xff0c;评估模型性能是至关重要的一步。两种常用的评价指标是 Precision-Recall Curve 下的面积 (AUPRC) 和 Receiver Operating Characteristic Curve 下的面积 (AUROC)…

Visual Studio Code(VS Code)配置C/C++环境

一、Visual Studio Code安装 Visual Studio Code&#xff0c;下文中简称为VS Code的详细安装方法请参考VSCode安装教程&#xff08;超详细&#xff09;-CSDN博客 二、MinGW编译器下载与配置 1、MinGW介绍 MinGW(Minimalist GNU for Windows)是一款用于Windows 平台的轻…

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码&#xff0c;配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言&#xff0c;使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容&#xff0c;让程序员开发思路更加清晰化&#xff0c;VUE在设计组件时&#xff0c;它是可以重用的…

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备&#xff0c;需求是读取m1卡&#xff0c;厂家给了个安卓原生demo&#xff0c;接入arr插件如下&#xff0c;接入后发现还是少了一部分代码&#xff0c;设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录&#xff0c;最后面是解决办法&#xf…

C项目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…