深入实践 Shell 脚本编程:高效自动化操作指南


一、什么是 Shell 脚本?

Shell 脚本是一种用 Shell 编写的脚本程序,用于执行一系列的命令。它是 Linux/Unix 系统中自动化管理任务的利器,能够显著提升工作效率,特别适合批量处理文件、监控系统状态、自动部署等任务。


二、Shell 脚本的基础语法

1. 脚本结构
  • Shebang 行:指定解释器路径。
    #!/bin/bash
    
  • 注释:以 # 开头的内容表示注释。
    # 这是一个注释
    
2. 变量
  • 定义变量
    NAME="Linux"
    
  • 使用变量
    echo "Welcome to $NAME"
    
  • 读取用户输入
    read USERNAME
    echo "Hello, $USERNAME"
    
3. 条件语句
  • if 结构
    if [ condition ]; thenecho "Condition met"
    elseecho "Condition not met"
    fi
    
  • 条件操作符
    • 文件判断:-e(存在)、-d(目录)、-f(文件)。
    • 数值比较:-eq(等于)、-gt(大于)、-lt(小于)。
    • 字符串比较:=(等于)、!=(不等)。
4. 循环
  • for 循环
    for i in {1..5}; doecho "Iteration $i"
    done
    
  • while 循环
    counter=1
    while [ $counter -le 5 ]; doecho "Count: $counter"((counter++))
    done
    
5. 函数
  • 定义函数
    my_function() {echo "This is a function"
    }
    
  • 调用函数
    my_function
    

三、Shell 脚本实战案例

1. 文件批量处理

需求:批量将 .log 文件重命名为带时间戳的文件名。

代码示例

#!/bin/bashfor file in *.log; dotimestamp=$(date +%Y%m%d_%H%M%S)mv "$file" "${file%.log}_$timestamp.log"echo "Renamed $file to ${file%.log}_$timestamp.log"
done

执行方法

  1. 保存为 rename_logs.sh
  2. 运行脚本:
    chmod +x rename_logs.sh
    ./rename_logs.sh
    

2. 系统监控脚本

需求:定时监控系统的 CPU 和内存使用情况。

代码示例

#!/bin/bashwhile true; doecho "CPU Usage: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')%"echo "Memory Usage: $(free -m | awk '/Mem:/ {printf "%.2f%%\n", $3/$2 * 100}')"sleep 5
done

执行方法

chmod +x monitor.sh
./monitor.sh

3. 自动备份脚本

需求:自动将指定目录下的文件压缩备份到 /backup 目录,并保留最近 7 天的备份。

代码示例

#!/bin/bashSOURCE_DIR="/path/to/source"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR"# 删除 7 天前的备份
find "$BACKUP_DIR" -type f -mtime +7 -exec rm -f {} \;
echo "Backup completed and old backups cleaned."

执行方法

chmod +x backup.sh
./backup.sh

4. 自动检测网络状态

需求:检测一组 IP 地址是否可达,并记录到日志文件。

代码示例

#!/bin/bashIP_LIST=("8.8.8.8" "1.1.1.1" "192.168.0.1")
LOG_FILE="network_status.log"for ip in "${IP_LIST[@]}"; doif ping -c 1 $ip > /dev/null 2>&1; thenecho "$(date): $ip is reachable" >> $LOG_FILEelseecho "$(date): $ip is unreachable" >> $LOG_FILEfi
done

执行方法

chmod +x check_network.sh
./check_network.sh

5. 用户管理脚本

需求:批量创建用户并设置默认密码。

代码示例

#!/bin/bashUSER_LIST=("user1" "user2" "user3")
DEFAULT_PASSWORD="password123"for user in "${USER_LIST[@]}"; doif id "$user" &>/dev/null; thenecho "User $user already exists."elseuseradd "$user"echo "$DEFAULT_PASSWORD" | passwd --stdin "$user"echo "User $user created with default password."fi
done

执行方法

sudo chmod +x create_users.sh
sudo ./create_users.sh

四、Shell 脚本调试与优化

