Bash 快速入门
Bash 是 Linux 和 macOS 上最常用的命令行 Shell,也是 WSL2 中的默认 Shell。本文覆盖文件操作、管道、变量、条件判断、循环等核心用法。
发布于 2026年4月26日·6317 字·预计阅读 26 分钟
什么是 Bash
Bash(Bourne Again Shell)是 Linux 和 macOS 上默认的命令行解释器。你在终端里输入的每一条命令,都由 Bash 解析和执行。
作为开发者,日常离不开 Bash:操作文件、运行脚本、管理进程、连接服务器。本文不讲理论,只讲最实用的部分。
基本概念
Shell 与终端
- 终端:你看到的那个黑窗口(VSCode 终端、Ubuntu 终端等)
- Shell:终端里运行的命令解释器(Bash、Zsh、Fish 等)
- 命令:告诉 Shell 要做什么(
ls、cd、git等)
命令的基本结构
bash
command [选项] [参数]
示例:
bash
ls -la /home
# ^ ^^ ^^^^
# 命令 选项 参数
文件与目录操作
导航
bash
pwd # 显示当前所在目录
cd ~/projects # 切换到 home/projects 目录
cd .. # 返回上一级
cd - # 返回上一次所在目录
查看内容
bash
ls # 列出当前目录文件
ls -la # 显示所有文件(含隐藏文件)和详细信息
ls -lh # 人类可读的文件大小(KB、MB)
tree -L 2 # 以树形结构显示,深度 2 层
创建与删除
bash
mkdir -p src/components # 递归创建目录
touch index.html # 创建空文件
cp file.txt backup/ # 复制文件
cp -r src/ backup/ # 递归复制目录
mv old.txt new.txt # 重命名 / 移动
rm file.txt # 删除文件
rm -rf dist/ # 递归强制删除目录(危险,谨慎使用)
没有回收站,删除后无法恢复。执行前务必确认路径。
查看文件内容
bash
cat file.txt # 输出全部内容
head -20 file.txt # 前 20 行
tail -20 file.txt # 后 20 行
tail -f server.log # 实时跟踪日志(新内容自动显示,Ctrl+C 退出)
less file.txt # 分页查看(q 退出,/ 搜索)
wc -l file.txt # 统计行数
搜索
bash
grep "error" server.log # 在文件中搜索
grep -r "TODO" src/ # 递归搜索目录
grep -n "error" server.log # 显示行号
grep -i "error" server.log # 忽略大小写
管道与重定向
管道 |
把一个命令的输出传给下一个命令:
bash
# 统计目录下 .ts 文件数量
find . -name "*.ts" | wc -l
# 查找含 error 的日志行,取前 10 条
grep "error" server.log | head -10
# 查看占用端口 3000 的进程
lsof -i :3000 | grep LISTEN
重定向
bash
echo "hello" > file.txt # 覆盖写入
echo "world" >> file.txt # 追加写入
command 2> error.log # 错误输出写入文件
command > /dev/null 2>&1 # 丢弃所有输出
command 2>&1 | tee output.log # 同时输出到终端和文件
xargs — 把输入转为参数
bash
# 删除所有 .log 文件
find . -name "*.log" | xargs rm
# 批量查看文件
find . -name "*.json" | xargs cat
通配符与快捷键
通配符
bash
*.js # 所有 .js 文件
src/**/*.tsx # src 下所有层级的 .tsx 文件
file?.txt # file1.txt、file2.txt ...(单字符匹配)
{a,b,c}.json # a.json、b.json、c.json
快捷键
| 快捷键 | 作用 |
|---|---|
Ctrl + C | 终止当前命令 |
Ctrl + Z | 挂起当前命令(fg 恢复) |
Ctrl + D | 退出 Shell / 发送 EOF |
Ctrl + L | 清屏 |
Ctrl + A | 光标移到行首 |
Ctrl + E | 光标移到行尾 |
Ctrl + W | 删除光标前的一个单词 |
Ctrl + U | 删除光标前的整行 |
Ctrl + R | 搜索历史命令 |
Tab | 自动补全(命令名、文件名、路径) |
!! | 重复上一条命令 |
sudo !! | 以 root 权限重新执行上一条命令 |
变量
定义与使用
bash
NAME="bowie"
echo $NAME
echo "Hello, ${NAME}" # 花括号明确变量边界
# 命令替换 — 把命令输出赋给变量
FILES=$(ls *.js)
echo "JS 文件: ${FILES}"
# 获取上一条命令的退出状态码
echo $?
环境变量
bash
# 设置环境变量(当前终端有效)
export NODE_ENV=development
# 查看所有环境变量
env | grep NODE
# 常用环境变量
echo $HOME # 用户主目录
echo $PWD # 当前目录
echo $PATH # 可执行文件搜索路径
echo $USER # 当前用户名
在 .bashrc 中持久化
bash
# 编辑配置文件
nano ~/.bashrc
# 添加自定义变量和别名
export PATH="$HOME/.local/bin:$PATH"
alias ll="ls -lah"
alias gs="git status"
# 使配置生效
source ~/.bashrc
条件判断
if 语句
bash
# 判断文件是否存在
if [ -f "config.json" ]; then
echo "配置文件存在"
else
echo "配置文件不存在"
fi
# 判断目录是否存在
if [ -d "node_modules" ]; then
echo "依赖已安装"
fi
# 判断变量是否为空
if [ -z "$1" ]; then
echo "请提供参数"
exit 1
fi
常用判断条件
| 条件 | 含义 |
|---|---|
-f file | 文件存在 |
-d dir | 目录存在 |
-z "$var" | 变量为空 |
-n "$var" | 变量非空 |
"$a" = "$b" | 字符串相等 |
"$a" != "$b" | 字符串不相等 |
-eq / -ne / -lt / -gt | 数值比较(等于/不等于/小于/大于) |
&& 和 || 简写
bash
# 前一条成功才执行后一条
[ -f "package.json" ] && echo "是 Node 项目"
# 前一条失败才执行后一条
[ -f "package.json" ] || echo "不是 Node 项目"
# 实际场景
cd ~/project && npm run build && echo "构建成功"
循环
for 循环
bash
# 遍历文件
for file in *.js; do
echo "处理: $file"
done
# 遍历数字
for i in {1..5}; do
echo "第 $i 次"
done
# 遍历命令输出
for dir in $(ls -d src/*/); do
echo "目录: $dir"
done
while 循环
bash
# 等待服务启动
while ! curl -s http://localhost:3000 > /dev/null; do
echo "等待服务启动..."
sleep 1
done
echo "服务已启动"
函数
bash
# 定义函数
deploy() {
echo "部署到 $1 环境..."
npm run build
rsync -avz dist/ server:/var/www/$1/
echo "部署完成"
}
# 调用函数
deploy production
deploy staging
脚本
创建可执行脚本
bash
# 创建脚本文件
nano deploy.sh
# 写入内容
cat > deploy.sh << 'EOF'
#!/bin/bash
set -e # 任何命令失败立即退出
echo "开始构建..."
npm run build
echo "开始部署..."
rsync -avz dist/ server:/var/www/app/
echo "部署完成"
EOF
# 赋予执行权限
chmod +x deploy.sh
# 运行
./deploy.sh
脚本常用技巧
bash
#!/bin/bash
set -e # 命令失败立即退出
set -u # 引用未定义变量时报错
set -o pipefail # 管道中任何命令失败都报错
# 接收命令行参数
echo "脚本名: $0"
echo "第一个参数: $1"
echo "所有参数: $@"
echo "参数个数: $#"
# 读取用户输入
read -p "确认部署?(y/n) " confirm
if [ "$confirm" = "y" ]; then
echo "开始部署"
fi
进程管理
bash
# 查看进程
ps aux # 所有进程
ps aux | grep node # 过滤 node 进程
# 后台运行
npm run dev & # & 放到后台
nohup npm start & # nohup 关闭终端后继续运行
# 查看端口占用
lsof -i :3000 # 谁在用 3000 端口
lsof -i :3000 | grep LISTEN
# 终止进程
kill 12345 # 正常终止
kill -9 12345 # 强制终止
find 高级用法
bash
# 按名称查找
find . -name "*.test.ts"
# 按类型查找
find . -type d -name "node_modules"
# 按时间查找(最近 7 天修改过的文件)
find . -mtime -7 -name "*.js"
# 按大小查找(大于 10MB)
find . -size +10M
# 执行操作
find . -name "*.log" -delete
find . -name "*.sh" -exec chmod +x {} \;
速查表
text
文件操作:
ls -la 列出所有文件及详情
cd / mkdir / cp / mv / rm 导航与文件管理
touch / cat / head / tail 创建与查看
grep -rn "pattern" dir 递归搜索
管道与重定向:
cmd1 | cmd2 管道
> file 覆盖写入
>> file 追加写入
2>/dev/null 丢弃错误
find . | xargs rm 查找并操作
变量:
VAR="value" 定义变量
export VAR 导出为环境变量
$(command) 命令替换
source ~/.bashrc 重载配置
控制流:
[ -f file ] && echo 条件执行
for x in list; do...done for 循环
while condition; do...done while 循环
进程:
ps aux | grep name 查找进程
kill -9 PID 强制终止
lsof -i :PORT 查看端口占用