news 2026/8/4 11:51:14

第18章:Shell 脚本编程基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第18章:Shell 脚本编程基础

恭喜你已经掌握了 Linux 系统管理的核心技能。现在,是时候将这些命令“串联”起来,通过Shell 脚本实现自动化,大幅提升运维效率。在 openEuler 环境中,Bash 脚本是自动化任务、系统维护、部署流程的基石。本章将带你从零开始,写出第一个“会思考”的脚本。

🌟 本章目标

  • 理解 Shell 脚本的作用与执行方式
  • 掌握脚本结构:#!/bin/bash与权限设置
  • 学会定义和使用变量(普通变量、环境变量、位置参数)
  • 使用if语句进行条件判断(文件、字符串、数字)
  • 使用forwhile循环批量处理任务
  • 定义和调用函数,提高代码复用性
  • 实战:编写一个系统资源监控与告警脚本

18.1 什么是 Shell 脚本?

Shell 脚本是一个包含一系列 Shell 命令的文本文件,可以像程序一样被批量执行

✅ 为什么需要脚本?

  • 自动化重复任务:备份、日志清理、服务检查
  • 减少人为错误
  • 提高效率:一键完成多步操作
  • 可复用、可分享:团队协作的“运维配方”

💬 类比:

  • 手动执行命令 = 一步步做菜
  • Shell 脚本 = 写下菜谱,让别人或机器照着做

18.2 第一个 Shell 脚本

步骤1:创建脚本文件

vimhello.sh

步骤2:编写内容

#!/bin/bash# 这是我的第一个 Shell 脚本echo"Hello, openEuler!"echo"当前时间:$(date)"echo"当前用户:$(whoami)"

步骤3:添加可执行权限

chmod+x hello.sh

步骤4:执行脚本

./hello.sh

输出:

Hello, openEuler! 当前时间:2024年04月06日 星期六 10:30:00 当前用户:zhangsan

✅ 脚本成功运行!


18.3 脚本结构详解

