
1. 从命令行到脚本Bash自动化初体验第一次接触Ubuntu终端时你可能已经学会了用ls查看文件、用cd切换目录这些基础命令。但当你反复输入相同的命令序列时有没有想过让电脑自动完成这些重复劳动这就是Bash脚本的用武之地。想象一下你每天上班第一件事就是检查系统日志备份项目文件启动开发环境 这些操作完全可以用一个脚本搞定省下每天15分钟的重复操作。让我们从最简单的Hello World脚本开始。打开文本编辑器创建一个新文件#!/bin/bash echo 早上好今天又是充满代码的一天保存为greeting.sh后还需要给它执行权限chmod x greeting.sh现在每次打开终端只需输入./greeting.sh就能获得专属问候。这个简单的例子展示了脚本的核心价值——将重复操作封装成可复用的指令集。2. 脚本编程基础变量与控制流2.1 让脚本记住信息变量是脚本的短期记忆。比如这个备份脚本#!/bin/bash backup_dir/home/$USER/project_backups current_date$(date %Y%m%d) mkdir -p $backup_dir tar -czf $backup_dir/project_$current_date.tar.gz ./project_folder这里用到了三种变量赋值方式直接赋值backup_dir系统变量$USER命令输出$(date)提示变量名全大写是约定俗成的规范但并非强制要求。重要的是保持命名风格一致。2.2 条件判断智能脚本的核心想让脚本根据不同情况采取不同行动if语句是你的好帮手if [ -f /tmp/lockfile ]; then echo 检测到锁文件可能是上次运行未完成 rm -f /tmp/lockfile fi常用条件判断符-f文件存在-d目录存在-z字符串为空-eq数值相等2.3 循环处理批量操作的利器需要处理目录下所有.jpg文件for循环轻松搞定for img in *.jpg; do convert $img -resize 50% small_$img echo 已压缩$img done如果不知道循环次数可以用whilewhile ping -c 1 example.com /dev/null; do echo 网络通畅 - $(date) sleep 60 done echo 网络断开3. 实战演练系统管理自动化3.1 自动清理临时文件这个脚本会清理超过7天的临时文件并记录操作日志#!/bin/bash LOG_FILE/var/log/cleanup.log TEMP_DIRS(/tmp /var/tmp) echo 清理开始 $(date) $LOG_FILE for dir in ${TEMP_DIRS[]}; do echo 处理目录: $dir $LOG_FILE find $dir -type f -mtime 7 -delete -print $LOG_FILE done echo 清理完成共释放空间: $(df -h / | awk NR2{print $4}) $LOG_FILE可以添加到cron定时任务每周自动运行0 3 * * 0 /path/to/cleanup.sh3.2 智能系统监控脚本这个监控脚本会在资源占用过高时发出警告#!/bin/bash THRESHOLD80 EMAILadminexample.com check_disk() { local usage$(df -h / | awk NR2{print $5} | tr -d %) [ $usage -gt $THRESHOLD ] \ echo 警告磁盘使用率: ${usage}% | mail -s 磁盘警报 $EMAIL } check_memory() { local free$(free -m | awk NR2{printf %.0f, $3*100/$2}) [ $free -gt $THRESHOLD ] \ echo 警告内存使用率: ${free}% | mail -s 内存警报 $EMAIL } check_disk check_memory加入while sleep 300; do ... done循环就变成了持续监控工具。4. 脚本调试与优化技巧4.1 调试模式看清脚本每一步在脚本开头加上set -x或者运行时使用bash -x your_script.sh这会显示每条执行的命令及其参数特别适合查找逻辑错误。4.2 错误处理让脚本更健壮三个关键技巧遇到错误立即退出set -euo pipefail检查命令是否存在if ! command -v ffmpeg /dev/null; then echo 请先安装ffmpeg exit 1 fi清理临时文件trap rm -f $TMPFILE EXIT4.3 性能优化加速脚本运行减少子进程调用用内置命令替代外部命令避免不必要的管道操作大批量文件处理时使用find -exec代替循环比如统计文件数时# 较慢的方式 count0 for file in *; do ((count)) done # 更快的方式 count$(ls | wc -l)5. 进阶技巧让脚本如虎添翼5.1 用户交互创建友好界面#!/bin/bash PS3请选择操作 options(备份数据库 清理缓存 查看日志 退出) select opt in ${options[]}; do case $opt in 备份数据库) ./backup_db.sh ;; 清理缓存) ./clear_cache.sh ;; 查看日志) less /var/log/app.log ;; 退出) break ;; *) echo 无效选项;; esac done5.2 并行处理加速任务执行使用和wait实现简单并行for i in {1..10}; do process_data $i done wait echo 所有任务完成5.3 使用函数库代码复用创建~/.bash_functionslog() { echo [$(date %Y-%m-%d %H:%M:%S)] $* /var/log/myapp.log } send_alert() { local message$1 echo $message | mail -s 系统警报 adminexample.com }在脚本中引入source ~/.bash_functions log 脚本启动 send_alert 发现异常情况从最初简单的命令组合到如今能处理复杂系统任务的智能脚本Bash的自动化潜力远超多数人的想象。我曾在服务器迁移中使用脚本自动完成200多台机器的配置同步节省了团队近两周的工作量。记住好的脚本不是一蹴而就的——我的第一个自动化脚本现在看起来简直像石器时代的产物。关键是要开始动手在实践中不断迭代优化。