1. 调试脚本
  • 开启调试模式:添加 set -x,逐行输出执行过程。
    set -x
    
  • 检查错误:使用 $? 检查上一条命令的执行结果。
2. 提高脚本效率
  • 使用 xargs 批量处理:
    ls *.log | xargs rm
    
  • 避免使用子进程,尽量用内建命令。
3. 增强可读性
  • 增加注释,解释每段代码的功能。
  • 使用函数组织代码逻辑。

五、Shell 脚本进阶技巧

1. 使用数组
  • 定义数组:
    my_array=("value1" "value2" "value3")
    
  • 遍历数组:
    for item in "${my_array[@]}"; doecho $item
    done
    
2. 使用正则表达式
  • 匹配字符串:
    if [[ $string =~ ^[0-9]+$ ]]; thenecho "This is a number."
    fi
    
3. 捕获信号
  • 捕获 Ctrl+C 信号并执行清理操作:
    trap "echo 'Interrupt signal received'; exit" SIGINT
    

六、Shell 脚本学习资源

1. 推荐书籍
  • 《Shell 编程技术》
  • 《Linux Shell 脚本攻略》
2. 在线资源
  • Linux Command
  • B 站 Shell 脚本入门教程。
3. 实践平台
  • 使用本地虚拟机(如 VirtualBox)或云服务器(如 AWS、Google Cloud)。

七、总结

Shell 脚本是 Linux 系统管理的重要工具,其简单、高效、灵活的特性使其在自动化操作中不可或缺。通过掌握基础语法和实战案例,你可以在工作中实现各种自动化任务,提升工作效率。

下一步实践

  1. 将上述案例改进为适应你的实际需求。
  2. 学习结合 awksed 编写更复杂的脚本。
  3. 使用定时任务(crontab)将脚本应用到生产环境。

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

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

相关文章

HTML5 SVG

HTML5 SVG SVG(Scalable Vector Graphics)是一种基于XML的图像格式,用于在网页上创建矢量图形。与传统的位图图像(如PNG和JPEG)不同,SVG图像可以无限放大而不失真,因为它们是由直线和曲线定义的数学路径,而不是像素点。HTML5支持直接在网页中嵌入SVG,使得网页设计更加…

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

gitlab:使用脚本批量下载项目,实现全项目检索

目的 当需要知道gitlab中所有项目是否存在某段代码时&#xff0c;gitlab免费版只提供了当个项目内的检索&#xff0c;当项目过多时一个个查太过繁琐。下面通过 GitLab API 将指定 Group 下的所有项目克隆到本地。此脚本会自动获取项目列表并逐一克隆它们&#xff0c;再在本地进…

【Android】android compat理解

1&#xff0c;前提 即便是在同一手机上安装的不同apk&#xff0c;其编译的apk不同&#xff0c;也会导致行为上的差异。如SDK34有限制后台启动&#xff0c;但如果安装的apk所依赖的sdk是33&#xff0c;则不会表现出此差异。这是如何实现的呢&#xff1f;其实&#xff0c;本质是…

使用php和Xunsearch提升音乐网站的歌曲搜索效果

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…

微信小程序被攻击怎么选择高防产品

家人们&#xff0c;微信小程序被攻击了&#xff01;这事儿可不小。你想想&#xff0c;咱们平时用小程序点外卖、购物、玩游戏&#xff0c;现在却可能面临信息泄露风险。卡顿、闪退都算轻的&#xff0c;关键是咱的账号安全、个人数据&#xff0c;就像在“裸奔”。小程序本是方便…

k8s上面的Redis集群链接不上master的解决办法

问题描述 之前在k8s上面部署了一台node&#xff0c;然后创建了6个redis的pod&#xff0c;构建了一个redis的集群&#xff0c;正常运行。 最近添加了一台slave node&#xff0c;然后把其中的几个redis的pod调度到了slave node上面&#xff0c;结果集群就起不来了&#xff0c;…

什么是 C++ 中的智能指针?有哪些类型的智能指针?

