Shell实战(一)

Shell实战(一)

  • 导语
  • 程序实例
    • 解压缩交互
      • 功能描述
      • 代码和运行结果
      • 实现解析
    • 监视CPU和内存
      • 功能描述
      • 代码和运行结果
      • 实现解析
    • 用户管理
      • 功能描述
      • 代码和运行结果
      • 实现解析
  • 总结

导语

本篇引入三个书上的shell程序设计项目,由于书上的版本较老,这里给出的都是完善之后的版本,经过测试在ubuntu23上都可以运行

程序实例

解压缩交互

功能描述

提供一个简单的可交互界面,该程序需要实现能够判断给定路径是否为文件,是否有操作权限,以及是否能对该路径下文件/目录进行压缩/解压缩,将各种压缩操作集成在该程序当中

代码和运行结果

#编写文件压缩和解压缩程序界面并实现其功能
f_compress()
{if [ ! -e "$1" ]#如果路径不存在,这里和书上不一样thenecho "路径不合法"returnfiif [ ! -x "$file" ]thenecho "无权限执行"return fiecho "*************************************"echo "选择压缩格式"echo "1-*.bz2"echo "2-*.gz"echo "3-*.tar"echo "4-*.tar.gz"echo "5-*.zip"echo "*************************************"read formatecho $formatcase "$format" in1) bzip2 -z $file;;2) gzip -r $file;;3) tar -cvf $file.tar $file;;4) tar -zcvf $file.tar.gz $file;;5) zip -r $file.zip $file;;*) echo "错误输入";;esac
}f_decompress()
{if [ ! -f "$file" ]then echo "文件不存在"return fiif [! -x "$file" ]then echo "无权限"return ficlearecho "*************************************"echo "选择解压格式"echo "1-*.bz2"echo "2-*.gz"echo "3-*.tar"echo "4-*tar.gz"echo "5-*.zip"echo "*************************************"read formatecho $formatcase "$format" in1) bzip2 -d $file;;2) gzip -d $file;;3) tar -xvf $file;;4) tar -zxcf $file;;5) unzip $file;;esac
}quit()
{echo "*************************************"echo "使用结束,退出"echo "*************************************"exit 0
}clear 
while true
doecho "*************************************"echo "请选择想要实现的功能"#交互界面echo "1-压缩"echo "2-解压"echo "3-退出"echo "请输入对应数字"read choiceecho "您选择的是$choice号操作"case "$choice" in1)  echo "请输入要压缩的路径或文件"read fileecho $filef_compress $file#进行压缩;;2)  echo "请输入要压缩的路径或文件"read fileecho $filef_decompress $file#解压;;3)  echo "退出本程序"quit;;*)  echo "输入有误,请重新输入"sleep 2clear;;esac
done

在这里插入图片描述

可以看到222成功被压缩成zip格式

在这里插入图片描述

将222重命名为333,然后对222.zip进行解压

在这里插入图片描述

可以看到222.zip被成功解压成了222文件夹

在这里插入图片描述

实现解析

该程序分成了好几个部分来实现:解压函数,压缩函数,退出函数,主函数,菜单的功能被集成在主函数当中

压缩函数首先判断路径合法性,随后根据用户的选择确定压缩格式,再执行相应的压缩指令完成压缩

解压函数同理,不赘述

退出函数在界面上打出退出消息

主函数向用户提供大的功能板块,之后根据用户的选择对对应函数进行调用

监视CPU和内存

功能描述

监控CPU和内存,显示系统日期时间,将使用情况等信息输出到文件capstats.csv

代码和运行结果

#!/bin/bash# 设置输出文件
OUTFILE="/root/capstats.csv"# 获取系统日期和时间
DATE=$(date +%Y%m%d)
TIME=$(date +%k:%M:%S)# 获取系统运行时间和用户数
TIMEOUT=$(uptime)
USERS=$(echo "$TIMEOUT" | gawk '{print $4}')# 获取系统负载,并去除逗号
LOAD=$(echo "$TIMEOUT" | gawk '{print $9}' | sed 's/,//')# 使用vmstat获取内存信息
VMSTAT_OUTPUT=$(vmstat 1 2)
FREE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $4}')
IDLE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $15}')# 将结果追加到CSV文件
echo "date: $DATE, time: $TIME, users: $USERS, load: $LOAD, free: $FREE, idle: $IDLE" >> "$OUTFILE"

可以看到,程序执行之后的结果被写入了capstats.csv中

在这里插入图片描述

实现解析

该程序单纯是命令的堆砌,首先设置好输出文件和要输出的字符串及其格式,通过uptime获得运行时间和用户数,通过管道调用gawk获得用户数,通过管道将TIMEOUT的值传递给gawk命令,提取第九个字段(系统负载),然后使用sed命令去除可能存在的逗号,并赋值给变量LOAD

