Shell 脚本入门实战:3 步写出第一个自动化脚本
每天敲同样的几条命令:进目录、备份文件、重启服务——敲三遍就烦了。Shell 脚本就是把这些命令写进一个文件,让电脑按顺序替你跑一遍。下面用 3 步写出第一个能用的自动化脚本。
1. 先写一个能跑起来的最小脚本
新建一个文件 backup.sh,写三行:
#!/bin/bash
echo "开始备份"
cp notes.txt notes.txt.bak
第一行 #!/bin/bash 叫 shebang,告诉系统用 bash 来解释这个文件,没有它系统不知道该怎么执行。echo 是打印一句话,cp 是复制文件——这里就是把 notes.txt 备份成 notes.txt.bak。脚本的本质就是命令的集合:你在终端里能敲的命令,写进文件里一样能跑。
给它执行权限,再运行:
chmod +x backup.sh
./backup.sh
chmod +x 是加上“可执行”这个属性,没有它系统会拒绝运行。./ 表示“当前目录下的这个文件”,直接写 backup.sh 系统会去 PATH 里找,找不到就报错。看到“开始备份”打印出来、目录里多了一个 .bak 文件,第一步就成了。
2. 让脚本聪明一点:变量和判断
每次备份都覆盖同一个 .bak 文件,旧备份就丢了。用变量把日期拼进文件名:
#!/bin/bash
today=$(date +%Y%m%d)
cp notes.txt "notes-$today.txt.bak"
echo "已备份到 notes-$today.txt.bak"
$(date +%Y%m%d) 是把命令的输出抓回来当变量值,$today 就是引用这个变量。双引号里的 $today 会被替换成真实日期,单引号里则不会——这是新手最常踩的坑之一。
再加一个判断:文件不存在就别硬拷,直接报错退出:
if [ ! -f notes.txt ]; then
echo "找不到 notes.txt,退出"
exit 1
fi
[ ! -f notes.txt ] 的意思是“notes.txt 不是一个存在的文件”,exit 1 表示异常退出(0 才表示成功)。判断让脚本从“傻跑一遍”变成“知道自己在干什么”,出错时第一时间停下来,而不是一路错下去。
3. 循环:一次处理一堆文件
只备份一个文件还不够,实际要备份一整个目录。用循环遍历所有 .txt 文件:
for file in *.txt; do
cp "$file" "backup/$file.bak"
echo "已备份 $file"
done
*.txt 会展开成当前目录下所有 txt 文件,循环一个一个处理。注意 "$file" 要加双引号——文件名里万一有空格,不加引号会被拆成两个参数,复制就报错了。
把三步拼起来,就是一个能每天用的备份脚本:判断文件在不在、按日期命名、循环备份一堆文件。以后每天的手动操作,都可以照这个套路拆成“判断 + 循环 + 命令”写进脚本。
新手最容易踩的三个坑
第一,Windows 上写的脚本拿到 Linux 上跑,行尾的回车符会让 bash 报错。写脚本尽量直接在 Linux 环境里写,或者用编辑器把换行符改成 LF。
第二,rm 写进脚本要格外小心。rm -rf $dir/ 里变量一旦为空,就会变成 rm -rf /,后果不堪设想。删文件之前先 echo 出来确认一遍,或者先判断变量非空再执行。
第三,脚本里用相对路径,换个目录跑就找不到文件。定时任务跑脚本时当前目录往往不是你以为的那个,稳妥的做法是在脚本开头 cd 到固定目录,或者全程用绝对路径。
小结
Shell 脚本的入门套路就三步:把命令写进文件并加上执行权限,用变量和判断让它懂得变通,再用循环一次处理一堆文件。先从每天重复的那几条命令开始,把它们写成脚本跑通——能替你省下每天三分钟的脚本,就是好脚本。
- 点赞
- 收藏
- 关注作者
评论(0)