CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Shell 与 Bash 入门/课时/Shell 是什么
RawBlame
课时目录12 节

Shell 与 Bash 入门

  1. 01Shell 是什么
  2. 02目录与文件导航
  3. 03文件操作与权限
  4. 04管道与文本处理
  5. 05变量与字符串
  6. 06条件与循环
  7. 07函数与脚本结构
  8. 08正则表达式
  9. 09进程与定时任务
  10. 10网络命令
  11. 11系统管理与编辑器
  12. 12综合练习

Shell 是什么

Bash/Zsh/Fish、CLI vs GUI。

25 分钟

Shell 是什么

这一课你将能做到

  1. 说清楚 Shell、终端、Bash 三者的关系,以及它们和图形界面操作的区别
  2. 写出第一个带 shebang 的 Shell 脚本,赋权执行并看到输出
  3. 说出运维一台 Java 服务器时,Shell 能帮你干哪些「图形界面干不了」的活

为什么要学

你写的 Spring Boot 项目最终要跑在 Linux 服务器上。部署要执行命令、看日志要翻文件、查问题要看进程和端口——这些活全靠 Shell 完成。面试官问「线上服务挂了你怎么办」,你的排查路径(看进程、看日志、看端口、看磁盘)每一步都是 Shell 命令。

人话:图形界面像自动挡汽车,好用但进了机房没屏幕没鼠标你就抓瞎;Shell 是手动挡,直接和系统对话,服务器只给你一个黑窗口时,它是唯一的驾驶方式。掌握了它,你才能对服务器「指哪打哪」。

先建立图像

一次命令执行的三层结构:

你输入:grep "ERROR" app.log | wc -l
         │
         ▼
┌─────────────── 终端(Terminal)───────────────┐
│  负责画界面:显示黑窗口、接收键盘输入          │
│  ┌──────────── Shell(Bash)────────────┐    │
│  │  负责翻译:读懂你的命令,调用对应程序  │    │
│  │  ┌──────── 系统内核(Kernel)──────┐  │    │
│  │  │  真正干活:读写磁盘、分配内存    │  │    │
│  │  └─────────────────────────────────┘  │    │
│  └───────────────────────────────────────┘    │
└───────────────────────────────────────────────┘

常见 Shell 一览:

名称特点场景
bashLinux 默认,资料最多学习和运维首选
zshmacOS 默认,插件生态强本地开发很舒服
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 后面的课会逐个讲透。

讲清楚要点

  1. Shell 是命令解释器,Bash 是它的一种实现:你敲的每个命令,都是 Shell 解析后交给内核执行的。Bash = Bourne Again Shell,是 Linux 发行版的默认选择。
  2. 终端只是「窗口」,Shell 才是「大脑」:关掉终端,Shell 会话结束;但用 nohup 启动的进程可以继续活(第 9 课细讲)。
  3. shebang 是脚本的身份证:#!/bin/bash 必须是文件第一行,# 后的 ! 不能有空格。写 Python 脚本则写 #!/usr/bin/env python3,同一个机制。
  4. 命令的三段结构:命令 [选项] [参数],如 ls -l /opt。选项调整行为(-l 长格式),参数是作用对象。命令 --help 和 man 命令 是你最好的老师。
  5. $#、$(...)、$? 是三类不同的东西:$# 是参数个数变量,$(...) 是命令替换,$? 是上一条命令的退出码。本章第 5 课系统讲。
  6. 退出码是脚本世界的「返回值」: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 个 + 会查帮助,边用边记

卡点急救

  1. command not found:先检查拼写(Linux 严格区分大小写),再确认命令是否安装(which 命令名 有输出才是装了),最后检查 PATH。
  2. Permission denied:对脚本执行 chmod +x;对目录进不去通常是缺 x 权限,第 3 课细讲;对系统文件则是需要 sudo。
  3. 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。

自测三问

  1. 终端、Shell、内核三者各自负责什么?
  2. shebang 写在哪一行?作用是什么?
  3. 不加执行权限,还有哪种方式能运行脚本?

小结一句话

Shell 是你与 Linux 服务器对话的唯一语言,Bash 是它的主流方言;从 echo 和第一个脚本开始,你已经能对服务器开口说话了。

延伸

  • GNU Bash 官方手册
  • 下一课:目录与文件导航——学会在服务器文件系统里精准走位。
加载本节练习…
下一课 →目录与文件导航