✅ 1. Shebang(#!/bin/bash

  • 必须位于第一行
  • 告诉系统用哪个解释器运行脚本
  • 常见:
    • #!/bin/bash:Bash
    • #!/bin/sh:标准 Shell
    • #!/usr/bin/env python3:Python

⚠️ 如果没有 Shebang,需显式调用解释器:

bashhello.sh

✅ 2. 注释(#

  • #后的内容为注释,不会被执行
  • 用于说明脚本功能、作者、修改记录
# Author: zhangsan# Date: 2024-04-06# Description: 系统信息收集脚本

✅ 3. 执行方式

方式命令特点
直接执行./script.shx权限
调用解释器bash script.sh无需x权限
源码执行source script.sh. script.sh在当前 Shell 环境执行,变量会保留

18.4 变量(Variables)

变量用于存储数据,是脚本的“记忆”。

🔧 定义变量

name="zhangsan"age=25pi=3.14
  • 变量名区分大小写
  • 不能有空格(name = "zhangsan"错误!)
  • 可用export变为环境变量

🔍 使用变量

echo"姓名:$name"echo"年龄:${age}岁"# ${} 更安全,避免歧义

🧩 特殊变量

变量说明
$0脚本名
$1,$2, …第1、2个参数
$#参数个数
$@所有参数(保留空格)
$*所有参数(合并为一个字符串)
$$当前脚本的 PID
$?上一条命令的退出状态(0=成功)

实战:参数传递脚本

vimgreet.sh
#!/bin/bashecho"脚本名:$0"echo"参数个数:$#"echo"第一个参数:$1"echo"所有参数:$@"

执行:

chmod+x greet.sh ./greet.sh 张三 李四 王五

输出:

脚本名:./greet.sh 参数个数:3 第一个参数:张三 所有参数:张三 李四 王五

18.5 条件判断:if语句

if让脚本具备“判断能力”。

基本语法

if条件;then命令1 命令2elif条件;then命令3else命令4fi

✅ 使用test[ ]

if[-f"/etc/passwd"];thenecho"passwd 文件存在"fi

⚠️[后、]前必须有空格!


🔍 常见判断条件

类型条件说明
文件[ -f file ]是普通文件
[ -d dir ]是目录
[ -r file ]可读
[ -w file ]可写
[ -x file ]可执行
字符串[ -z str ]字符串为空
[ -n str ]字符串非空
[ "str1" = "str2" ]相等
[ "str1" != "str2" ]不等
数字[ 1 -eq 1 ]等于
[ 2 -gt 1 ]大于
[ 1 -lt 2 ]小于
[ 1 -ge 1 ]大于等于
[ 1 -le 2 ]小于等于

实战:检查服务状态

#!/bin/bashservice=$1ifsystemctl is-active--quiet$service;thenecho"$service正在运行"elseecho"$service未运行"fi

保存为check_service.sh,执行:

./check_service.sh sshd

18.6 循环:forwhile

🔁for循环(已知范围)

foriin12345;doecho"数字:$i"done
遍历文件
forfilein/tmp/*.txt;doif[-f"$file"];thenecho"处理文件:$file"fidone
C 风格 for
for((i=1;i<=5;i++));doecho"计数:$i"done

🔄while循环(条件满足时继续)

count=1while[$count-le5];doecho"当前:$count"count=$((count+1))done
实用:监控 CPU 使用率
whiletrue;docpu=$(top-bn1|grep"Cpu(s)"|awk'{print $2}'|cut-d'%'-f1)echo"CPU 使用率:$cpu%"sleep2done

18.7 函数(Functions)

函数用于封装可复用的代码块。

定义函数

functionbackup(){echo"开始备份..."tar-czf/backup/etc-$(date+%F).tar.gz /etcecho"备份完成"}# 或省略 function 关键字log(){echo"[$(date)]$1">>/var/log/myscript.log}

调用函数

backup log"系统检查完成"

18.8 实战:系统资源监控脚本

需求

  • 检查磁盘、内存使用率
  • 超过 80% 时输出警告
  • 记录日志

脚本:monitor.sh

#!/bin/bash# 系统监控脚本LOG_FILE="/var/log/monitor.log"THRESHOLD=80log(){echo"[$(date'+%Y-%m-%d %H:%M:%S')]$1">>$LOG_FILE}check_disk(){usage=$(df/|tail-1|awk'{print $5}'|sed's/%//')if[$usage-gt$THRESHOLD];thenlog"WARNING: 根分区使用率$usage%"echo"警告:磁盘使用率过高!"elselog"OK: 磁盘使用率$usage%"fi}check_memory(){usage=$(free|grepMem|awk'{printf("%.0f", $3/$2 * 100)}')if[$usage-gt$THRESHOLD];thenlog"WARNING: 内存使用率$usage%"echo"警告:内存使用率过高!"elselog"OK: 内存使用率$usage%"fi}# 主程序log"=== 系统监控开始 ==="check_disk check_memory log"=== 系统监控结束 ==="

使用

sudochmod+x monitor.shsudo./monitor.shtail/var/log/monitor.log

✅ 一个实用的自动化监控工具诞生!


✅ 本章小结

结构语法说明
Shebang#!/bin/bash指定解释器
变量name="value"存储数据
条件if [ 条件 ]; then ... fi判断执行
循环for,while重复执行
函数function name() { ... }代码复用
特殊变量$1,$?,$@脚本元信息

📝 课后练习

  1. 编写一个脚本greet_user.sh,接收用户名作为参数,输出“Hello, 用户名”。
  2. 编写一个for循环,创建 10 个文件:file1.txt~file10.txt
  3. 编写一个while循环,持续检查nginx服务状态,每 5 秒一次。
  4. 创建一个函数create_user,接收用户名参数,自动创建用户并设置密码。
  5. 修改监控脚本,增加对 CPU 使用率的检查。
  6. (挑战)编写一个备份脚本,只在工作日(周一到周五)执行。

🔜 下一章预告:第19章《openEuler 中的容器支持(Docker 与 iSulad)》

我们将学习:

  • 什么是容器?Docker 与 iSulad 的区别
  • openEuler 默认容器引擎:iSulad 架构与优势
  • 安装与配置 iSulad
  • 镜像管理:pull、tag、push
  • 容器生命周期:run、start、stop、rm
  • 实战:在 openEuler 上运行 Nginx 容器

准备好进入云原生时代了吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 6:25:16

HR 必看:校招高峰期简历高效归类与人才库搭建的智能化方案

校招高峰期企业会接收海量简历&#xff0c;人工整理耗时且易遗漏&#xff0c;人才沉淀也缺乏规范路径。智能化招聘管理系统可通过标准化解析、自动归类与结构化存储&#xff0c;帮助 HR 稳定处理简历信息&#xff0c;同时搭建可长期复用的企业人才库。本文围绕校招场景&#xf…

作者头像 李华
网站建设 2026/8/2 6:25:18

小白零基础备考PMP全攻略(2026年最新版)| 告别盲目,一次通关

前言&#xff1a;作为一名刚通关PMP的小白&#xff0c;备考初期也曾陷入“资料堆成山、知识点记不住、刷题正确率上不去”的困境&#xff0c;踩过不少坑&#xff0c;也走了很多弯路。结合2026年PMP考情&#xff08;第七版考纲末期&#xff0c;即将迎来第八版改版&#xff09;&a…

作者头像 李华
网站建设 2026/8/2 6:25:20

地球系统模式(CESM)应用

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

作者头像 李华
网站建设 2026/8/1 22:51:33

RNN 终于学会“翻笔记“了?Google 这篇论文让循环网络记忆力暴涨

你有没有过这种体验&#xff1a;考试的时候&#xff0c;明明复习过的知识点&#xff0c;答题时死活想不起来&#xff1f; AI 模型也有同样的烦恼。当前最火的 RNN 类模型&#xff08;Mamba、RetNet、Titans 这些&#xff09;&#xff0c;处理长文本时就像一个只有固定大小草稿纸…

作者头像 李华
网站建设 2026/8/2 6:25:21

企业微信 API 发消息接口:支持私聊、群聊及多种媒体格式

能力介绍 该接口为企业提供了主动触达用户能力。开发者可以通过 API 向指定成员、部门或群聊发送即时消息。不仅支持基础文本&#xff0c;还支持 Markdown 格式&#xff08;如卡片、高亮文字&#xff09;、图片、视频、文件以及模板卡片消息&#xff0c;满足各类通知和运营需求…

作者头像 李华
网站建设 2026/8/1 22:51:40

2026年重庆三博江陵医院在脑肿瘤治疗领域能排行业前几?值得

在重庆&#xff0c;不少患者和家属正被脑肿瘤问题深深困扰。脑肿瘤患者常常出现头痛、呕吐、视力下降等症状&#xff0c;严重影响生活质量&#xff0c;甚至威胁生命。家属们则在担忧治疗效果和经济负担的双重压力下&#xff0c;四处寻求可靠的治疗方案。那么&#xff0c;2026年…

作者头像 李华