教程
🛠️

开发工具

Git、VS Code、终端与效率工具使用指南。

Shell 脚本入门:把重复劳动交给电脑

从第一个脚本讲起,搞懂变量、参数、条件判断、循环和函数,写出能自动干活的 Shell 脚本。

· 更新于 2026-07-20 阅读量 --

你有没有过这种经历:每天上班要敲七八条命令启服务、拉代码、装依赖;或者要在一百个文件上做同样的操作。这些重复活,写成一个 Shell 脚本让电脑自己跑,你只需双击一下。这一篇带你写出第一个能用的脚本。

把脚本想成”给电脑的一张便条清单”:你提前把步骤一条条写清楚,电脑照着念就行,不会漏、不会烦。

第一个脚本

新建文件 hello.sh

#!/bin/bash
# 这是注释,#! 那行叫 shebang,告诉系统用哪个解释器
echo "你好,这是我的第一个脚本"
  • #!/bin/bashshebang,指明用 Bash 来解释这个文件。
  • echo 就是”打印一句话”。

给它执行权限并运行:

chmod +x hello.sh     # 加可执行权限
./hello.sh            # 运行(./ 表示当前目录)

变量

name="小明"           # 赋值,等号两边不要有空格
echo "你好,$name"     # 用 $ 取变量值
count=10
echo "数量是 $count"

注意:name = "小明" 中间有空格会报错——Shell 把空格当命令分隔符,赋值千万别加空格。

接收参数

脚本可以接收运行时的参数:

#!/bin/bash
echo "第一个参数是:$1"
echo "第二个参数是:$2"
echo "全部参数是:$@"

运行 ./script.sh apple banana$1 就是 apple$2banana。这让你写的脚本能复用到不同输入。

条件判断

#!/bin/bash
if [ "$1" = "deploy" ]; then
  echo "开始部署..."
else
  echo "未知命令"
fi

[ ] 里是判断条件,= 判断相等(字符串),数字比较用 -eq-gt 等。注意 [ 后面和 ] 前面都要有空格,这是新手高频报错点。

循环

#!/bin/bash
# 遍历一串数字
for i in 1 2 3 4 5; do
  echo "第 $i 次"
done

# 遍历当前目录所有 .txt 文件
for f in *.txt; do
  echo "处理文件:$f"
done

循环让你”对一批东西做同一件事”,比如批量重命名、批量压缩。

实战:一键备份日志

#!/bin/bash
# 把今天的日志打包,按日期命名
DATE=$(date +%Y%m%d)
tar -czf "logs-$DATE.tar.gz" /var/log/*.log
echo "备份完成:logs-$DATE.tar.gz"

$(命令) 能把命令的输出结果存进变量,这里用 date 生成日期当文件名。

常见新手坑

  • 赋值加空格name = "x" 报错,必须 name="x"
  • [ ] 里忘了空格[ "$a" = "b" ] 的方括号内外都要有空格。
  • 忘了 chmod +x:直接 ./script.sh 提示没权限,得先加执行权限。
  • 用 Windows 记事本写脚本:换行符是 CRLF,Linux 跑会报 ^M 错误。用 VS Code 或终端编辑器写,换行设成 LF。

小测验

  • 问题1:脚本第一行为什么要写 #!/bin/bash?答案:shebang,告诉系统用 Bash 解释器来执行这个脚本。
  • 问题2:变量赋值 name = "x" 为什么错?答案:等号两边不能有空格,Shell 会把空格当命令分隔符。
  • 问题3:怎么在脚本里取运行时的第一个参数?答案:用 $1

更多实战:批量重命名一百个文件

你有一百张照片 photo1.jpgphoto100.jpg,想统一加前缀 trip-。手写一百条 mv 不现实,用脚本:

#!/bin/bash
for f in *.jpg; do
  mv "$f" "trip-$f"
done
echo "重命名完成"

for f in *.jpg 会把每张 jpg 依次赋给变量 fmv "$f" "trip-$f" 加上前缀。跑一次搞定一百张。注意变量加引号 "$f",防止文件名里有空格时出错。

让脚本更健壮

真实脚本常加判断,避免出错:

#!/bin/bash
if [ ! -f "$1" ]; then
  echo "用法:./check.sh 文件名"
  exit 1
fi
echo "文件存在:$1"

[ ! -f "$1" ] 判断第一个参数不是文件就提示用法并退出,比直接跑崩友好。

自测:你真的懂了吗

  • 脚本第一行为什么写 #!/bin/bash?答案:shebang,告诉系统用 Bash 解释执行。
  • 变量赋值 name = "x" 为什么错?答案:等号两边不能有空格。
  • 怎么取运行时的第一个参数?答案:用 $1

常见认知误区

写脚本最容易在细节上翻车。第一,变量赋值加空格——name = "x" 会报错,必须 name="x",因为 Shell 把空格当命令分隔符。第二,[ ] 里忘了空格——[ "$a" = "b" ] 的方括号内外都要有空格,漏了就语法错,这是最高频的报错点。第三,忘了 chmod +x./script.sh——提示没权限,得先加执行权限。第四,用 Windows 记事本写脚本——换行符是 CRLF,Linux 跑会报 ^M 错误,用 VS Code 或终端编辑器写,换行设成 LF。第五,脚本出错就手动重来——其实在关键步骤加 echo 打印变量值,能快速定位哪一步不对。第六,觉得脚本很难——先从”把几条常用命令串起来”开始,比如备份、批量重命名,比想象中简单,写熟了再学条件循环。脚本是”让电脑替你干活”的第一步,值得花时间。

这一篇你该记住的

  • 脚本以 #!/bin/bash 开头,用 chmod +x 加权限后 ./脚本 运行。
  • 变量 name="值"(无空格),用 $name 取值。
  • 参数:$1$2 取第几个,$@ 取全部。
  • 判断 if [ 条件 ]; then ... fi,循环 for ... do ... done
  • $(命令) 捕获命令输出;注意空格和换行符(用 LF)。

下一篇我们讲 Zsh 与 oh-my-zsh:把默认 Shell 换成更智能、更漂亮的 Zsh,并一键装上主题和插件。