shell编程练习巩固

news2026/2/14 15:37:17

一、用shell写出一个简单的计算器。

其实用shell写个简单的计算器还是很简单,我们不用构建那么复杂的计算功能,只需要复现出简单的加减乘除取余即可。

既然是计算器就要明确一下思路:

  • 用户可以输入一个数字
  • 根据数字选择加、减、乘、除、取余的计算方法
  • 进入所选择的计算方法,再输入一个数字,进行计算。
  • 输出计算结果

根据上述思路我们遍可以写出一个shell脚本:

#!/bin/bash

read -p "请您输入要计算的数字:" num1

read -p "请您选择要计算的方法:(1)加法 (2)减法 (3)乘法 (4)除法 (5)取模 输入数字即可! " choose

case $choose in
    1)
        read -p "请您输入想计算的数值:" system_number
        result=$(($num1 + $system_number))
        echo "您的结果为:$result"
    ;;
    2)
    	read -p "请您输入想计算的数值:" system_number
        result=$(($num1 - $system_number))
        echo "您的结果为:$result"
    ;;
    3)
        read -p "请您输入想计算的数值:" system_number
        result=$(($num1 * $system_number))
        echo "您的结果为:$result"
    ;;
    4)
        read -p "请您输入想计算的数值:" system_number
        result=$(($num1 / $system_number))
        echo "您的结果为:$result"
    ;;
    5)
        read -p "请您输入想计算的数值:" system_number
        resoult=$(($num1 % $system_number))
        echo "您的结果为:$result"
    ;;
    *)
       	echo "您输入的选择无效,请重新运行脚本并输入正确的选择。"
    ;;
esac

二、用shell写出阶乘

首先我们明确一下阶乘的概念:

阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。 例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。

明确一下思路:

  • 首先要接受一个任意的数字
  • 明确阶乘数字概念,从1开始乘到输入的数字本身,这需要循环
  • 如果输入的数字是1或者0那阶乘就算1并且不再经过循环

由此我们可以设计一个shell脚本:

# 获取用户输入的数字
read -p "请输入一个整数: " num

# 初始化阶乘结果为1
factorial=1

# 如果输入的数字是0或1,阶乘就是1,直接输出
if [ $num -eq 0 ] || [ $num -eq 1 ]; then
    factorial=1
else
    i=0  # 显式初始化i
    # 通过循环计算阶乘
    for (( i=2; i<=$num; i++ )); do
        factorial=$(($factorial * $i))
    done
fi

echo "$num 的阶乘是: $factorial"

三、我们用shell筛选linux网络信息并筛选出ip段

思路:

  • shell编程语言就是可以和终端交互的
  • 输入ip addr网络命令显示内容
  • 根据内容筛选ip段

由此我们可以设计个代码:

#!/bin/bash