VMSTAT_OUTPUT=$(vmstat 1 2):使用vmstat命令获取内存和交换空间等信息,执行两次采样,间隔为1秒,并将输出赋值给变量VMSTAT_OUTPUT。

FREE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $4}'):通过管道将VMSTAT_OUTPUT的值传递给sed命令,提取第四行,然后再传递给gawk命令,提取第四个字段(空闲内存),并赋值给变量FREE。

IDLE=$(echo "$VMSTAT_OUTPUT" | sed -n '4p' | gawk '{print $15}'):同样通过管道提取第四行的第十五个字段(空闲CPU时间百分比),并赋值给变量IDLE

用户管理

功能描述

程序实现了与用户的交互,提供一个简单的交互界面,实现日期展示、用户创建/删除、用户进程显示,对每个功能分开进行实现

代码和运行结果

menu()
{clearecho "****"echo "选择功能"echo "1.日期"echo "2.创建新用户"echo "3.删除现有用户"echo "4.显示进程信息"echo "5.退出"echo "****"
}dateinfo()
{clearecho "****"echo "日期为:"echo &date "+%B%d%A"echo "****"
}usercreate()
{clearecho "****"echo "创建用户"echo "----"echo "输入新用户的名字"read usernameuseradd $usernameif(($? ==0))thenecho "----"echo "创建成功"elseecho "----"echo "创建失败"fi
}userdelete()
{clearecho "****"echo "删除用户"echo "----"echo "输入用户的名字"read usernameuserdel $usernameif(($?==0))then echo "----"echo "删除成功"elseecho "----"echo "删除失败"echo "delete error!"fi
}listprocess(){clearecho "****"echo "显示进程"echo "----"echo "输入现有用户"read usernameclearecho "$[username] 的进程有"echo "----"ps -u $username
}quit()
{clearecho "****"echo "结束"echo "****"sleep 5
}echo "****"
echo "启动"
echo "****"sleep 5
clearif [ $USER = "root" ]
thenuserflag=0while(($userflag==0))domenuuserchoice=0while (($userchoice == 0))doecho "输入选择(1-5):"read userchoicecase $userchoice in1) dateinfo;;2) usercreate;;3) userdelete;;4) listprocess;;5) userflag=1;;*) echo "输入错误,请输入正确选择";;esacdoneif (($userflag==0))then echo "****"echo "回车返回"readfidonequitclear
elseuserflag = 0echo " 请切换管理员登陆 "
fi

在这里插入图片描述

输入1,可以得到当前日期

在这里插入图片描述

在这里插入图片描述

显示当前用户的进程信息

在这里插入图片描述

实现解析

根据功能分成几个函数实现:菜单、时间显示、用户创建、进程展示、菜单退出、用户删除、主函数

菜单用来实现交互界面,只有单纯的输出

时间显示作为功能实现,调用date命令,并设置格式输出

用户创建,调用useradd直接创建用户,并进行合法性判断

用户删除同上,略

进程展示,调用ps命令,对指定用户下的进程信息进行展示

退出和主函数略

总结

本次的三个实战程序基本都提供了用户交互,通过集成shell已有的命令形成新的程序来方便使用,可以看出shell语言的强大

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

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

相关文章

异构AI算力资源池:智能世界的新型基础设施

随着人工智能技术的飞速发展,AI应用对计算资源的需求日益增长。然而,传统的同构计算资源池无法满足AI应用对计算能力、能耗和成本的多样化需求。为此,异构AI算力资源池应运而生,成为未来智能世界的重要基础设施。 背 景 人工智能…

H3C交换机手动释放DHCP地址

原本的的配置,释放时间10天 导致所有的地址都被使用完 释放了地址池的地址 重新调整了超期时间为8小时

游戏行业数据集成“利器”

《黑神话:悟空》自公布以来,便在游戏界引起了巨大的轰动。这款游戏以其精湛的画面、精彩的剧情和深度的玩法,让无数玩家充满期待。而在其背后,游戏开发者们面临着诸多挑战,其中之一便是数据的集成与管理。竞争激烈的游…

【C++ Primer Plus习题】17.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…

LeetCode Hot100 C++ 哈希 49.字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排…

2-99 基于matlab多尺度形态学提取眼前节组织

基于matlab多尺度形态学提取眼前节组织&#xff0c;通过应用不同尺度的结构元素进行边缘检测&#xff0c;再通过加权融合的思想来整合检测到的边缘&#xff0c;降低图像噪声的影响&#xff0c;提高边缘检测的精度。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&…

线程的状态及join()插队方法

一、线程的状态 线程整个生命周期中有6种状态&#xff0c;分别为 NEW 新建状态 、RUNNABLE 可运行状态、TERMINATED 终止状态、TIMED_WAITING计时等待状态、WAITING 等待状态、BLOCKED 阻塞状态 线程各个状态之间的转换&#xff1a; 在 JAVA 程序中&#xff0c;一个线程对象通过…

