【Shell 脚本速成】05、Shell 运算详解

news2025/7/15 8:45:54

目录

一、赋值运算

二、算术运算[四则运算]

2.1 运算符与命令

2.2 整形运算

expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格

let命令:只能做整数运算,且运算元素必须是变量,无法直接对整数做运算

双小圆括号运算,在shell中(( ))也可以用来做数学运算

2.3 浮点运算

2.4 练习案例

三、比较运算

3.1 整形比较运算

3.2 字符串比较运算

3.2.1 字符串比较运算符

3.2.2 比较两个字符串关系

3.2.3 练习案例

四、逻辑运算

4.1 逻辑运算应用场景

4.2 逻辑运算符

4.3、练习案例

4.3.1 写一个升级版的仿真用户登录系统。

五、文件判断[文件类型、权限、新旧判断]

5.1 test 判断命令


 

计算机编程就是三大步:输入、运算、输出

那么计算机运算有哪些呢,计算机能做哪些运算呢?

我们来看看常见的计算机运算

一、赋值运算

赋值运算符等于号         "="

把等号右边的数字或字符串等赋值给左边的变量。

 	a=10   
 	name='baism'
 
 重点:字符串必须用引号引起来

二、算术运算[四则运算]

2.1 运算符与命令

四则运算符: + - * \ 【加减乘除】
扩展: % ** 【取余 次方】

运算命令:

  • 整形运算
    – expr
    – let
    – $(())
    – bc
  • 浮点运算
    – bc

2.2 整形运算

expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格

[root@shell ~]# expr 100 + 3
103
[root@shell ~]# expr 100 - 3
97
[root@shell ~]# expr 100 * 3    # 注意 * 出现应该加 \ 转义字符,否则认为是通配符
expr: 语法错误
[root@shell ~]# expr 100 \* 3
300
[root@shell ~]# expr 100 / 3
33
[root@shell ~]# expr 100 % 3
1

let命令:只能做整数运算,且运算元素必须是变量,无法直接对整数做运算

# 运算符号两边不需要空格,且 * 不需要加 \ 转移字符
[root@shell ~]# let a=100+3;echo $a
103
[root@shell ~]# let a=100-3;echo $a
97
[root@shell ~]# let a=100*3;echo $a
300
[root@shell ~]# let a=100/3;echo $a
33
[root@shell ~]# let a=100%3;echo $a
1
[root@shell ~]# let a=100**3;echo $a
1000000

# 变量的自增自减运算
[root@shell ~]# a=100
[root@shell ~]# let a++;echo $a    # 等价于 a=$a+1
101
[root@shell ~]# let a--;echo $a
100
[root@shell ~]# let a-=3;echo $a    # 等价于 a=$a-3
97
[root@shell ~]# let a+=5;echo $a
102

双小圆括号运算,在shell中(( ))也可以用来做数学运算

[root@shell ~]# echo $((100+3))
103
[root@shell ~]# echo $((100-3))
97
[root@shell ~]# echo $((100*3))
300
[root@shell ~]# echo $((100/3))
33
[root@shell ~]# echo $((100%3))
1
[root@shell ~]# echo $((100**3))
1000000

2.3 浮点运算

浮点运算是采用命令组合的方式来实现的:echo "scale=n;运算表达式" | bc

# 使用 bc 文本计算器处理浮点运算,其中 scale=2 代表小数点保留两位
[root@shell ~]# yum install -y bc

# 组合命令
[root@shell ~]# echo "scale=2;100/3" | bc
33.33

2.4 练习案例

内存使用率统计,要求打印内存使用率

案例思考:

  1. 内存总量。获得方式:free         top         cat/proc/meminfo
  2. 内存使用量
  3. 内存使用率公式:使用量/总量*100%

实现步骤:

  1. 获取内存总量
  2. 获取内存使用量
  3. 运算输出结果

实现代码

[root@shell ~]# vi memory_used.sh
#!/bin/bash
#Description:内存使用率计算脚本

#1、获得内存总量
memory_total=`free | grep -i "mem:" | tr -s " " | cut -d " " -f 2`

#2、获得内存使用的量
memory_used=`free | grep -i "mem:" | tr -s " " | cut -d " " -f 3`

#3、计算输出
#运算的时候是否需要小数点 浮点运算,要考虑使用的命令 (难点 重点)
#echo "内存使用率: $((memory_used*100/memory_total))%"
#难点:浮点运算中,同优先级,大数除以小数情况下,先乘后除,尽可能保证精确
echo "内存使用率: `echo "scale=2;$memory_used*100/$memory_total" | bc`%"

实现效果 

三、比较运算

        计算机除了算术和赋值运算外,还有比较运算,比如说比较两个数的关系,比较两个字符串的关系【如在用户登录系统】等。接下来我们学习如何在shell中进行比较运算

