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如果不知道循环次数,可以用while:
while 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 'NR==2{print $4}')" >> "$LOG_FILE"可以添加到cron定时任务,每周自动运行:
0 3 * * 0 /path/to/cleanup.sh3.2 智能系统监控脚本
这个监控脚本会在资源占用过高时发出警告:
#!/bin/bash THRESHOLD=80 EMAIL="admin@example.com" check_disk() { local usage=$(df -h / | awk 'NR==2{print $5}' | tr -d '%') [ "$usage" -gt "$THRESHOLD" ] && \ echo "警告!磁盘使用率: ${usage}%" | mail -s "磁盘警报" "$EMAIL" } check_memory() { local free=$(free -m | awk 'NR==2{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"' EXIT
4.3 性能优化:加速脚本运行
- 减少子进程调用:用内置命令替代外部命令
- 避免不必要的管道操作
- 大批量文件处理时使用
find -exec代替循环
比如统计文件数时:
# 较慢的方式 count=0 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_functions:
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> /var/log/myapp.log } send_alert() { local message="$1" echo "$message" | mail -s "系统警报" admin@example.com }在脚本中引入:
source ~/.bash_functions log "脚本启动" send_alert "发现异常情况"从最初简单的命令组合,到如今能处理复杂系统任务的智能脚本,Bash的自动化潜力远超多数人的想象。我曾在服务器迁移中使用脚本自动完成200多台机器的配置同步,节省了团队近两周的工作量。记住,好的脚本不是一蹴而就的——我的第一个自动化脚本现在看起来简直像石器时代的产物。关键是要开始动手,在实践中不断迭代优化。