智能指针的定义 在 C 中&#xff0c;智能指针是一种类模板&#xff0c;用于管理动态分配的内存。它的主要目的是自动管理内存的生命周期&#xff0c;避免手动释放内存时可能出现的错误&#xff0c;如内存泄漏&#xff08;忘记释放内存&#xff09;和悬空指针&#xff08;访问已…

Oracle热备过程中对数据库崩溃的处理方法

引言 在热备过程中如果发生数据库崩溃、断电等情况该如何处理? 如果正在备份 users 表空间的数据文件过程中,此时的数据文件表头 SCN 会被锁定,此时正在复制数据文件时数据库崩溃,系统断电。 从而导致数据文件表头与控制文件中的不一致,导致数据库无法打开,会要求介质恢…

Python操作neo4j库py2neo使用之创建和查询(二)

Python操作neo4j库py2neo使用之创建和查询&#xff08;二&#xff09; py2neo 创建操作 1、连接数据库 from py2neo import Graph graph Graph("bolt://100.100.20.55:7687", auth(user, pwd), nameneo4j)2、创建Node from py2neo import Node, Subgraph # 创建…

Elasticsearch面试内容整理-高级特性

Elasticsearch 提供了一系列高级特性,这些特性可以极大地增强其搜索、分析和管理能力,使得它在大数据场景中表现出色。以下是 Elasticsearch 的一些重要高级特性: 近实时搜索(Near Real-Time Search) Elasticsearch 的一个关键特性是 近实时搜索(NRT),这意味着数据写入…

算法专题十一: 基础递归

目录 1. 汉诺塔2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点5. Pow(x, n) 1. 汉诺塔 题目链接&#xff1a; Leetcode汉诺塔 算法原理&#xff1a; 递归&#xff1a;宏观视角理解递归 本道题为什么能用递归&#xff1f; 让我们逐一分析 首先思考我们如何来解决汉诺…

Cmakelist.txt之win-c-udp-client

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(c_udp_client LANGUAGES C) ​ add_executable(c_udp_client main.c) ​ target_link_libraries(c_udp_client wsock32) ​ ​ include(GNUInstallDirs) install(TARGETS c_udp_clientLIBRARY DESTINATION $…

Git错误:gnutls_handshake() failed: The TLS connection was non-properly terminated

最终我通过这个博客解决了问题&#xff1a;解决Git错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated 解决方案 1. 检查网络连接 首先&#xff0c;确保你的网络连接是稳定的。尝试访问其他HTTPS网站或服务&#xff0c;以排除网络问…

用Python做一个websocket服务端

我对websocket服务端的功能定义是&#xff1a; 1.能将client端的软硬件信息关联&#xff08;如client_name和对应ip:port&#xff09;&#xff0c;且不支持重复关联; 2.可以判断接收自client端的消息属于哪种任务&#xff0c;并对应执行&#xff08;如关联、发消息&#xff0…

Lua如何连接MySQL数据库?

大家好&#xff0c;我是袁庭新。使用Lua语言如何来连接数据库呢&#xff1f;新哥这篇文章给你安排上。 1 LuaSQL概述 LuaSQL是一个轻量级的Lua到数据库管理系统&#xff08;DBMS&#xff09;的接口库&#xff0c;由Kepler Project维护&#xff0c;且是开源的。它提供了一个简…

机器学习基础07

目录 1.逻辑回归 1.1原理 1.2API 2.K-Means 2.1算法过程 2.2API 3.SVM&#xff08;支持向量机&#xff09; 3.1算法原理​ 3.2API 1.逻辑回归 逻辑回归(Logistic Regression)是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法。 1.1原理 逻辑回归的输…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“

最近给电脑做了新版的 Windows 11 LTSC操作系统&#xff0c;在启动VMware Workstation时&#xff0c;提示"此虚拟机已启用侧通道缓解&#xff0c;可增强安全性&#xff0c;但也会降低性能"&#xff0c;但是我没有启用 Hyper-V 相关的任何功能以及 WSL&#xff0c; 从…