怎么快速入门 Shell 脚本编程?有速通指南吗?

文章导读
想快速入门 Shell 脚本,建议从 bash 基础语法练起,先掌握变量、循环和条件判断,再逐步接触函数和文本处理工具。
📋 目录
  1. 环境准备与第一个脚本
  2. 核心语法与健壮性规范
  3. 验证与调试方法
  4. 实战案例:批量文件处理
  5. 错误捕获与处理机制
  6. 常见坑与避坑指南
  7. 参考来源
A A

想快速入门 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`

核心语法与健壮性规范

变量定义时等号两边不能有空格,引用变量时建议加双引号以防空格导致错误。

怎么快速入门 Shell 脚本编程?有速通指南吗?
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,会显示每条命令的执行过程:

怎么快速入门 Shell 脚本编程?有速通指南吗?
#!/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函数会被自动调用。

怎么快速入门 Shell 脚本编程?有速通指南吗?

常见坑与避坑指南

引号使用混淆:单引号原样输出,双引号会解析变量。想输出$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 系统管理相关技术文档