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

news2024/12/24 18:58:22

ℹ️大家好,我是练小杰,本文继续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天就是星期五了!!!💪
明天见,各位大佬!!😄

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

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

相关文章

2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36)

参考:2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36) ubantu20.04&#xff0c;mysql5.7.13 navicat 远程连接数据库报错 2002 - Can’t connect to server on ‘192.168.1.61’ (36) 一、查看数据库服务是否有启动&#xff0c;发现有启动 systemctl status mysql…

GitCode 光引计划投稿|MilvusPlus:开启向量数据库新篇章

在人工智能和大数据时代&#xff0c;向量数据库作为处理非结构化数据的核心技术&#xff0c;正变得越来越重要。MilvusPlus&#xff0c;作为「光引计划」的一部分&#xff0c;应运而生&#xff0c;旨在提供一个高性能、易扩展、全功能的向量数据库解决方案。项目背景根植于对现…

一起学Git【第四节:添加和提交文件】

通过前三节的学习,基本上对Git有了初步的了解,下面开始进行文件的添加和提交的流程。 这里主要涉及四个命令: git init 创建仓库git status查看仓库状态git add添加至暂存区git commit提交文件之前已经使用过git init命令了,此处不再具体讲解。参照一起学Git【第二节:创建…

RISC-V架构的压缩指令集介绍

1、压缩指令集介绍 RISC-V的压缩指令集&#xff08;C扩展&#xff09;‌是一种设计用于减少代码大小和提高性能的技术。标准的RISC-V指令是32位&#xff0c;压缩指令集可以将部分32位的指令用16位的指令替代&#xff0c;从未减小程序占用存储空间的大小&#xff0c;提高指令密…

CosyVoice安装过程详解

CosyVoice安装过程详解 安装过程参考官方文档 前情提要 环境&#xff1a;Windows子系统WSL下安装的Ubunt22.4python环境管理&#xff1a;MiniConda3git 1. Clone代码 $ git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git # 若是submodule下载失败&…

docker 容器的基本使用

docker 容器 一、docker是什么&#xff1f; 软件的打包技术&#xff0c;就是将算乱的多个文件打包为一个整体&#xff0c;打包技术在没有docker容器之前&#xff0c;一直是有这种需求的&#xff0c;比如上节课我把我安装的虚拟机给你们打包了&#xff0c;前面的这种打包方式是…

【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用

引言 在上一篇文章中&#xff0c;我们详细介绍了ResNet与GoogLeNet的网络结构、设计理念及其在图像分类中的应用。本文将继续深入探讨如何在实际项目中应用这些模型&#xff0c;特别是如何保存训练好的模型、加载模型以及使用模型进行新图像的预测。通过这些步骤&#xff0c;读…

被裁20240927 --- 嵌入式硬件开发 前篇

前篇主要介绍一些相关的概念&#xff0c;用于常识扫盲&#xff0c;后篇开始上干货&#xff01; 他捧着一只碗吃过百家的饭 1. 处理器芯片1.1 处理器芯片制造商一、 英特尔&#xff08;Intel&#xff09;二、 三星&#xff08;SAMSUNG&#xff09;三、 高通&#xff08;Qualcomm…

【uni-app】2025最新uni-app一键登录保姆级教程(包含前后端获取手机号方法)(超强避坑指南)

前言&#xff1a; 最近在配置uni-app一键登录时遇到了不少坑&#xff0c;uni-app的配套文档较为混乱&#xff0c;并且有部分更新的内容也没有及时更改在文档上&#xff0c;导致部分开发者跟着uni-app配套文档踩坑&#xff01;而目前市面上的文章质量也层次不齐&#xff0c;有的…

C# 范围判断函数

封装范围函数 public static class CommonUtil {/// <summary>/// 范围判断函数&#xff0c;检查给定的值是否在指定的最小值和最大值之间。/// 例如&#xff0c;可以用来判断当前日期是否在开始日期和结束日期之间。/// 该方法适用于任何实现了 IComparable 接口的类型…

一起学Git【第五节:git版本回退】

git reset 是 Git 版本控制系统中一个非常强大的命令&#xff0c;它可以用来重置当前分支到指定的状态&#xff0c;即执行撤销操作或者回退至之前的某一版本&#xff0c;他可以回退至之前的某一个提交状态。有三种主要的用法&#xff1a;git reset --soft&#xff1b;git reset…

谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持

问题现象 在Chrome 高版本上的扩展管理页面&#xff08;地址栏输入chrome://extensions/或者从界面进入&#xff09;&#xff1a; &#xff0c; 可以查看到扩展的情况。 问题现象大致如图: 问题原因 出现此问题的根本原因在于&#xff1a;谷歌浏览器本身的扩展机制发生了…

国标GB28181-2022平台EasyGBS:安防监控中P2P的穿透方法

在安防监控领域&#xff0c;P2P技术因其去中心化的特性而受到关注&#xff0c;尤其是在远程视频监控和数据传输方面。P2P技术允许设备之间直接通信&#xff0c;无需通过中央服务器&#xff0c;这在提高效率和降低成本方面具有明显优势。然而&#xff0c;P2P技术在实际应用中也面…

Go1.21.0 到 Go1.23.0 的改动,向前兼容性和toolchain规则,Go1.21.0,必须升级你的Go啦

Go各版本Release Note Go1.21.0 2023-08-08 https://go.dev/doc/go1.21 内置方法 min & max&#xff1a;返回一个序列中的最大值最小值。 https://go.dev/ref/spec#Min_and_max clear&#xff1a;清空map和slice。 https://go.dev/ref/spec#Clear 标准库 log/slo…

springboot472基于web网上村委会业务办理系统(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网上村委会业务办理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

数据库压力测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 很多人提到 jmeter 时&#xff0c;只会说到 jmeter进行接口自动化或接口性能测试&#xff0c;其实jmeter还能对数据库进行自动化操作。个人常用的场景有以下&#…

深度学习中,用损失的均值或者总和反向传播的区别

如深度学习中代码&#xff1a; def train_epoch_ch3(net, train_iter, loss, updater):"""The training loop defined in Chapter 3."""# Set the model to training modeif isinstance(net, torch.nn.Module):net.train()# Sum of training lo…

UML图【重要】

文章目录 2.1 类图概述2.2 类图的作用2.3 类图表示法2.3.1 类的表示方式2.3.2 类与类之间关系的表示方式2.3.2.1 关联关系2.3.2.2 聚合关系2.3.2.3 组合关系2.3.2.4 依赖关系2.3.2.5 继承关系2.3.2.6 实现关系 统一建模语言&#xff08;Unified Modeling Language&#xff0c;U…

Flask中@app.route()的methods参数详解

诸神缄默不语-个人CSDN博文目录 在 Flask 中&#xff0c;app.route 是用于定义路由的核心装饰器&#xff0c;开发者可以通过它为应用指定 URL 映射及相应的处理函数。在处理 HTTP 请求时&#xff0c;不同的业务场景需要支持不同的 HTTP 方法&#xff0c;而 app.route 的 metho…

JavaSE---String(含一些源码)

&#xff08;一&#xff09;字符串构造 我们如何创建一个String类型的对象&#xff1f;有三种&#xff1a; String s1new String("hello"); //直接new一个String对象String s2"hello"; //使用常量串构造final char[] chars {h,e,l,l,o}; Strin…