初学者如何学习编写 Shell 脚本基础篇?

文章导读
初学者学习 Shell 脚本,核心目标是将重复的命令行操作自动化。建议从“能跑通且安全”开始,先模仿现有脚本完成简单的文件备份或日志清理,再逐步深入语法细节。
📋 目录
  1. 核心语法与安全规范
  2. 逻辑控制实战
  3. 实战案例:自动化备份脚本
  4. 调试与验证方法
  5. 常见坑与排查
A A

初学者学习 Shell 脚本,核心目标是将重复的命令行操作自动化。建议从“能跑通且安全”开始,先模仿现有脚本完成简单的文件备份或日志清理,再逐步深入语法细节。

核心建议:Shell 脚本适合自动化重复的命令行操作,初期不要追求复杂逻辑,先保证脚本能安全执行。

  • 适合日常运维中的文件备份、日志轮转等重复任务
  • 脚本首行必须声明解释器,并建议开启严格模式
  • 建议每写几步就手动运行一次,确认无误再继续
  • 关键操作前务必检查返回值,避免错误累积

核心语法与安全规范

脚本第一行通常声明解释器,同时建议加入安全设置以防止错误被忽略。

初学者如何学习编写 Shell 脚本基础篇?
#!/bin/bash
set -euo pipefail

# 定义变量,等号两边不能有空格
BACKUP_DIR="/tmp/backup"
echo "Start backup to $BACKUP_DIR"

其中 set -euo pipefail 含义如下:

  • -e:任何命令失败则立即退出脚本
  • -u:使用未定义变量时报错
  • -o pipefail:管道中任一命令失败则返回错误

逻辑控制实战

掌握变量、输入、条件判断和循环是编写实用脚本的基础。

1. 读取用户输入

read -p "请输入项目名称:" PROJECT_NAME
echo "Project: $PROJECT_NAME"

2. 条件判断

if [ -d "$BACKUP_DIR" ]; then
    echo "Directory exists"
else
    mkdir -p "$BACKUP_DIR"
    echo "Directory created"
fi

3. 循环处理

for file in *.log; do
    if [ -f "$file" ]; then
        echo "Processing $file"
    fi
done

实战案例:自动化备份脚本

以下是一个包含错误处理的备份脚本示例,涵盖了变量、判断、命令执行及状态检查。

初学者如何学习编写 Shell 脚本基础篇?
#!/bin/bash
set -euo pipefail

SOURCE_DIR="/var/www/html"
BACKUP_DIR="/data/backups"
DATE=$(date +%F)

# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    echo "Error: Source directory not found"
    exit 1
fi

# 执行备份
tar -czf "$BACKUP_DIR/app_$DATE.tar.gz" "$SOURCE_DIR"

# 验证备份文件是否生成
if [ -f "$BACKUP_DIR/app_$DATE.tar.gz" ]; then
    echo "Backup successful"
else
    echo "Backup failed"
    exit 1
fi

调试与验证方法

运行脚本后观察屏幕输出是否符合预期。执行完后立即输入 echo $?,返回 0 表示成功,非 0 表示出错。

如需查看详细执行过程,可使用调试模式运行:

bash -x ./script.sh

常见坑与排查

  • 变量空格:赋值时等号两边不能有空格,否则报错。
  • 换行符问题:Windows 编辑过的脚本可能有 CRLF 换行符,导致解释器找不到,使用 dos2unix 转换。
  • 权限不足:忘记加执行权限直接运行,会提示 Permission denied,需运行 chmod +x 脚本名
  • 路径问题:执行脚本建议使用绝对路径或在脚本内切换目录,避免相对路径失效。