# 使用ifconfig获取eth0接口的IP地址
ip=$(ifconfig eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*')
echo $ip

在上述代码中:

  • 首先通过ifconfig eth0获取eth0接口的详细信息。
  • 然后使用grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'ifconfig的输出中筛选出包含inet(IPv4 地址相关)的行,并提取出类似inet 192.168.1.100inet addr:192.168.1.100这样格式中的 IP 地址部分。
  • 最后再通过grep -Eo '([0-9]*\.){3}[0-9]*'进一步精确提取出真正的 IP 地址,以排除可能存在的其他干扰字符,如inetaddr:等,并将获取到的 IP 地址赋值给变量ip,最后通过echo输出该 IP 地址。

难以理解的部分是 grep -Eo里面的内容:

  • grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'部分
    • grep是一个强大的文本搜索工具,用于在文本文件或命令输出的文本流中查找匹配特定模式的行。这里使用了grep的扩展正则表达式模式(通过-E选项启用)。
    • 具体的正则表达式模式inet (addr:)?([0-9]*\.){3}[0-9]*的含义如下:
      • inet:这是要匹配的文本的起始部分,因为在ifconfig的输出中,与 IPv4 地址相关的行通常会以inet开头(有时候也可能是inet addr:的形式,后面会处理这种情况)。
      • (addr:)?:这是一个可选的分组,问号表示前面的addr:可以出现 0 次或 1 次。也就是说,既可以匹配inet 192.168.1.100这种形式,也可以匹配inet addr:192.168.1.100这种形式,这样就涵盖了不同系统可能出现的两种常见的 IPv4 地址显示格式。
      • ([0-9]*\.){3}[0-9]*:这是一个复杂一点的部分。首先,([0-9]*\.)表示匹配任意数量(包括 0 个)的数字后面跟着一个点号。{3}表示前面的([0-9]*\.)这个模式要重复 3 次,这样就可以匹配到类似xxx.xxx.xxx.xxx的 IP 地址格式的前三个部分。最后,[0-9]*再匹配 IP 地址的最后一个数字部分,从而完整地匹配出一个 IPv4 地址。
    • 所以,整个grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'的作用就是从ifconfig输出的关于eth0接口的信息中,筛选出包含 IPv4 地址的行,并提取出类似inet 192.168.1.108inet addr:192.168.1.108这样格式中的 IP 地址部分(但可能还会包含一些多余的字符,比如inetaddr:等,这就需要下一个grep命令进一步处理)。
  • grep -Eo '([0-9]*\.){3}[0-9]*'部分
    • 这是对前面grep命令提取结果的进一步提纯。前面的grep命令虽然提取出了包含 IP 地址的部分,但可能还带有一些不需要的字符,如inetaddr:等。
    • 这里再次使用grep,其正则表达式模式([0-9]*\.){3}[0-9]*和前面解释过的一样,就是专门用于匹配完整的 IPv4 地址格式。通过这个命令,就可以从前面提取出的包含 IP 地址部分的结果中,进一步精确提取出真正的 IP 地址,排除掉其他干扰字符。
    • 最后,将经过两次grep处理后得到的 IP 地址赋值给变量ip

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

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

相关文章

快速搭建一个博客!!!“Halo框架深度优化:搭建你的个性化博客或网站”

目录 引言&#xff1a; 一. 首先服务器上去下载一个docker 1.可以参考官方地址&#xff1a; 2. 通过宝塔来一键安装&#xff01;&#xff01;&#xff01; 3.也可以自己下载&#xff01;&#xff01;&#xff01; 1.卸载旧版 2.配置Docker的yum库 3.安装Docker 4.启动和…

pcb线宽与电流

三十年一路高歌猛进的中国经济&#xff0c; 中国经历了几个三十年&#xff1f; 第一个三十年&#xff1a;以计划为导向。 第二个三十年&#xff1a;以经济为导向。 现在&#xff0c;第三个三十年呢&#xff1f; 应该是以可持续发展为导向。 传统企业摇摇欲坠&#xff0c; 新兴企…

23种设计模式-抽象工厂(Abstract Factory)设计模式

文章目录 一.什么是抽象工厂设计模式&#xff1f;二.抽象工厂模式的特点三.抽象工厂模式的结构四.抽象工厂模式的优缺点五.抽象工厂模式的 C 实现六.抽象工厂模式的 Java 实现七.代码解析八.总结 类图&#xff1a; 抽象工厂设计模式类图 一.什么是抽象工厂设计模式&#xff1f…

VSCode修改资源管理器文件目录树缩进(VSCode目录结构、目录缩进、文件目录外观)workbench.tree.indent

文章目录 方法点击左下角小齿轮点击设置点击工作台&#xff0c;点击外观&#xff0c;找到Tree: Indent设置目录树的缩进 方法 点击左下角小齿轮 点击设置 点击工作台&#xff0c;点击外观&#xff0c;找到Tree: Indent设置目录树的缩进 "workbench.tree.indent"默认…

Transformer.js(七):ONNX 后端介绍 - 它是什么、如何将pytorch模型导出为ONNX格式并在web中使用

在前面的文章中&#xff0c;我介绍了关于transformer.js的一些内容&#xff0c;快速连接&#xff1a; 1. 运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景2. 关于pipe管道的一切3. 底层架构及性能优化指南4. 型接口介绍5. Tokenizer 分词器接口解析 6. 处理工…

玄机应急:linux入侵排查webshell查杀日志分析

目录 第一章linux:入侵排查 1.web目录存在木马&#xff0c;请找到木马的密码提交 2.服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 3.不死马是通过哪个文件生成的&#xff0c;请提交文件名 4.黑客留下了木马文件&#xff0c;请找出黑客的服务器ip提交 5.黑客留…

消息队列详解:从基础到高级应用

本文主旨 撰写这篇文章的目的在于向读者提供一个全面理解消息队列概念及其在实际应用中重要性的指南。通过从RocketMQ的基础组件如生产者、消费者、主题等的介绍到更高级的概念&#xff0c;比如集群消费与广播消费的区别、顺序消息的重要性等&#xff0c;我们希望能够帮助开发…

qt QGraphicsRotation详解

1、概述 QGraphicsRotation 是 Qt 框架中 QGraphicsTransform 的一个子类&#xff0c;它专门用于处理图形项的旋转变换。通过 QGraphicsRotation&#xff0c;你可以对 QGraphicsItem&#xff08;如形状、图片等&#xff09;进行旋转操作&#xff0c;从而创建动态和吸引人的视觉…

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libtinfo.so.5的问题 2024/11/29 20:41 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 [ 11% 15993/135734] target Java source list: vr [ 11% 15994/135734] target …

云轴科技ZStack助力 “上科大智慧校园信创云平台”入选上海市2024年优秀信创解决方案

近日&#xff0c;为激发创新活⼒&#xff0c;促进信创⾏业⾼质量发展&#xff0c;由上海市经济信息化委会同上海市委网信办、上海市密码管理局、上海市国资委等主办的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕。云轴科技ZStack支持的“上科大智慧校园信创云平台”…

【ArcGIS Pro】实现一下完美的坐标点标注

在CAD里利用湘源可以很快点出一个完美的坐标点标注。 但是在ArcGIS Pro中要实现这个效果却并不容易。 虽然有点标题党&#xff0c;这里就尽量在ArcGIS Pro中实现一下。 01 标注实现方法 首先是准备工作&#xff0c;准备一个点要素图层&#xff0c;包含xy坐标字段。 在地图框…

聚云科技×亚马逊云科技:打通生成式AI落地最后一公里

云计算时代&#xff0c;MSP&#xff08;云管理服务提供商&#xff09;犹如一个帮助企业上云、用云、管理云的专业管家&#xff0c;在云计算厂商与企业之间扮演桥梁的作用。生成式AI浪潮的到来&#xff0c;也为MSP带来全新的生态价值和发展空间。 作为国内领先的云管理服务提供…

brew安装mongodb和php-mongodb扩展新手教程

1、首先保证macos下成功安装了Homebrew&#xff0c; 在终端输入如下命令&#xff1a; brew search mongodb 搜索是不是有mongodb资源&#xff0c; 演示效果如下&#xff1a; 2、下面来介绍Brew 安装 MongoDB&#xff0c;代码如下&#xff1a; brew tap mongodb/brew brew in…

图像显示的是矩阵的行和列,修改为坐标范围。

x 3; y 3; f1x x^2 y^2; guance1 f1x; F (x, y) sqrt((x.^2 y.^2 - guance1).^2); % 使用点乘 [x, y] meshgrid(0:1:5, 0:1:5); Z F(x, y); figure; imagesc(Z); % 由于 imagesc 使用矩阵索引作为坐标&#xff0c;我们需要手动添加刻度 % 这里我们假设 x 和 y 的范围…

深入理解Redis线程模型

前置目标&#xff1a;搭建一个Redis单机服务器。搭建过程参考前面的文档&#xff08;https://blog.csdn.net/Zhuxiaoyu_91/article/details/143904807&#xff09;。 建议调整的redis核心配置&#xff1a; daemonize yes # 允许后台启动 protected‐mode no #关闭保护模…

机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)

项目描述 任务&#xff1a;根据训练集数据中的数据预测泰坦尼克号上哪些乘客能生存下来 数据源&#xff1a;csv文件&#xff08;train.csv&#xff09; 目标变量&#xff1a;Survived&#xff08;0-1变量&#xff09; 数据集预览&#xff1a; 1、英文描述&#xff1a; 2、…

人工智能之数学基础:欧式距离及在人工智能领域中的应用

本文重点 欧式距离,也称为欧几里得距离,是数学中用于衡量多维空间中两点之间绝对距离的一种基本方法。这一概念最早由古希腊数学家欧几里得提出,并以其名字命名。欧式距离的计算基于勾股定理,即在一个直角三角形中,斜边的平方等于两直角边的平方和。在多维空间中,欧式距…

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…

洛谷 P1747 好奇怪的游戏 C语言 bfs

题目&#xff1a; https://www.luogu.com.cn/problem/P1747#submit 题目描述 爱与愁大神坐在公交车上无聊&#xff0c;于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘&#xff1a;***&#xff08;游戏名被打上了马赛克&#xff09;。这个游戏类似象棋&#xff0c;但…

【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.set和map的初步封装1.树的节点封装修改2.Find()查找函数3.红…