五、Shell 脚本编程:从基础至实用实例

Shell 脚本编程:从基础至实用实例

在当今的计算机技术领域当中,Shell 脚本编程无疑是一项极具实用价值的重要技能。无论是那些肩负着系统管理重任的专业人员、专注于开发工作的技术人员,亦或是普普通通的用户,都能够借助 Shell 脚本极大地提升自身的工作效率,进而实现任务处理的高度自动化。本文将会引领广大读者深入地探究 Shell 脚本编程这一领域,全面涵盖从基础用法到实用实例的各个方面,全力助力读者轻松自如地掌握这一强大无比的工具。

Shell 脚本简介

Shell 作为一种极为重要的命令行解释器,主要负责接收用户输入的各种命令,并将这些命令准确地传递至操作系统,以便操作系统能够对其进行执行。而 Shell 脚本则是由一系列 Shell 命令所组成的文本文件,它可以由 Shell 解释器逐行进行执行。通过 Shell 脚本编程,用户能够将多个不同的命令加以巧妙组合,从而实现复杂任务的自动化处理。
在众多常见的 Shell 当中,有 Bash、Zsh、Ksh 等等,其中 Bash(Bourne Again Shell)是最为常用的一种。本文将以 Bash 为例,全面展开详细的介绍。

二、Shell 脚本基础用法

1. 脚本结构

一个基本的 Shell 脚本通常是由以下几个部分所构成的:

  • Shebang 行:它位于脚本的首行位置,主要用于指定脚本的解释器。例如,#!/bin/bash 就明确表示使用 Bash 解释器来执行该脚本。
  • 注释:以 # 开头的行为注释行,其主要作用是对脚本的功能以及用法进行详细的解释说明。
  • 命令和语句:其中包含了一系列的 Shell 命令以及控制结构,例如条件判断、循环等等。

2. 变量

在 Shell 脚本当中,可以使用变量来存储各种数据。变量的命名规则与多数编程语言比较类似,可以包含字母、数字和下划线,但是绝对不能以数字开头。

  • 定义变量:采用 变量名=值 的方式来定义变量。例如,name="John" 定义了一个名为 name 的变量,其值为 "John"
  • 引用变量:使用 $变量名 的方式来引用变量。例如,echo $name 将输出变量 name 的值。
  • 变量类型:在 Shell 当中,变量并没有严格的类型定义,可以存储字符串、数字等不同类型的数据。

3. 控制结构

Shell 脚本支持多种不同的控制结构,例如条件判断、循环等等。

  • 条件判断:使用 if...then...else...fi 结构来进行条件判断。例如:
if [ $condition ]; then
# 若条件成立则执行的命令
else
# 若条件不成立则执行的命令
fi
  • 循环:Shell 支持 forwhileuntil 三种不同的循环结构。例如:
# for 循环
for item in list; do
# 循环体
done
# while 循环
while condition; do
# 循环体
done
# until 循环
until condition; do
# 循环体
done

4. 函数

在 Shell 脚本当中,可以定义函数以封装可重复使用的代码块。函数的定义方式如下:

function_name() {
# 函数体
}

在调用函数的时候,直接使用函数名即可。例如,function_name 将调用名为 function_name 的函数。

三、实用脚本实例

1. 文件备份脚本

以下是一个非常简单的文件备份脚本,它可以将指定目录下的所有文件备份至另一个目录当中:

#!/bin/bash
# 源目录
source_dir="/path/to/source/directory",这里是作为文件备份的源头目录,其中可能存放着各种需要进行备份的重要文件。
# 目标目录
target_dir="/path/to/target/directory",这个目录则是用于接收从源目录备份过来的文件,作为备份文件的存储位置。
# 创建目标目录(若不存在)
if [! -d "$target_dir" ]; then
mkdir -p "$target_dir",如果目标目录不存在,那么就通过这个命令来创建目标目录,确保备份过程能够顺利进行。
fi
# 备份文件
for file in "$source_dir"/*; do
if [ -f "$file" ]; then
cp "$file" "$target_dir",通过循环遍历源目录下的所有文件,如果是普通文件,就将其复制到目标目录中,实现文件的备份操作。
fi
done
echo "备份完成!",当所有文件备份操作完成后,输出这条提示信息,让用户知晓备份过程已经顺利结束。

2. 系统监控脚本

这个脚本能够对系统的 CPU 使用率、内存使用率以及磁盘空间使用率进行实时监控,当超过一定阈值时会发送邮件通知:

#!/bin/bash
# 邮件接收者
recipient="your_email@example.com",这里指定了接收系统监控警告邮件的邮箱地址,当系统资源使用率超过阈值时,警告邮件将会发送到这个邮箱。
# CPU 使用率阈值
cpu_threshold=80,设定了 CPU 使用率的阈值为 80%,当系统的 CPU 使用率超过这个值时,将会触发邮件通知。
# 内存使用率阈值
memory_threshold=80,同样,这里设定了内存使用率的阈值为 80%,一旦内存使用率超过这个值,也会发送邮件通知。
# 磁盘空间使用率阈值
disk_threshold=90,磁盘空间使用率的阈值设定为 90%,当磁盘空间使用率超过这个值时,同样会有邮件通知发出。
# 获取 CPU 使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1" | awk '{print 100 - $1}'),通过一系列的命令组合,获取系统当前的 CPU 使用率。
# 获取内存使用率
memory_usage=$(free | grep "Mem" | awk '{print $3/$2 * 100}'),使用特定的命令获取系统的内存使用率。
# 获取磁盘空间使用率
disk_usage=$(df -h / | awk '{print $5}' | sed 's/%//'),这个命令用于获取磁盘空间的使用率。
# 检查 CPU 使用率
if [ $(echo "$cpu_usage > $cpu_threshold" | bc -l) -eq 1 ]; then
echo "CPU 使用率超过 $cpu_threshold%:$cpu_usage%" | mail -s "系统监控警告" "$recipient",如果 CPU 使用率超过设定的阈值,就会发送一封邮件通知,告知用户 CPU 使用率过高的情况。
fi
# 检查内存使用率
if [ $(echo "$memory_usage > $memory_threshold" | bc -l) -eq 1 ]; then
echo "内存使用率超过 $memory_threshold%:$memory_usage%" | mail -s "系统监控警告" "$recipient",当内存使用率超过阈值时,也会发送邮件通知用户。
fi
# 检查磁盘空间使用率
if [ $(echo "$disk_usage > $disk_threshold" | bc -l) -eq 1 ]; then
echo "磁盘空间使用率超过 $disk_threshold%:$disk_usage%" | mail -s "系统监控警告" "$recipient",如果磁盘空间使用率过高,同样会发送邮件提醒用户。
fi

3. 自动化部署脚本

以下是一个简单的自动化部署脚本,用于从版本控制系统中检出代码并部署至服务器上:

#!/bin/bash
# 项目名称
project_name="your_project_name",这里指定了要进行部署的项目名称。
# 代码仓库地址
repository_url="https://github.com/your_username/$project_name.git",给出了项目代码所在的仓库地址,以便从这个地址检出代码。
# 部署目录
deploy_dir="/path/to/deploy/directory",设定了代码部署的目标目录。
# 检出代码
if [ -d "$deploy_dir" ]; then
cd "$deploy_dir"
git pull,如果部署目录已经存在,就进入这个目录并执行 git pull 命令,从代码仓库中拉取最新的代码。
else
git clone "$repository_url" "$deploy_dir",如果部署目录不存在,就使用 git clone 命令从代码仓库地址克隆代码到指定的部署目录中。
fi
# 安装依赖
cd "$deploy_dir"
npm install,进入部署目录后,执行 npm install 命令安装项目所需的依赖。
# 构建项目
npm run build,使用 npm run build 命令构建项目。
# 启动服务
npm start,最后执行 npm start 命令启动服务。
echo "部署完成!",当所有部署步骤完成后,输出这条提示信息,让用户知道部署过程已经顺利结束。

四、总结

Shell 脚本编程确实是一项极具实用价值的重要技能,它能够助力用户极大地提高工作效率,实现任务处理的高度自动化。本文详细介绍了 Shell 脚本的基础用法,包括脚本结构、变量、控制结构和函数等各个方面,并提供了一些非常实用的脚本实例,例如文件备份脚本、系统监控脚本和自动化部署脚本。期望通过本文的全面介绍,读者能够对 Shell 脚本编程有更加深入的了解,并在实际工作中加以灵活应用。

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

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

相关文章

12寸FAB厂试产到量产实现无纸化要素之软硬件

在12寸先进封装半导体车间从试产到量产的过程中,实现生产过程无纸化,需要综合考虑软硬件的配置。以下是一些关键的规划建议: 1、生产文档管理系统(PDM): 采用基于SOLIDWORKS PDM开发的无纸化方案&#xf…

uniapp 整合 OpenLayers - 加载Geojson数据(在线、离线)

Geojson数据是矢量数据&#xff0c;主要是点、线、面数据集合 Geojson数据获取&#xff1a;DataV.GeoAtlas地理小工具系列 实现代码如下&#xff1a; <template><!-- 监听变量 operation 的变化&#xff0c;operation 发生改变时&#xff0c;调用 openlayers 模块的…

Java面试场景题(1)---如何使用redis记录上亿用户连续登陆天数

感谢uu们的观看&#xff0c;话不多说开始~ 对于这个问题&#xff0c;我们需要先来了解一下~ 海量数据都可以用bitmap来存储&#xff0c;因为占得内存小&#xff0c;速度也很快 我大概计算了一下~ 完全够&#xff1a;String类型512M 1byte 8个bit位 8个状态 512M1024byt…

数据库性能测试报告总结模板

1计划概述 目的&#xff1a;找出系统潜在的性能缺陷 目标&#xff1a;从安全&#xff0c;可靠&#xff0c;稳定的角度出发&#xff0c;找出性能缺陷&#xff0c;并且找出系统最佳承受并发用户数&#xff0c;以及并发用户数下长时间运行的负载情况&#xff0c;如要并发100用户&a…

CTFHUB技能树之SQL——字符型注入

开启靶场&#xff0c;打开链接&#xff1a; 直接指明是SQL字符型注入&#xff0c;但还是来判断一下 &#xff08;1&#xff09;检查是否存在注入点 1 and 11# 返回正确 1 and 12# 返回错误 说明存在SQL字符型注入 &#xff08;2&#xff09;猜字段数 1 order by 2# 1 order…

颠覆编程!通义灵码、包阅AI、CodeGeeX三大AI助手解锁无限潜力!

随着科技的疾速前行&#xff0c;人工智能&#xff08;AI&#xff09;辅助编程工具已跃然成为软件开发领域及编程爱好者群体中不可或缺的得力助手。这些融入了尖端智能化算法的工具&#xff0c;不仅深刻改变了编程工作的面貌&#xff0c;通过自动化和优化手段显著提升了编程效率…

GJS-WCP

不懂的就问&#xff0c;但我也是二把手......哭死 web GJS-ezssti 很常规的ssti模板注入&#xff0c;只过滤了"/","flag"。 过滤了/,flag 可以利用bash的特性绕过&#xff0c;如字符串截取&#xff0c;环境变量等等。payload1: {{url_for.__globals__[…

柔性数组的使用

//柔性数组的使用 #include<stdio.h> #include<stdlib.h> #include<errno.h> struct s {int i;int a[]; }; int main() {struct s* ps (struct s*)malloc(sizeof(struct s) 20 * sizeof(int));if (ps NULL){perror("malloc");return 1;}//使用这…

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

Math类、System类、Runtime类、Object类、Objects类、BigInteger类、BigDecimal类

课程目标 能够熟练使用Math类中的常见方法 能够熟练使用System类中的常见方法 能够理解Object类的常见方法作用 能够熟练使用Objects类的常见方法 能够熟练使用BigInteger类的常见方法 能够熟练使用BigDecimal类的常见方法 1 Math类 1.1 概述 tips&#xff1a;了解内容…

Java | Leetcode Java题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; class Solution {public int reversePairs(int[] nums) {Set<Long> allNumbers new TreeSet<Long>();for (int x : nums) {allNumbers.add((long) x);allNumbers.add((long) x * 2);}// 利用哈希表进行离散化Map<Long, Int…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可用于开发各种编程语言&#xff0c;包括Java、C、Python等。它最初由IBM公司开发&#xff0c;后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

AI 编译器学习笔记之四 -- cann接口使用

1、安装昇腾依赖 # CANN发布件地址 https://cmc.rnd.huawei.com/cmcversion/index/releaseView?deltaId10274626629404288&isSelectSoftware&url_datarun Ascend-cann-toolkit_8.0.T15_linux-aarch64.run Ascend-cann-nnal_8.0.T15_linux-aarch64.run Ascend-cann-ker…

当下大语言模型(LLM)应用的架构介绍

想要构建你的第一个大语言模型应用&#xff1f;这里有你需要了解的一切&#xff0c;以及你今天就能开始探索的问题领域。 LLM 应用架构 我们的目标是让你能够自由地使用大语言模型进行实验、打造自己的应用&#xff0c;并挖掘那些尚未被人注意的问题领域。为此&#xff0c;Git…

数据类型的通用操作

#通用操作有&#xff1a;for语句遍历&#xff0c;len()统计元素个数&#xff0c;是数据类型间的相互转换&#xff0c;元素的排序&#xff08;正反向&#xff09; 1.for语句遍历若遍历字典则 只去字典中的key(即名词) 2.各数据类型间的数据转换&#xff08;若为字典转化为列表…

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(上)(分值10+)

目录 前言第7章 面向对象技术 &#xff08;上&#xff09;7.1 面向对象基础(3-4分&#xff09;7.1.1 面向对象的基本概念7.1.2 面向对象分析&#xff08;熟记&#xff09;7.1.3 面向对象设计7.1.4 面向对象程序设计7.1.5 面向对象测试 7.2 UML(3~4分)7.2.1 事务7.2.2 关系7.2.2…

超详细JDK安装+环境配置教程

安装jdk 1.首先在JDK官网进行下载 JDK会默认安装在C盘 program file文件下 2.并且在JDK安装的过程中会提示安装JRE JDK和JRE会安装在同一目录下 JDK通过命令行进行使用 JDK的目录 以下是JDK对应的目录 bin:存放可执行程序 其中包含java javac命令 Include&#xff1a;本地…

013_django基于大数据的高血压人群分析系统2024_dcb7986h_055

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

react-native 安装 自学笔记(踩坑点)

react-native环境安装搭建注意点 安装环境文档地址&#xff1a; Android 原生UI组件 React Native 中文网&#xff08;中文网可能有些信息没有外文的更新及时&#xff09; 1.必须要安装node 和 jdk 坑点&#xff1a;node版本18/18 jdk版本文档要求17&#xff0c;但是我clo…

微服务的一些基本概念

目录 1 概述1.1 微服务架构的特征1.2 微服务架构示例 2 微服务与单体式架构2.1 什么是单体式架构&#xff1f;2.2 单体式架构的优点2.3 单体式架构的缺点 3 什么是微服务&#xff1f;3.1 微服务的优点3.2 微服务的缺点 4 如何构建微服务4.1 从单体式开始4.2 以正确的方式组织团…