3.1 整形比较运算

# 运算符解释:

 精确比较:
        -eq         等于 equal

        -gt         大于

        -lt         小于

 模糊比较:
        -ge         大于或等于

        -le         小于或等于

        -ne         不等于

通过test命令比较两个整数关系

# linux命令 test只能比较两个整数的关系,不会返回结果,需要通过$?才能看到结果;0为true,1为false
[root@shell ~]# test 100 -eq 3;echo $?
1
[root@shell ~]# test 100 -eq 100;echo $?
0
[root@shell ~]# test 100 -gt 3;echo $?
0
[root@shell ~]# test 100 -lt 3;echo $?
1
[root@shell ~]# test 100 -ge 3;echo $?
0
[root@shell ~]# test 100 -le 3;echo $?
1
[root@shell ~]# test 100 -ne 3;echo $?
0

3.2 字符串比较运算

3.2.1 字符串比较运算符

# 运算符解释,注意字符串一定别忘了使用引号引起来
  ==          等于   
  !=          不等于
  -n          检查字符串的长度是否大于0  
  -z          检查字符串的长度是否为0

3.2.2 比较两个字符串关系

[root@shell ~]# test 'root' == 'root';echo $?
0
[root@shell ~]# test 'root' == 'roo0t';echo $?
1
[root@shell ~]# test 'root' != 'roo0t';echo $?
0
[root@shell ~]# test -z 'root';echo $?
1
[root@shell ~]# test -z '';echo $?
0
[root@shell ~]# test -n '';echo $?
1
[root@shell ~]# test -n '1';echo $?
0

3.2.3 练习案例

案例需求:
模拟一个linux文本界面登陆程序,要求账号密码验证成功进入系统,账号密码验证失败退回登陆界面

案例思考:

  1. 熟悉linux文本界面登陆步骤
  2. 熟悉字符串比较运算

案例步骤:

  1. 预设正确账号、密码
  2. 输出提示登录信息并实现交互登录
  3. 输出密码输入信息并实现交互
  4. 判断输入是否正确
    4.1)正确,进入系统
    4.2)不正确 继续运行该脚本

实现代码

[root@shell ~]# vi login.sh
#!/bin/bash

#1. 设置默认密码
default_account='root'
default_pw='123456'

#2. 清屏
clear

#3. 打印Linux登录信息
echo "CentOS Linux 7 (Core)"
echo -e "Kernel `uname -r` on `uname -m`"

#4. 交互输入登陆名
echo -n "$HOSTNAME login: "
read account

#5. 交互输入登录密码
echo -n  "password: "
read -s -t 18 -n 16 pw
echo

#read -s -t 10 -p "Passwprd: " pw
#echo

#6. 判断用户输入是否正确
if [ "$default_account" == "$account" ] && [ "$default_pw" == "$pw" ];then
   clear
   echo -e "\nwelcome to root"
else
   echo  "用户名或密码错误..."
   # 输入错误,则再次调用本脚本
   sh $0
fi

实现效果

四、逻辑运算

        完成一个任务中需要多个条件都满足或者多个条件中只要满足一个即可,那么这就是我们的逻辑运算。通过多个条件判断结果,才能得出结论

4.1 逻辑运算应用场景

多条件同时判断

4.2 逻辑运算符

  • ​ 逻辑与运算 &&
  • ​ 逻辑或运算 ||
  • ​ 逻辑非运算 !

逻辑运算秘籍

逻辑运算注意事项:
    逻辑与、或 运算都需要两个或以上条件
    逻辑非运算只能一个条件。
    口诀:    
        逻辑与运算               真真为真  真假为假   假假为假
        逻辑或运算               真真为真  真假为真   假假为假
        逻辑非运算               非假即真  非真即假
             
             
逻辑与或的短路运算:
逻辑与中靠前的条件中出现了假,后面的就不在判断了,因为已经是假的了
逻辑或中靠前的条件中出现了真,后不在往后判断了,结果已经为真了

4.3、练习案例

        明白了逻辑运算符和逻辑运算的口诀和短路运算后,我们来通过练习加深理解,接下来我们来看一个案例。

        上一个字符串运算练习案例(3.2.3)中我们练习的是仿真用户登录,判断登陆的方式是分步判断的,既先判断用户名,不管是否正确都会继续判断密码的正确性,这样是两步判断,既然已知用户名是错误的啦,完全没必要在判断密码的正确性了,因为结果都一样,你不能进入系统。既然判断一个用户输入的用户名和密码是否正确,且一个不正确就不能进入系统,那么我们可以这么去思考一下:两个条件全为真则进入系统,两个条件一个为假则重新登陆。这样是不是就满足了逻辑与运算了,同时思考逻辑与运算的短路运算,逻辑与条件中的判断顺序是从前往后,前边一个条件为假的时候,后边的条件就不用判断了,那么就减少了判断的次数,加快了运算速度。你品!你细品!!是不是这个道理。

