大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Shell 是什么
这一课你将能做到
- 说清楚 Shell、终端、Bash 三者的关系,以及它们和图形界面操作的区别
- 写出第一个带 shebang 的 Shell 脚本,赋权执行并看到输出
- 说出运维一台 Java 服务器时,Shell 能帮你干哪些「图形界面干不了」的活
为什么要学
你写的 Spring Boot 项目最终要跑在 Linux 服务器上。部署要执行命令、看日志要翻文件、查问题要看进程和端口——这些活全靠 Shell 完成。面试官问「线上服务挂了你怎么办」,你的排查路径(看进程、看日志、看端口、看磁盘)每一步都是 Shell 命令。
人话:图形界面像自动挡汽车,好用但进了机房没屏幕没鼠标你就抓瞎;Shell 是手动挡,直接和系统对话,服务器只给你一个黑窗口时,它是唯一的驾驶方式。掌握了它,你才能对服务器「指哪打哪」。
先建立图像
一次命令执行的三层结构:
你输入:grep "ERROR" app.log | wc -l
│
▼
┌─────────────── 终端(Terminal)───────────────┐
│ 负责画界面:显示黑窗口、接收键盘输入 │
│ ┌──────────── Shell(Bash)────────────┐ │
│ │ 负责翻译:读懂你的命令,调用对应程序 │ │
│ │ ┌──────── 系统内核(Kernel)──────┐ │ │
│ │ │ 真正干活:读写磁盘、分配内存 │ │ │
│ │ └─────────────────────────────────┘ │ │
│ └───────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
常见 Shell 一览:
| 名称 | 特点 | 场景 |
|---|---|---|
| bash | Linux 默认,资料最多 | 学习和运维首选 |
| zsh | macOS 默认,插件生态强 | 本地开发很舒服 |
| sh | 最老的 POSIX Shell | 老脚本兼容用 |
| fish | 开箱即用,语法不兼容 bash | 不建议当学习对象 |
你学的语法以 bash 为准,在 99% 的 Linux 服务器上直接可用。
跟着做
Windows 用户先装环境:推荐 WSL2(微软商店搜 Ubuntu),或轻量的 Git Bash。下面的命令在 Ubuntu 服务器 / WSL / Git Bash 里都能跑。
步骤 1:确认你用的是哪个 Shell
echo $SHELL # 默认登录 Shell,通常输出 /bin/bash
echo $0 # 当前正在运行的 Shell
echo 是最基础的输出命令,相当于 Java 的 System.out.println。
步骤 2:把终端当计算器和打印器
echo "hello, $(hostname)" # 命令替换:先执行 hostname 再拼进字符串
date # 当前时间,日志排查时经常用它对时间线
whoami # 当前用户,确认自己是不是 root
步骤 3:写下第一个脚本
mkdir -p ~/shell-lab && cd ~/shell-lab
vim hello.sh
vim 里按 i 进入插入模式,输入以下内容,然后按 Esc、输入 :wq 回车保存退出:
#!/bin/bash
# 我的第一行 Shell 代码
echo "当前用户:$(whoami)"
echo "当前目录:$(pwd)"
echo "参数个数:$#"
步骤 4:两种方式运行它
# 方式一:不需要执行权限,用 bash 解释器直接跑
bash hello.sh
# 方式二:加执行权限后像程序一样跑
chmod +x hello.sh
./hello.sh
方式二要求第一行 #!/bin/bash(叫 shebang)存在,它告诉系统「用 bash 来解释我这个文件」。没有它,系统会按默认 Shell 处理,某些语法可能出错。
步骤 5:体验一个真实运维场景
假设服务器上有个 Spring Boot 应用,用 Shell 三个命令完成「三连问」:
jps -l 2>/dev/null || ps -ef | grep java # 进程在不在
tail -n 20 /opt/myapp/logs/app.log # 最后 20 行日志说了什么
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/actuator/health # 接口活着吗
这三行现在看不懂没关系,本 Track 后面的课会逐个讲透。
讲清楚要点
- Shell 是命令解释器,Bash 是它的一种实现:你敲的每个命令,都是 Shell 解析后交给内核执行的。Bash = Bourne Again Shell,是 Linux 发行版的默认选择。
- 终端只是「窗口」,Shell 才是「大脑」:关掉终端,Shell 会话结束;但用
nohup启动的进程可以继续活(第 9 课细讲)。 - shebang 是脚本的身份证:
#!/bin/bash必须是文件第一行,#后的!不能有空格。写 Python 脚本则写#!/usr/bin/env python3,同一个机制。 - 命令的三段结构:
命令 [选项] [参数],如ls -l /opt。选项调整行为(-l长格式),参数是作用对象。命令 --help和man 命令是你最好的老师。 $#、$(...)、$?是三类不同的东西:$#是参数个数变量,$(...)是命令替换,$?是上一条命令的退出码。本章第 5 课系统讲。- 退出码是脚本世界的「返回值」:
0表示成功,非 0 表示失败。ls /not-exist; echo $?会输出非 0。Java 里你靠异常传递失败,Shell 靠退出码。
你可能会懵的地方
-
Shell 脚本和 Java 程序有什么本质区别? Java 是编译型语言,跑在 JVM 里,适合写业务;Shell 是解释执行的胶水语言,擅长把系统命令串起来,一行顶 Java 十行,但复杂逻辑、性能、类型安全都不如 Java。定位是「运维自动化」,不是「写业务」。
-
为什么要
chmod +x,不执行不行吗? Linux 判断一个文件能不能执行,看的是权限位而不是后缀名。没有x权限,即使内容是合法脚本,./hello.sh也会报Permission denied。用bash hello.sh则绕过这个限制,因为执行的是 bash 这个程序,脚本只是它的输入。 -
./hello.sh的./能省吗? 不能。系统按PATH环境变量里的目录找命令,当前目录默认不在其中,写hello.sh会报command not found。./明确表示「当前目录下的这个文件」。 -
echo $SHELL和echo $0不一样是正常的吗? 正常。$SHELL是登录时分配的默认 Shell(写在/etc/passwd里),$0是当前实际在跑的程序。在脚本里$0就是脚本路径。 -
学 bash 用什么环境练? Windows 用 WSL2(体验最接近真实 Ubuntu 服务器),或 Git Bash(够学完本 Track)。云服务器练最真实,用完记得释放,避免持续计费。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
脚本没有 shebang 直接 ./xx.sh | 依赖默认 Shell,语法可能不兼容 | 第一行写 #!/bin/bash |
把脚本命名为 xx.sh.txt | 加执行权限也报错 | 去掉多余后缀,mv xx.sh.txt xx.sh |
用记事本编辑后在 Linux 跑报 \r 相关错 | Windows 换行符 CRLF 混入 | dos2unix xx.sh 或编辑器设为 LF |
| 遇到不会的命令就百度搜广告答案 | 低效且常过时 | 命令 --help、man 命令 优先 |
| 一上来背几百个命令 | 背完就忘 | 记住高频 30 个 + 会查帮助,边用边记 |
卡点急救
command not found:先检查拼写(Linux 严格区分大小写),再确认命令是否安装(which 命令名有输出才是装了),最后检查 PATH。Permission denied:对脚本执行chmod +x;对目录进不去通常是缺x权限,第 3 课细讲;对系统文件则是需要sudo。No such file or directory:用pwd确认当前位置,用ls确认文件真实存在,注意 Linux 下App.log和app.log是两个文件。
面试常问
-
Shell 脚本中
#!/bin/bash有什么作用? shebang 行,指定解释此脚本的解释器路径。内核执行脚本时读取它,用指定解释器启动脚本。不写则由当前 Shell 兜底解析,跨环境时容易出现语法兼容问题(如[[ ]]在 sh 里不支持)。 -
命令的退出码是什么?怎么获取? 每条命令执行后返回一个 0-255 的整数,
$?保存最近一条的退出码,0 表示成功、非 0 表示失败。它是 Shell 脚本判断成败、决定流程走向的核心机制,类似 Java 方法的返回值但语义更简单。 -
你们线上排查 Java 服务问题,第一步做什么? 参考回答:先
ps -ef | grep java确认进程是否存活,再tail -f logs/app.log看最近日志有无异常堆栈,接着curl健康检查接口确认服务状态,再看ss -tlnp端口监听是否正常。整套动作全是 Shell 命令,这也是为什么后端工程师必须会 Shell。
自测三问
- 终端、Shell、内核三者各自负责什么?
- shebang 写在哪一行?作用是什么?
- 不加执行权限,还有哪种方式能运行脚本?
小结一句话
Shell 是你与 Linux 服务器对话的唯一语言,Bash 是它的主流方言;从 echo 和第一个脚本开始,你已经能对服务器开口说话了。
延伸
- GNU Bash 官方手册
- 下一课:目录与文件导航——学会在服务器文件系统里精准走位。