200Kg大载重多旋翼无人机应用前景详解

大载重多旋翼无人机是一类具备高载重能力和长航时特点的无人机系统&#xff0c;它们融合了多旋翼无人机的灵活性与大载重无人机的实用性&#xff0c;广泛应用于多个领域。 1. 航拍与影视制作 在航拍与影视制作领域&#xff0c;200Kg大载重多旋翼无人机凭借其出色的稳定性和载重…

维信诺三年半亏损近85亿:股价今年跌超四成,550亿大手笔投资8.6代

《港湾商业观察》施子夫 在显示面板领域知名度颇高的维信诺&#xff08;002387.SZ&#xff09;还是交出了持续亏损的半年报。从近些年财务数据上看&#xff0c;亏损似乎已经成为了公司甩不掉的包袱。 在盈利能力并不如预期的情况下&#xff0c;维信诺也对外释放要550亿扩产能…

图片切换示例【JavaScript】

在 JavaScript 中实现图片切换可以通过多种方法&#xff0c;下面是一个简单的示例&#xff0c;使用 HTML、CSS 和 JavaScript 来实现图片的切换效果。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta c…

单相电多相电

目录 1. 单相电 2. 多相电 3. 其他多相电系统 单相电和多相电是电力系统中常见的两种供电方式&#xff0c;主要区别在于电力传输的相数。以下分别介绍它们的基本概念、特征、以及应用场景。 1. 单相电 定义&#xff1a; 单相电指的是只有一根火线和一根零线的电力系统。这…

电玩店ps5倒计时软件试用版下载 佳易王电玩计时计费管理系统操作教程

一、前言 电玩店ps5倒计时软件试用版下载 佳易王电玩计时计费管理系统操作教程 佳易王电玩店计时计费软件&#xff0c;有两款&#xff0c;其中一款可显示倒计时剩余分钟数&#xff0c;另外一款是显示用了多长时间&#xff0c;都可以设置定时语音提醒。 二、显示倒计时软件图文…

python之装饰器、生成器

装饰器 什么是装饰器&#xff1f; 用来装饰其他函数&#xff0c;即为其他函数添加特定功能的函数。 装饰器的两个基本原则&#xff1a; 装饰器不能修改被装饰函数的源码 装饰器不能修改被装饰函数的调用方式

css禁止图片保存,CSS中的图片保存方法

“css中的图片”指的就是镶在CSS样式表中的图片。在我们用在浏览器保存网页时&#xff0c;很多时候&#xff0c;下载网页里的图片都下载不到&#xff0c;这样的话就会使网页非常不美观。所以&#xff0c;今天小编就给大家介绍集中保存方法。 以下是几种保存方法。 (一)使用网…

互联网产品经理在 AIGC 时代的升级攻略

在当今科技飞速发展的浪潮中&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;正以前所未有的速度改变着互联网的格局。对于互联网产品经理而言&#xff0c;这既是一个充满无限可能的机遇&#xff0c;也是需要积极应对的挑战。那么&#xff0c;在 AIGC 时代&#xff0…

Vulnhub:Cybero1

靶机下载地址 主机发现 扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.118 端口扫描 nmap 192.168.31.118 -A -p- -T4 开放端口&#xff1a;21(ftp)、22(ssh)、80(http)、8085(http)。 HTTP信息收集 80 访问http://192.168.3…

毫米波雷达预警功能 —— 倒车预警(RCTA)

文档声明&#xff1a; 以下资料均属于本人在学习过程中产出的学习笔记&#xff0c;如果错误或者遗漏之处&#xff0c;请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用&#xff0c;转载请标明出处&#xff0c;谢谢配…

股指期货的持仓量指标如何分析?有哪些作用?

股指期货市的持仓量是一个极其重要的指标&#xff0c;它就像市场的“晴雨表”&#xff0c;能反映出投资者的信心、市场的热度以及潜在的趋势。下面&#xff0c;我们就用大白话的方式来详细解读一下股指期货持仓量指标的分析方法及其作用。 一、什么是股指期货持仓量&#xff1…

骨传导耳机哪款值得入手?分享五款高品质好口碑骨传导耳机~

在不经意间&#xff0c;耳机已深深嵌入我们的日常生活&#xff0c;无论是早晨的匆忙出门&#xff0c;还是日常通勤、工作忙碌&#xff0c;乃至夜晚的休憩时光&#xff0c;它都是我们的忠实伴侣。然而&#xff0c;关于长时间佩戴耳机可能对听力造成的潜在影响&#xff0c;让不少…

【动态规划】两个数组的 dp 问题二

两个数组的 dp 问题 1.正则表达式匹配2.交错字符串3.两个字符串的最小ASCII删除和4.最长重复子数组 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1…