4.3.1 写一个升级版的仿真用户登录系统。

案例需求
使用逻辑运算写一个仿真用户登录验证程序

案例思路

  1. 输入用户名
  2. 输入密码
  3. 与运算返回结果

案例代码

#!/bin/bash
echo "CentOS linux 7 (Core)"
echo -e "Kernel `uname -r` on an `uname -m` \n"

#1、输入用户名
echo -n "$HOSTNAME login: "
read myuser

#2、输入密码
read -p "password: " -s -t 20 -n 6 pw

#3、与运算返回结果
[ $myuser == 'root' ] && [ $pw == '123456' ] && echo "root 登录成功" || echo "用户名或密码错误"

五、文件判断[文件类型、权限、新旧判断]

        linux的设计思路:一切皆文件,对文件系统的操作其实可以狭隘的理解为对文件的操作。如果希望对文件类型和权限或者两个文件做新旧或者是否同一个文件进行判断。

5.1 test 判断命令

命令功能: 检测文件类型和比较运算

命令用法:test [命令选项] 表达式

命令选项:

-d  检查文件是否存在且为目录
-e  检查文件是否存在
-f  检查文件是否存在且为文件
-r  检查文件是否存在且可读
-s  检查文件是否存在且不为空
-w  检查文件是否存在且可写
-x  检查文件是否存在且可执行
-O  检查文件是否存在并且被当前用户拥有
-G  检查文件是否存在并且默认组为当前用户组
-nt file1 -nt file2  检查file1是否比file2新(指创建日期)
-ot file1 -ot file2  检查file1是否比file2旧     
-ef file1 -ef file2  检查file1是否与file2是同一个文件,判定依据的是i节点(ls -il filename)

# 以上只列出部分命令选项,详细的可以通过 man test 命令获得。

命令用法练习

# 文件类型判断
[root@shell ~]# test -f /etc/passwd;echo $?
0
[root@shell ~]# test -f /etc;echo $?
1
[root@shell ~]# test -d /etc;echo $?
0

# 文件权限判断
[root@shell ~]# test -x /root/anaconda-ks.cfg ;echo $?
1
[root@shell ~]# ll anaconda-ks.cfg 
-rw-------. 1 root root 1356 10月 21 14:54 anaconda-ks.cfg
[root@shell ~]# test -r /root/anaconda-ks.cfg ;echo $?
0
[root@shell ~]# test -w /root/anaconda-ks.cfg ;echo $?
0

# 两个文件的判断
[root@shell ~]# ls -il
34330826 -rw-r--r--  1 root root   34 11月 22 16:45 test_02.sh
34330841 -rwxr-xr-x  1 root root  398 11月 22 13:51 test.sh
[root@shell ~]# test test_02.sh -nt test.sh ;echo $?
0
[root@shell ~]# test test_02.sh -ot test.sh ;echo $?
1
[root@shell ~]# test test_02.sh -ef test.sh ;echo $?
1

上一篇文章:【Shell 脚本速成】04、Shell 脚本格式化输出与用户交互_Stars.Sky的博客-CSDN博客 

参考文档:shell运算详解-组团学

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

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

相关文章

MySQL窗口函教-序号函数(row_number、rank、dense_rank)

MySQL窗门函教-序号函数(row_number、rank、dense_rank) 前言 mysql8.0中新增窗口函数(开窗函数) 窗口函数和普通聚合函数的区别 ①聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记…

代码源每日一题div1 区间和

区间和 - 题目 - Daimayuan Online Judge 题意: 思路: 根据前缀和的性质:当已知的前缀和区间是整个区间的划分时,才能求出整个区间的和 因为如果两个区间之间有交叉,交叉部分的和求不出来 因此,如果已知…

DeFi收益来源全面概述

去中心化金融一个主要的优势就是它对所有人开放,任何人在任何时间、任何地点都可以参与其中。这样一来,作为DeFi参与者就有机会获得在传统金融领域很难获得或根本不可能获得的收益。 加密货币的特性是开源的、无需许可的,这将DeFi变成了一个…

【Linux】进程创建/终止/等待/替换

目录 一、子进程的创建 1、fork函数的概念 2、如何理解fork拥有两个返回值 3、fork调用失败的场景 二、进程的终止 1、main函数返回值 1.1main函数的返回值的意义 1.2将错误码转化为错误信息 1.3查看进程的退出码 2、进程退出的情况 1、进程的正常退出与异常退出 2…

Principal branch

In mathematics, a principal branch is a function which selects one branch (“slice”) of a multi-valued function. Most often, this applies to functions defined on the complex plane. Contents1 Examples1.1 Trigonometric inverses1.2 Exponentiation to fraction…

