想快速入门 Shell 脚本,建议从 bash 基础语法练起,先掌握变量、循环和条件判断,再逐步接触函数和文本处理工具。
先说结论:Shell 脚本适合自动化运维任务和批量处理,新手用 bash 入门最稳妥,但复杂逻辑建议用 Python 替代。
- 适合:系统管理、日志处理、简单自动化任务
- 先看:脚本结构、变量定义、基础流程控制
- 建议:多动手写小脚本,不要一开始就追求复杂功能,务必注意变量引号和错误处理
环境准备与第一个脚本
Linux 系统默认安装 bash,几乎所有发行版都支持。脚本第一行的#!/bin/bash叫 shebang,告诉系统用哪个解释器执行。如果省略这行,脚本可能用默认 shell 运行,导致兼容性问题。
创建并运行第一个脚本:
#!/bin/bash
echo "Hello, Shell Scripting!"
echo "当前用户:$USER"
echo "当前目录:$PWD"保存为 demo.sh 后执行:
chmod +x demo.sh
./demo.sh确认当前 Shell 环境:
echo $SHELL
bash `--version`核心语法与健壮性规范
变量定义时等号两边不能有空格,引用变量时建议加双引号以防空格导致错误。
name="Alice"
age=25
echo "姓名:$name, 年龄:$age"条件判断示例(注意变量加引号):
if [ "$age" -gt 18 ]; then
echo "成年人"
else
echo "未成年人"
fi循环示例:
for i in {1..5}; do
echo "循环次数:$i"
done健壮性建议:在生产脚本开头加入set -euo pipefail。-e表示命令出错立即退出,-u表示使用未定义变量报错,-o pipefail表示管道中任一命令失败则整个管道失败。
验证与调试方法
运行脚本后检查输出是否符合预期。可以用echo $?查看上一条命令的退出状态,0 表示成功,非 0 表示出错。
调试时可在脚本开头加set -x,会显示每条命令的执行过程:
#!/bin/bash
set -x
echo "调试模式开启"检查脚本语法是否正确(不执行):
bash -n script.sh如果没有输出,说明语法没问题。
实战案例:批量文件处理
假设需要批量修改当前目录下所有.txt文件的扩展名为.bak:
#!/bin/bash
for file in *.txt; do
if [ -f "$file" ]; then
mv "$file" "${file%.txt}.bak"
echo "已处理:$file"
fi
done注意:[ -f "$file" ] 用于判断文件是否存在,避免 glob 匹配失败时脚本报错。
错误捕获与处理机制
对于重要任务,建议添加错误捕获和清理逻辑,使用trap命令:
#!/bin/bash
set -e
cleanup() {
echo "发生错误,执行清理工作"
# 此处添加清理命令,如删除临时文件
}
trap cleanup ERR
echo "开始任务"
# 模拟可能出错的命令
rm /nonexistent_file 2>/dev/null
echo "任务完成"当脚本因错误退出时,cleanup函数会被自动调用。
常见坑与避坑指南
引号使用混淆:单引号原样输出,双引号会解析变量。想输出$100要用单引号'$100',用双引号会变成变量替换。
变量空格问题:定义变量时val = 1会报错,必须写成val=1,等号两边不能有空格。
数组下标:访问数组第一个元素用${array[0]},不是$array[0],花括号不能省略。
脚本局限性:Shell 适合处理命令和文件,但处理字符串分割、复杂算术运算或访问数据库时,用 Python、Perl 或 awk 会更合适。不要试图用 Shell 写大型程序。
可移植性:不同系统的默认 shell 可能不同,Linux 多是 bash,Solaris 可能是 sh。如果需要跨系统运行,尽量用 POSIX 标准的语法,或明确指定解释器路径。
参考来源
- 《Classic Shell Scripting》,Arnold Robbins 与 Nelson H.F. Beebe 合著,O'Reilly 出版
- GNU Bash 官方文档
- Linux 系统管理相关技术文档