banner
约 1,200 字
4 分钟

Bash 脚本入门教程:从第一个脚本到自动备份

摘要

Bash 是 Linux/macOS 的默认 Shell,也是自动化的利器。本教程依据 GNU Bash 官方手册整理,从第一个脚本讲起,覆盖变量、条件判断、循环、参数传递,并用 rsync 实战一个自动备份脚本,附调试与严格模式技巧。

Bash 脚本入门教程

Bash 是 Linux/macOS 的默认 Shell,也是自动化最趁手的工具。很多重复性工作——批量改名、定时备份、日志清理——写几行 Bash 脚本就能解决。本教程依据 Bash 官方手册(GNU Bash Reference Manual)整理,带你从零写出第一个实用脚本。

一、第一个脚本

新建文件 hello.sh

bash
#!/bin/bash
# 我的第一个脚本

echo "Hello, $(whoami)! 现在时间:$(date)"

第一行 #!/bin/bash 叫 shebang,告诉系统用 bash 来执行。运行前要赋予执行权限:

bash
chmod +x hello.sh
./hello.sh

也可以不加分号直接用 bash hello.sh 执行。

二、变量

bash
name="kunkun"        # 等号两边不能有空格!
echo "你好,$name"    # 使用变量
echo "当前目录:$(pwd)"   # 命令替换:$(命令)

注意两点:赋值时等号两侧不能有空格$() 是执行命令并取其输出,反引号 ` 是旧写法,推荐 $()

三、条件判断

bash
if [ "$1" = "start" ]; then
    echo "启动服务"
elif [ -f "app.conf" ]; then
    echo "存在配置文件"
else
    echo "未知命令"
fi

常用判断条件:

条件

含义

-f 文件

存在且是普通文件

-d 目录

存在且是目录

-z "$s"

字符串为空

"$a" = "$b"

字符串相等

"$n" -gt 10

数值大于 10(-lt 小于、-ge 大于等于)

$1$2 是脚本的第一个、第二个参数,$# 是参数个数,$? 是上一条命令的退出码(0 表示成功)。

四、循环

遍历文件:

bash
for f in *.log; do
    echo "处理 $f"
done

数值循环:

bash
for i in 1 2 3 4 5; do
    echo "第 $i 次"
done

while 逐行读取文件:

bash
while read -r line; do
    echo "一行内容:$line"
done < list.txt

五、实战:自动备份脚本

结合之前讲过的 rsync,写一个可执行的备份脚本 backup.sh

bash
#!/bin/bash
set -e   # 任何一条命令失败就退出

SRC="$HOME/Documents/"
DST="/media/backup/Documents/"
LOG="$HOME/backup.log"

echo "[$(date '+%F %T')] 开始备份" >> "$LOG"
rsync -avhP --delete "$SRC" "$DST" >> "$LOG" 2>&1
echo "[$(date '+%F %T')] 备份完成" >> "$LOG"

set -e 是脚本安全的第一道防线;2>&1 把错误输出也写进日志。配合 crontab 加一行 0 2 * * * /path/to/backup.sh,就是全自动备份。

六、调试技巧

bash
bash -n script.sh    # 只检查语法,不执行
bash -x script.sh    # 逐行打印执行过程

脚本开头写 set -euo pipefail 可以开启严格模式,变量未定义、命令失败都立即报错。

七、总结

需求

写法

接收参数

$1 $2$# 个数

判断

if [ -f 文件 ]; then ... fi

遍历文件

for f in *.log; do ... done

逐行读取

while read -r line; ... done < 文件

出错即停

set -e

调试

bash -x 脚本

Bash 的精髓在于把命令拼起来,而不是复杂的语法。先从解决自己手头重复劳动的小脚本写起,越写越熟练。

END