255-261BFC,媒体的类型,媒体的特性,浏览器前缀,媒体查询,逻辑操作符,

◼ 有时候可能会看到有些CSS属性名前面带有:-o-、-xv-、-ms-、mso-、-moz-、-webkit- ◼ 官方文档专业术语叫做:vendor-specific extensions(供应商特定扩展) ◼ 为什么需要浏览器前缀了?  CSS属性刚开始并没有成为标准,浏览器为了防止后续会修改名字给新的属性添加了浏…

树莓派学习笔记(一)

树莓派学习笔记 笔记来自B站UP主【树小悉】的树莓派系列视频的听课笔记,通俗易懂,风趣幽默,适合新手入门,强烈推荐!!! 关机命令 sudo poweroff 关闭电源sodo shutdown -h now 立刻关机sudp shut…

二、进程管理(四)经典同步互斥问题

目录 4.1生产者-消费者问题 4.1.1单类生产者-单类消费者问题 4.1.2多类生产者-多类消费者问题 4.1.3吸烟者问题 4.2读者-写者问题 4.3哲学家进餐问题 分析进程同步和互斥问题的三步: 关系分析:分析问题中的同步(前驱关系)、…

端口渗透篇:Java RMI 远程代码执行漏洞

转载https://cloud.tencent.com/developer/article/2149191 前言持续更新:整理下渗透测试工作中发现过的漏洞(包含漏洞描述、漏洞等级、漏洞验证、修复建议),这里不深究漏洞产生的各种后利用或者绕过方式,漏洞验证过程…

【Python游戏】Python各大游戏合集(5):塔防游戏、飞机大战、连连看、打地鼠、记忆翻牌 | 附带源码

相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 公众号:Python日志 可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!! 源码领取:加P…

【高速数字化仪应用案例系列】虹科数字化仪在通信领域的应用

通信应用 随着国际社会要求以越来越快的速度传输更多信息,电子通信也在不断发展。模拟和数字技术用于无线、光纤和有线网络系统提供的点对点和广播通信。为了开发和维护这些系统,工程师需要能够测试和鉴定接收和传输的信号。需要减少信号损失或衰减&…

SpringBoot SpringBoot 原理篇 1 自动配置 1.2 bean 的加载方式【二】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.2 bean 的加载方式【二】1.2.1 第二种方式1 自动配置 1.2 bean …

idea 项目代码打包为jar包详解

目录前言一、将所有依赖和模块代码打包为一个jar二、只将模块代码打包为一个jar前言 假设我有如下简单 maven 项目 点击 File > Project Structure > Artifacts > 点击加号 > 选择JAR > 选择From modules with dependencies 一、将所有依赖和模块代码打包为一…

【树莓派不吃灰】命令篇⑨ 记录学习文件系统

目录1. 外部存储设备1.1 分区挂载1.2 查看磁盘信息(包括未挂载磁盘)1.2.1 mmcblk0p01.2.2 sda1(额外了解)1.3 查看UUID1.4 查看文件系统挂载情况2. 文件系统2.1 索引式文件系统2.1.1 EXT2 文件系统(了解)2.…

Android 序列化框架 Gson 原理分析,可以优化吗?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 前言 大家好,我是小彭。 Gson 是 Google 推出的 Java Json 解析库,具有接入成本低、使用便捷、功能扩展性良好等优点,想必大家都很熟悉了。…

ES6 入门教程 25 Module 的加载实现 25.4 循环加载

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程25 Module 的加载实现25.4 循环加载25.4.1 CommonJS 模块的加载原理25.4.2 CommonJS 模块的循环加载25.4.3 ES6 模块的循环加…

MobPush Android 快速集成

开发工具:Android Studio 集成方式:Gradle在线集成 安卓版本支持:minSdkVersion 19 集成准备 注册账号 使用PushSDK之前,需要先在MobTech官网注册开发者账号,并获取MobTech提供的AppKey和AppSecret,详情可…

Gitblit自建仓库及多人使用

上稿已完成了Git Server部署了,现在开始创建仓库及笔者常用的IDE使用 第一步:SSH密钥生成,并保存到GitBlit 正常Git都会用到的server SSH Keys,这里自建同样少不了 【问题直接在CMD输入命令,直接切菜,笔…

ShardingSphere (一)

ShardingSphere (一) ShardingSphere-JDBC 与 SpringBoot 集成 ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖…

气人|这种通过率调优技巧居然这么晚才让我知道

量化风控审核过程中的通过率在贷前策略中是一大重要的内容,另外一个是逾期率。二者之间的因果关系就是通过率高低变化决定了逾期率风险的走势,通过率决定了逾期率的结果,而逾期率又对通过率起到了一个制衡的作用。 很多的风险管理人员常常会遇…