对于初学者,最推荐直接从 Linux 或 macOS 自带的 Bash 环境入手,专注于编写自动化运维任务和小工具,不要一开始就追求复杂架构。
先说结论:Shell 脚本适合处理文件批量操作、定时任务和服务启停,入门门槛低但细节陷阱多。
- 适合:Linux 服务器日常维护、简单数据预处理、构建流程自动化
- 先看:变量定义规范、命令退出码判断、日志输出习惯
- 建议:先在测试环境运行,加上 set -e 防止错误扩散,避免直接在生产执行未验证脚本
快速开始示例
#!/bin/bash
echo "Hello World"
保存为 hello.sh,赋予权限并运行:
chmod +x hello.sh
./hello.sh
原理解析
Shell 本质是命令解释器,脚本就是把多条命令按顺序存到文件里。它适合 glue code(胶水代码),把现有工具串起来。之所以强调权限和解释器,是因为系统需要知道用什么程序读取这个文件,以及是否允许执行。
核心语法与逻辑控制
脚本编程的核心在于逻辑控制,以下是条件判断与循环的基础用法:
1. 条件判断 (if):检查文件是否存在
if [ -f "/etc/passwd" ]; then
echo "File exists"
else
echo "File missing"
fi
2. 循环处理 (for):批量遍历文件
for file in *.log; do
echo "Processing $file"
done
3. 健壮性设置:在脚本开头加入 set -euo pipefail,遇到错误立即停止,避免后续命令在异常状态下运行。注意:使用 set -u 时,未定义变量会报错,需确保变量已初始化。
实战场景:批量备份脚本
以下是一个简单的备份示例,包含变量定义、时间戳生成和错误检查:
#!/bin/bash
set -e
BACKUP_DIR="/tmp/backup"
DATE=$(date +%F)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/app_$DATE.tar.gz" ./src
echo "Backup completed: $DATE"
验证与调试
运行脚本后,立即检查退出码:echo $?。返回 0 表示成功,非 0 表示出错。同时观察屏幕输出是否符合预期,重要操作建议重定向日志到文件,如 ./script.sh > log.txt 2>&1。
调试时使用 bash -x 脚本名 可以看到每一步实际执行的命令,便于定位逻辑错误。
常见坑与注意事项
- 变量赋值等号两边不能有空格,如
VAR=1正确,VAR = 1错误。 - 引用变量最好加双引号,防止含空格路径被截断,如
"$VAR"。 - Windows 编辑的文件可能有 CRLF 换行符,导致 Linux 下报错 "bad interpreter",需用 dos2unix 转换。
- rm -rf 变量未加引号且为空时,可能误删根目录,务必先 echo 检查变量内容。
推荐学习资源
- 官方文档:输入
man bash查看内置命令说明 - 在线检查:使用 ShellCheck 工具静态分析脚本潜在错误
- 开源参考:GitHub 上搜索 "awesome-shell" 查看优秀脚本集合