什么是 shell脚本?从命令行到自动化小助手
你有没有在终端里反复输入相同的命令?比如每天早上都要 cd /home/user/project 然后 git pull 再 npm run dev?如果每次都要手动敲一遍,不仅费时,还容易出错。这时候,shell脚本就像一个“自动化小助手”,帮你把重复操作打包成一条命令,一键执行。
Shell 脚本的本质是一组按顺序执行的命令集合,通常保存为 .sh 文件,由 shell 解释器(如 Bash)来运行。它就像是给终端写的一份“操作说明书”,你只需说“执行这份说明书”,它就会自动完成所有步骤。
想象一下,你家的智能音箱能听懂“打开灯”、“播放音乐”这些指令。shell脚本就是给你的电脑终端“训练”出一套类似的指令系统,让你用简单的语言控制复杂流程。
如何编写第一个 shell脚本?
我们从最简单的例子开始。打开你喜欢的文本编辑器(比如 VS Code、vim 或 nano),新建一个文件,命名为 hello.sh。
#!/bin/bash
echo "你好,世界!"
保存后,打开终端,进入该文件所在的目录,执行以下命令:
chmod +x hello.sh
./hello.sh
💡 小贴士:
chmod +x是 Linux 系统中设置文件权限的重要命令。没有这个权限,系统会拒绝执行脚本。
变量使用:让脚本记住信息
变量就像一个“小盒子”,可以存放数据。在 shell脚本中,变量的定义非常简单:
#!/bin/bash
name="张三"
age=25
city="北京"
echo "我叫 $name,今年 $age 岁,住在 $city。"
运行结果:
我叫 张三,今年 25 岁,住在 北京。
变量命名规范
- 变量名只能包含字母、数字和下划线
- 不能以数字开头
- 推荐使用小写字母加下划线,如
user_name、max_retry
⚠️ 重要提醒:在 shell 中,变量赋值时等号两边不能有空格,否则会被当作命令解析,导致错误。
条件判断:让脚本学会“思考”
现实生活中,我们做决定常常需要判断条件。比如“如果下雨就带伞”。shell脚本也能实现类似逻辑。
#!/bin/bash
weather="下雨"
if [ "$weather" = "下雨" ]; then
echo "记得带伞!"
elif [ "$weather" = "多云" ]; then
echo "可以带伞,但不是必须。"
else
echo "今天天气晴朗,不用带伞。"
fi
常见的条件判断符号
| 操作符 | 含义 | 示例 |
|---|---|---|
= |
字符串相等 | [ "$a" = "hello" ] |
!= |
字符串不相等 | [ "$a" != "world" ] |
-eq |
数值相等 | [ $num -eq 10 ] |
-ne |
数值不相等 | [ $num -ne 5 ] |
-lt |
小于 | [ $num -lt 100 ] |
-gt |
大于 | [ $num -gt 50 ] |
💡 提示:在判断数值时,必须使用
-eq、-lt等专用符号,不能用=,否则会出错。
循环结构:重复执行任务的利器
当你需要对一组文件、数字或列表做相同操作时,循环就派上用场了。常见的有两种:for 循环和 while 循环。
for 循环:遍历列表
#!/bin/bash
fruits=("苹果" "香蕉" "橙子" "葡萄")
for fruit in "${fruits[@]}"; do
echo "我喜欢吃 $fruit。"
done
输出:
我喜欢吃 苹果。
我喜欢吃 香蕉。
我喜欢吃 橙子。
我喜欢吃 葡萄。
while 循环:条件满足就继续
#!/bin/bash
count=1
while [ $count -le 5 ]; do
echo "这是第 $count 次循环"
count=$((count + 1))
# 使用 $(( )) 进行算术运算
done
输出:
这是第 1 次循环
这是第 2 次循环
这是第 3 次循环
这是第 4 次循环
这是第 5 次循环
函数封装:模块化你的脚本逻辑
随着脚本变长,把重复功能封装成函数,能让代码更清晰、更易维护。就像把厨房里的工具分类存放,用的时候拿取方便。
#!/bin/bash
greet() {
local name="$1"
# local 表示局部变量,只在函数内有效
echo "欢迎,$name!今天过得怎么样?"
}
greet "李四"
greet "王五"
输出:
欢迎,李四!今天过得怎么样?
欢迎,王五!今天过得怎么样?
✅ 函数的优势:
- 代码复用性强
- 逻辑清晰,便于调试
- 支持参数传递,灵活度高
实战案例:自动备份脚本
现在我们来写一个实用的 shell脚本:每天自动备份指定目录到指定位置。
#!/bin/bash
SOURCE_DIR="/home/user/data"
BACKUP_DIR="/home/user/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$DATE.tar.gz"
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
echo "创建备份目录:$BACKUP_DIR"
fi
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$SOURCE_DIR" .
if [ $? -eq 0 ]; then
echo "✅ 备份成功:$BACKUP_DIR/$BACKUP_FILE"
else
echo "❌ 备份失败,请检查权限或路径。"
fi
将此脚本保存为 backup.sh,赋予执行权限后运行,即可完成一次完整备份。
📌 建议:你可以使用
cron定时任务每天凌晨自动执行该脚本,实现真正的自动化备份。
总结:shell脚本的价值与进阶建议
shell脚本虽然看似简单,却是运维、开发和系统管理中不可或缺的工具。它能帮你:
- 自动化重复任务
- 简化复杂操作流程
- 快速响应日常运维需求
- 提升工作效率,减少人为错误
掌握 shell脚本,就像学会了给电脑下达“智能指令”。从最基础的变量、条件、循环,到函数封装和实际项目应用,每一步都值得深入实践。
📝 最后建议:不要只看不练。每天写一个小程序,比如“统计日志行数”、“清理临时文件”、“批量重命名文件”,逐步积累经验。当你能用几行脚本解决一个繁琐问题时,那种成就感,真的值得。
shell脚本不是高深莫测的黑科技,而是每个开发者都应该掌握的“基础技能”。它不炫技,但极实用。从今天开始,动手写第一个脚本吧。