什么是 Shell

Shell 是用户与操作系统内核之间的接口程序。当你在终端中输入命令时,Shell 会解析你的输入并调用相应的程序执行。

为什么要学习 Shell

场景说明
自动化编写脚本自动完成重复性任务
远程管理SSH 远程连接服务器时只能使用命令行
效率熟练使用命令行比图形界面更快
编程基础理解文件系统、进程管理等概念

常见的 Shell

Shell说明
BashBourne Again Shell,最常用的 Shell
ZshZ Shell,功能更强大,兼容 Bash
FishFriendly Interactive Shell,语法更简单

文件系统操作

查看当前目录

pwd
pwd -P                  # 显示物理路径(解析符号链接)

pwdprint working directory 的缩写,显示当前所在的目录路径。

列出目录内容

ls
ls -l                   # 详细列表
ls -la                  # 显示所有文件(包括隐藏文件)
ls -lh                  # 显示文件大小(人类可读格式)
ls -la /home/edward     # 指定目录
ls -la --sort=size      # 按大小排序
ls -la --sort=time      # 按时间排序

示例输出:

total 24
drwxr-xr-x  2 edward edward 4096 Jul 12 10:00 documents
-rw-r--r--  1 edward edward  128 Jul 12 09:00 hello.txt
drwxr-xr-x  3 edward edward 4096 Jul 12 08:00 projects

切换目录

cd /home/edward         # 切换到绝对路径
cd documents            # 切换到相对路径
cd ..                   # 返回上级目录
cd ../..                # 返回上两级目录
cd ~                    # 切换到用户主目录
cd -                    # 返回上一次所在的目录
cd ~/projects           # 快捷方式,用户主目录下的 projects

创建目录

mkdir new_folder                  # 创建单个目录
mkdir -p projects/myapp           # 创建嵌套目录(-p 参数自动创建父目录)
mkdir -m 755 secure_folder       # 创建目录并设置权限

创建文件

touch hello.txt                   # 创建空文件
touch -t 202401010000 file.txt   # 创建文件并设置时间戳
echo "Hello World" > hello.txt    # 创建文件并写入内容
printf "Name: %s\nAge: %d\n" "Tom" 25 > info.txt  # 格式化输出

查看文件内容

cat hello.txt                     # 显示文件全部内容
cat -n hello.txt                  # 显示行号
head -n 10 hello.txt              # 显示前 10 行
tail -n 10 hello.txt              # 显示后 10 行
tail -f log.txt                   # 实时显示文件末尾(用于查看日志)
tail -F log.txt                   # 实时显示,文件被替换后仍能追踪
less hello.txt                    # 分页查看文件内容(按 q 退出)
more hello.txt                    # 分页查看(空格键翻页)

复制与移动

cp source.txt destination.txt          # 复制文件
cp -r folder1 folder2                  # 复制目录(-r 表示递归)
cp -i source.txt dest.txt              # 交互式复制(覆盖前提示)
cp -a folder1 folder2                  # 保留属性复制(归档模式)
cp -u source.txt dest.txt              # 仅复制更新的文件

mv file.txt new_location/file.txt      # 移动文件
mv old_name.txt new_name.txt           # 重命名文件
mv -i file.txt dest.txt                # 交互式移动

删除文件

rm file.txt                   # 删除文件
rm -i file.txt                # 交互式删除(删除前确认)
rm -r folder                  # 删除目录(-r 表示递归)
rm -rf folder                 # 强制删除目录(慎用!)
rm -rf -- folder              # 删除以 - 开头的文件

警告rm -rf 命令非常危险,会直接删除文件而不提示,误操作可能导致数据丢失!


文件权限

权限表示法

-rw-r--r--  1 edward edward  128 Jul 12 09:00 hello.txt
位置说明
-文件类型(- 普通文件,d 目录,l 符号链接)
rw-所有者权限(读、写、无执行)
r--组权限(读、无写、无执行)
r--其他用户权限(读、无写、无执行)

修改权限

chmod +x script.sh              # 添加执行权限
chmod -x script.sh              # 移除执行权限
chmod 755 script.sh             # 设置权限为 rwxr-xr-x
chmod 644 hello.txt             # 设置权限为 rw-r--r--
chmod u+x script.sh             # 只为所有者添加执行权限
chmod g+w file.txt              # 只为组添加写权限
chmod o-r file.txt              # 移除其他用户的读权限
chmod -R 755 folder/            # 递归修改目录权限

修改所有者

chown edward file.txt           # 修改所有者
chown edward:users file.txt     # 修改所有者和组
chown -R edward folder/         # 递归修改目录所有者
chgrp users file.txt            # 只修改组

数字权限说明:

数字权限说明
7rwx读、写、执行
6rw-读、写
5r-x读、执行
4r–只读
3-wx写、执行
2-w-只写
1–x只执行
0无权限

管道与重定向

管道(Pipe)

管道符 | 用于将一个命令的输出作为另一个命令的输入:

ls -la | grep ".txt"                    # 列出所有 txt 文件
cat log.txt | grep "error"              # 在日志中查找包含 error 的行
cat log.txt | grep "error" | wc -l      # 统计 error 出现的次数
cat log.txt | grep -v "info" | head -20 # 排除 info 行,显示前 20 行

重定向

echo "Hello" > file.txt              # 覆盖写入文件
echo "World" >> file.txt             # 追加写入文件
cat file.txt > output.txt            # 将文件内容复制到另一个文件
command > /dev/null                  # 将输出丢弃(不显示)
command 2> error.log                 # 将错误输出重定向到文件
command &> log.txt                   # 将标准输出和错误输出都重定向到文件
command >> log.txt 2>&1              # 追加输出,错误也追加

输入重定向

wc -l < file.txt                     # 统计文件行数(通过输入重定向)
cat > file.txt << EOF                # 多行输入(Here Document)
第一行
第二行
第三行
EOF

Git 版本控制

初始化仓库

git init                      # 初始化本地仓库
git init --bare repo.git      # 创建裸仓库(用于服务器)
git clone <repo-url>          # 克隆远程仓库
git clone --depth 1 <repo-url> # 浅克隆(只获取最近一次提交)
git clone -b <branch> <repo-url> # 克隆指定分支

基础操作

git add .                     # 将所有修改添加到暂存区
git add filename.txt          # 添加指定文件
git add -p filename.txt       # 交互式添加(逐块选择)
git commit -m "commit message" # 提交到本地仓库
git commit -am "message"      # 跳过暂存,直接提交已跟踪文件
git commit --amend            # 修改最后一次提交
git status                    # 查看工作区状态
git status -s                 # 简洁状态输出
git log                       # 查看提交历史
git log --oneline             # 简洁的提交历史
git log --oneline -5          # 最近 5 次提交
git log --graph --oneline     # 图形化显示提交历史
git log --all --oneline --graph # 显示所有分支
git diff                      # 查看未暂存的修改
git diff --staged             # 查看已暂存的修改
git diff HEAD                 # 查看所有修改

分支管理

git branch                    # 列出所有分支
git branch -v                 # 显示分支最后提交
git branch -a                 # 显示所有分支(包括远程)
git branch new-branch         # 创建新分支
git switch new-branch         # 切换到新分支(推荐,替代 git checkout)
git switch -c feature         # 创建并切换到新分支(推荐,替代 git checkout -b)
git merge feature             # 合并分支
git merge --no-ff feature     # 强制创建合并提交
git branch -d feature         # 删除分支
git branch -D feature         # 强制删除分支(未合并时)
git branch -m old-name new-name # 重命名分支

远程操作

git remote -v                 # 查看远程仓库
git remote add origin <url>   # 添加远程仓库
git remote rename origin github # 重命名远程仓库
git remote remove origin      # 删除远程仓库
git push -u origin main       # 推送到远程仓库(第一次)
git push                      # 推送到默认远程分支
git push origin feature       # 推送指定分支
git push -d origin feature    # 删除远程分支
git pull origin main          # 拉取远程更新并合并
git pull --rebase origin main # 拉取并变基
git fetch origin              # 获取远程更新(不合并)
git fetch origin feature:feature # 获取远程分支到本地
git rebase origin/main        # 将本地提交变基到远程
git reset --hard origin/main  # 强制重置到远程状态

撤销操作

git restore file.txt              # 撤销工作区修改(推荐)
git restore --staged file.txt     # 取消暂存(推荐)
git restore --source=HEAD~1 file.txt # 恢复到上一次提交的版本
git reset HEAD file.txt           # 取消暂存(传统方式)
git reset --hard HEAD             # 重置所有修改(慎用!)
git reset --hard HEAD~1           # 回退到上一次提交
git revert <commit-hash>          # 撤销提交(创建新提交)
git revert HEAD                   # 撤销最后一次提交
git checkout <commit> -- file.txt # 从特定提交恢复文件

暂存操作

git stash                       # 暂存工作区修改
git stash save "message"        # 暂存并添加说明
git stash list                  # 查看暂存列表
git stash apply                 # 应用最近的暂存
git stash apply stash@{1}       # 应用指定的暂存
git stash pop                   # 应用并删除暂存
git stash drop stash@{0}        # 删除指定暂存
git stash clear                 # 清空所有暂存

变基与合并

git rebase main                 # 在 main 分支基础上重新提交
git rebase -i HEAD~3            # 交互式变基(修改最近 3 次提交)
git cherry-pick <commit-hash>   # 复制指定提交到当前分支
git cherry-pick --no-commit <commit-hash> # 复制但不提交
git merge-base main feature     # 查找两个分支的共同祖先
git log main..feature           # 查看 feature 上独有的提交

awk 文本处理

基本语法

awk '{print $1}' file.txt                 # 打印第一列
awk '{print $1, $3}' file.txt             # 打印第一列和第三列
awk -F ':' '{print $1}' /etc/passwd       # 使用冒号作为分隔符
awk -F '[,:]' '{print $1}' file.txt       # 使用多个分隔符

内置变量

变量说明
$0整行内容
$1-$NF第 1 到最后一列
NF列数
NR当前行号
FS字段分隔符(默认空格)
OFS输出字段分隔符(默认空格)
RS记录分隔符(默认换行)
ORS输出记录分隔符(默认换行)
awk '{print NR, NF, $0}' file.txt       # 打印行号、列数、整行
awk '{print $1, $NF}' file.txt          # 打印第一列和最后一列

条件筛选

awk '$3 > 100' file.txt                 # 第三列大于 100 的行
awk '$3 > 100 && $4 == "yes"' file.txt   # 多条件筛选
awk '/pattern/ {print}' file.txt         # 匹配模式的行
awk '!/pattern/ {print}' file.txt        # 不匹配模式的行
awk 'NR > 5 && NR < 10 {print}' file.txt # 第 6-9 行

BEGIN/END 块

awk 'BEGIN {print "Start"} {print $1} END {print "End"}' file.txt
awk 'BEGIN {FS=":"} {print $1}' /etc/passwd   # 在处理前设置分隔符
awk '{sum += $2} END {print "Total:", sum}' file.txt # 计算总和

计算统计

awk '{sum += $2} END {print sum}' file.txt           # 计算第二列总和
awk '{count++} END {print count}' file.txt           # 统计行数
awk '{max = ($1 > max) ? $1 : max} END {print max}' file.txt # 最大值
awk '{sum += $2; count++} END {print sum/count}' file.txt # 平均值
awk '{if ($1 > max) {max=$1; line=$0}} END {print max, line}' file.txt

格式化输出

awk '{printf "%-10s %5d %8.2f\n", $1, $2, $3}' file.txt # 格式化输出
awk -v OFS="\t" '{print $1, $2}' file.txt               # 使用制表符分隔

实用示例

# 统计访问日志中每个 IP 的访问次数
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log | sort -rnk 2

# 计算 CSV 文件中某列的总和
awk -F ',' '{sum += $3} END {print "Total:", sum}' data.csv

# 提取 JSON 中的某个字段(简单情况)
curl -s https://api.github.com/users/octocat | awk -F '"' '/"login"/ {print $4}'

curl 网络请求

基本用法

curl https://example.com                    # 获取网页内容
curl -o output.html https://example.com     # 保存到指定文件
curl -O https://example.com/file.zip        # 自动保存文件名
curl -L https://example.com                 # 跟随重定向
curl -k https://example.com                 # 忽略 SSL 证书验证

请求参数

curl -X POST https://api.example.com/data          # POST 请求
curl -X PUT https://api.example.com/data           # PUT 请求
curl -X DELETE https://api.example.com/data/1      # DELETE 请求
curl -d "name=test&value=123" https://api.example.com # 发送表单数据
curl -d @data.json https://api.example.com         # 从文件读取数据
curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com # 发送 JSON
curl -H "Authorization: Bearer token" https://api.example.com # 添加认证头
curl -H "User-Agent: MyApp/1.0" https://api.example.com # 自定义 User-Agent

文件上传

curl -F "file=@path/to/file" https://api.example.com/upload # 上传文件
curl -F "file=@/path/to/image.jpg;type=image/jpeg" https://api.example.com/upload # 指定 MIME 类型
curl -F "name=test" -F "file=@file.txt" https://api.example.com/upload # 多个字段

认证

curl -u username:password https://api.example.com # 基本认证
curl -u username https://api.example.com          # 交互式输入密码
curl --oauth2-bearer token https://api.example.com # OAuth2 认证
curl --cert cert.pem --key key.pem https://api.example.com # 客户端证书
curl -c cookies.txt https://example.com           # 保存 Cookie 到文件
curl -b cookies.txt https://example.com           # 使用 Cookie 文件
curl -b "session=abc123" https://example.com      # 直接设置 Cookie
curl -b cookies.txt -c cookies.txt https://example.com # 读写 Cookie

代理

curl -x http://proxy.example.com:8080 https://example.com # HTTP 代理
curl -x socks5://proxy.example.com:1080 https://example.com # SOCKS5 代理
curl --noproxy localhost https://example.com       # 不走代理的地址

查看响应信息

curl -I https://example.com                       # 只显示响应头
curl -v https://example.com                       # 详细输出(调试用)
curl -s https://example.com                       # 静默模式(不显示进度)
curl -w "%{http_code}" https://example.com        # 自定义输出格式
curl -w "\nTotal time: %{time_total}s\n" https://example.com # 显示耗时

下载文件

curl -C - -O https://example.com/large-file.zip # 断点续传
curl -L -O https://example.com/file             # 跟随重定向并保存
curl -s https://example.com/api | jq .          # 静默模式 + JSON 解析
curl --limit-rate 100K https://example.com/large-file.zip # 限速下载

SSH 远程连接

基本连接

ssh user@hostname                    # 连接远程服务器
ssh user@192.168.1.100               # 使用 IP 地址连接
ssh -p 2222 user@hostname            # 指定端口连接
ssh hostname                         # 使用默认用户连接
ssh -o ConnectTimeout=10 user@hostname # 设置连接超时

SSH 密钥认证

ssh-keygen -t ed25519               # 生成密钥对(推荐算法)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_myserver # 指定文件名
ssh-keygen -t rsa -b 4096           # RSA 算法(兼容性更好)
ssh-copy-id user@hostname           # 将公钥复制到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname # 指定公钥文件
ssh user@hostname                   # 使用密钥登录(无需密码)

端口转发

ssh -L 8080:localhost:3000 user@hostname   # 本地端口转发(访问本机 8080 → 远程 3000)
ssh -L 8080:remote-server:3000 user@jump-host # 跳板机端口转发
ssh -R 3000:localhost:8080 user@hostname   # 远程端口转发(访问远程 3000 → 本机 8080)
ssh -D 1080 user@hostname                  # SOCKS 代理
ssh -L 8080:localhost:3000 -N user@hostname # 只转发端口,不执行命令

远程执行命令

ssh user@hostname "ls -la"                 # 在远程执行命令
ssh user@hostname "cat /var/log/syslog"    # 查看远程日志
ssh user@hostname "cd /home && ls"        # 执行多个命令
ssh user@hostname << 'EOF'                # 执行多行命令(Here Document)
cd /home
ls -la
echo "Done"
EOF

文件传输(scp)

scp localfile.txt user@hostname:/remote/path # 上传文件
scp user@hostname:/remote/path/file.txt .   # 下载文件
scp -r localfolder/ user@hostname:/remote/path # 上传目录
scp -r user@hostname:/remote/folder/ .      # 下载目录
scp -P 2222 file.txt user@hostname:/path   # 指定端口
scp -i ~/.ssh/id_ed25519 file.txt user@hostname:/path # 指定密钥

文件传输(rsync)

rsync -av localfile.txt user@hostname:/remote/path # 同步文件
rsync -av localfolder/ user@hostname:/remote/path/ # 同步目录
rsync -av --delete localfolder/ user@hostname:/remote/path/ # 同步并删除多余文件
rsync -avz localfolder/ user@hostname:/remote/path/ # 压缩传输
rsync -av --exclude="*.log" localfolder/ user@hostname:/remote/path/ # 排除文件

SSH 配置文件

编辑 ~/.ssh/config

Host myserver
    HostName 192.168.1.100
    User edward
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes
    ConnectTimeout 10

Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github

然后使用:

ssh myserver                  # 使用配置连接
scp file.txt myserver:/path   # scp 也支持配置

压缩与解压

tar

tar -cvf archive.tar files/            # 创建 tar 归档
tar -czvf archive.tar.gz files/        # 创建 gzip 压缩归档
tar -cjvf archive.tar.bz2 files/       # 创建 bzip2 压缩归档
tar -cJvf archive.tar.xz files/        # 创建 xz 压缩归档
tar -tvf archive.tar                   # 查看归档内容
tar -xvf archive.tar                   # 解压归档
tar -xzvf archive.tar.gz               # 解压 gzip 归档
tar -xjvf archive.tar.bz2              # 解压 bzip2 归档
tar -xJvf archive.tar.xz               # 解压 xz 归档
tar -xvf archive.tar -C /dest/path     # 解压到指定目录

zip/unzip

zip archive.zip file1.txt file2.txt     # 创建 zip 压缩包
zip -r archive.zip folder/             # 递归压缩目录
unzip archive.zip                      # 解压 zip 包
unzip archive.zip -d /dest/path        # 解压到指定目录
unzip -l archive.zip                   # 查看 zip 包内容

gzip/gunzip

gzip file.txt                          # 压缩文件(生成 file.txt.gz)
gzip -k file.txt                       # 压缩但保留原文件
gunzip file.txt.gz                     # 解压文件
gzip -d file.txt.gz                    # 解压文件(同上)

进程管理

ps

ps                                     # 查看当前终端进程
ps aux                                 # 查看所有进程(常用)
ps aux | grep "python"                 # 查找指定进程
ps aux --sort=-%mem | head -10         # 按内存占用排序
ps aux --sort=-%cpu | head -10         # 按 CPU 占用排序
ps -ef                                 # 查看进程树
ps -p <pid> -o %cpu,%mem,cmd           # 查看指定进程详情

top

top                                    # 实时查看进程(按 q 退出)
top -u username                        # 只显示指定用户的进程
top -p <pid>                           # 只显示指定进程
top -d 2                               # 每 2 秒刷新一次

top 快捷键:

快捷键功能
P按 CPU 排序
M按内存排序
T按时间排序
k终止进程
q退出

htop(推荐替代 top)

htop                                   # 更友好的进程查看工具
htop -u username                       # 过滤用户进程

kill

kill <pid>                             # 终止进程(发送 SIGTERM)
kill -9 <pid>                          # 强制终止进程(发送 SIGKILL)
kill -15 <pid>                         # 优雅终止(SIGTERM)
kill -HUP <pid>                        # 重启进程(SIGHUP)
pkill process_name                     # 按进程名终止
killall process_name                   # 终止所有同名进程

后台运行

command &                              # 在后台运行命令
nohup command &                        # 后台运行,退出终端后仍继续执行
setsid command                         # 创建新会话运行命令
screen                                 # 创建屏幕会话
tmux                                   # 创建 tmux 会话(推荐)
jobs                                   # 查看后台任务
fg %1                                  # 将后台任务 1 切换到前台
bg %1                                  # 将前台任务 1 切换到后台

磁盘管理

df

df                                     # 查看磁盘使用情况
df -h                                  # 人类可读格式
df -h /                                # 查看指定挂载点
df -i                                  # 查看 inode 使用情况

du

du                                     # 查看目录大小
du -h                                  # 人类可读格式
du -h -s folder/                       # 查看目录总大小
du -h folder/ | sort -rh | head -20    # 按大小排序,显示前 20
du -h --max-depth=2 folder/            # 限制深度

free

free                                   # 查看内存使用情况
free -h                                # 人类可读格式
free -m                                # 以 MB 为单位
free -s 2                              # 每 2 秒刷新一次

lsblk

lsblk                                  # 查看磁盘分区信息
lsblk -f                               # 显示文件系统类型

文本处理进阶

sed

sed 's/old/new/' file.txt              # 替换每行第一个匹配
sed 's/old/new/g' file.txt             # 全局替换
sed -i 's/old/new/g' file.txt          # 原地修改文件
sed 's/old/new/g' -i.bak file.txt      # 修改并备份原文件
sed '/pattern/d' file.txt              # 删除匹配的行
sed '/pattern/!d' file.txt             # 删除不匹配的行
sed '2,5d' file.txt                    # 删除第 2-5 行
sed '3a new line' file.txt             # 在第 3 行后添加
sed '3i new line' file.txt             # 在第 3 行前插入
sed -n '2,5p' file.txt                 # 显示第 2-5 行

sort

sort file.txt                          # 按字母排序
sort -n file.txt                       # 按数字排序
sort -rn file.txt                      # 按数字降序排序
sort -t ',' -k 2 file.txt              # 按逗号分隔的第 2 列排序
sort -u file.txt                       # 去重排序
sort file1.txt file2.txt               # 合并排序

uniq

sort file.txt | uniq                   # 去重(需要先排序)
sort file.txt | uniq -c                # 统计重复次数
sort file.txt | uniq -d                # 只显示重复行
sort file.txt | uniq -u                # 只显示不重复行

wc

wc -l file.txt                         # 统计行数
wc -w file.txt                         # 统计单词数
wc -c file.txt                         # 统计字节数
wc -L file.txt                         # 统计最长行长度
wc file.txt                            # 显示所有统计信息

diff

diff file1.txt file2.txt               # 比较两个文件
diff -u file1.txt file2.txt            # 统一格式显示
diff -r folder1/ folder2/              # 递归比较目录
diff -q folder1/ folder2/              # 只显示差异存在
sdiff file1.txt file2.txt              # 并排显示差异

comm

comm file1.txt file2.txt               # 比较两个已排序文件
comm -1 file1.txt file2.txt            # 不显示只在 file1 中的行
comm -2 file1.txt file2.txt            # 不显示只在 file2 中的行
comm -3 file1.txt file2.txt            # 只显示共同行

查找与搜索

find

find . -name "*.txt"                   # 在当前目录下查找所有 txt 文件
find /home -type f -name "*.log"       # 在 /home 目录下查找所有 log 文件
find . -size +10M                      # 查找大于 10MB 的文件
find . -size -1k                       # 查找小于 1KB 的文件
find . -mtime -7                       # 查找最近 7 天内修改的文件
find . -atime -1                       # 查找最近 1 天内访问的文件
find . -user edward                    # 查找指定用户的文件
find . -type d -name "__pycache__" -exec rm -rf {} + # 删除所有 __pycache__ 目录
find . -name "*.pyc" -delete           # 删除所有 pyc 文件
find . -exec grep -l "pattern" {} \;   # 在找到的文件中搜索模式

grep

grep "pattern" file.txt                # 在文件中查找模式
grep -r "pattern" .                    # 递归查找目录中的所有文件
grep -i "pattern" file.txt             # 忽略大小写
grep -n "pattern" file.txt             # 显示匹配行的行号
grep -v "pattern" file.txt             # 显示不匹配的行
grep -c "pattern" file.txt             # 统计匹配行数
grep -A 3 "pattern" file.txt           # 显示匹配行及后面 3 行
grep -B 3 "pattern" file.txt           # 显示匹配行及前面 3 行
grep -C 3 "pattern" file.txt           # 显示匹配行及前后 3 行
grep -l "pattern" *.txt                # 只显示匹配的文件名
grep -E "pattern1|pattern2" file.txt   # 使用扩展正则表达式

which/whereis/locate

which python                           # 查找命令的位置(可执行文件)
whereis python                         # 查找命令的二进制、源码和手册
locate "*.txt"                         # 快速查找文件(基于数据库)
updatedb                               # 更新 locate 数据库

其他常用命令

wget

wget https://example.com/file.zip      # 下载文件
wget -O output.zip https://example.com/file.zip # 指定文件名
wget -c https://example.com/large.zip # 断点续传
wget -r https://example.com/docs/      # 递归下载(镜像网站)
wget -np https://example.com/docs/     # 不下载父目录
wget -q https://example.com/file.zip   # 静默模式

head/tail

head -n 10 file.txt                    # 显示前 10 行
head -c 100 file.txt                   # 显示前 100 字节
tail -n 10 file.txt                    # 显示后 10 行
tail -f log.txt                        # 实时显示文件末尾
tail -F log.txt                        # 实时显示(文件被替换后仍能追踪)

touch

touch file.txt                         # 创建空文件
touch -t 202401010000 file.txt         # 设置文件时间戳
touch -a file.txt                      # 只修改访问时间
touch -m file.txt                      # 只修改修改时间

ln

ln -s /path/to/target linkname         # 创建符号链接(软链接)
ln /path/to/target linkname            # 创建硬链接
ls -la linkname                        # 查看链接指向
readlink linkname                      # 查看符号链接目标

date

date                                   # 显示当前时间
date +"%Y-%m-%d %H:%M:%S"              # 自定义格式
date -d "yesterday"                    # 显示昨天的日期
date -d "next week"                    # 显示下周的日期
date -s "2024-01-01 12:00:00"          # 设置系统时间(需要 root)

cal

cal                                    # 显示当前月份日历
cal 2024                               # 显示全年日历
cal 12 2024                            # 显示指定月份

环境变量

查看与设置

echo $PATH                             # 查看 PATH 环境变量
env                                    # 查看所有环境变量
printenv                               # 查看所有环境变量(更简洁)
export MY_VAR="hello"                  # 设置临时环境变量(仅当前会话有效)
export PATH="$PATH:/my/custom/path"    # 添加到 PATH
MY_VAR="value" command                 # 为单个命令设置环境变量

永久设置

编辑 ~/.bashrc~/.zshrc 文件,添加:

export PATH="$PATH:/my/custom/path"
export EDITOR="vim"
export LANG="zh_CN.UTF-8"

然后执行:

source ~/.bashrc                       # 使配置生效

常用环境变量

变量说明
HOME用户主目录
PATH命令搜索路径
USER当前用户名
SHELL当前 Shell
EDITOR默认编辑器
LANG语言设置
PWD当前工作目录

实用技巧

命令历史

history                                # 查看命令历史
history | grep "git"                   # 搜索历史命令
history -c                             # 清空命令历史
!123                                   # 执行历史中的第 123 条命令
!!                                     # 执行上一条命令
!$                                     # 引用上一条命令的最后一个参数
!git                                   # 执行最近一条 git 命令
Ctrl + R                               # 反向搜索命令历史

Tab 补全

Tab 键可以自动补全命令、文件名、目录名等:

ls docu<Tab>                           # 自动补全为 documents
cd proj<Tab>                           # 自动补全为 projects
git che<Tab>                           # 自动补全为 checkout/cherry-pick 等

快捷键

快捷键功能
Ctrl + C终止当前命令
Ctrl + \终止进程并生成 core dump(发送 SIGQUIT 信号)
Ctrl + D退出 Shell(等价于 exit)
Ctrl + L清屏(等价于 clear)
Ctrl + A移动到命令行开头
Ctrl + E移动到命令行结尾
Ctrl + U删除光标前的所有字符
Ctrl + K删除光标后的所有字符
Ctrl + W删除光标前的一个单词
Ctrl + Y粘贴上次删除的内容
Ctrl + R反向搜索命令历史
Ctrl + Z暂停当前命令(放入后台)
Ctrl + T交换光标前后两个字符

命令别名

编辑 ~/.bashrc 添加别名:

alias ll='ls -la'
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'

然后执行 source ~/.bashrc 使别名生效。

命令替换

echo "Current date: $(date)"           # 命令替换(推荐)
echo "Current date: `date`"            # 命令替换(传统方式)
files=$(ls *.txt)                      # 将命令输出赋值给变量
for file in $(ls *.txt); do echo $file; done

总结

文件操作命令

命令用途
pwd查看当前目录
ls列出目录内容
cd切换目录
mkdir创建目录
touch创建文件
cat查看文件内容
cp复制文件
mv移动/重命名文件
rm删除文件
ln创建链接

权限管理命令

命令用途
chmod修改文件权限
chown修改文件所有者
chgrp修改文件组

Git 命令

命令用途
git init初始化仓库
git add添加到暂存区
git commit提交到本地仓库
git push推送到远程仓库
git pull拉取远程更新
git branch分支管理
git switch切换分支
git merge合并分支
git rebase变基
git stash暂存修改
git restore恢复文件

文本处理命令

命令用途
grep文本搜索
awk文本处理和数据提取
sed流编辑
sort排序
uniq去重
wc统计
diff文件比较

查找命令

命令用途
find文件查找
which命令位置
whereis命令位置(含手册)
locate快速文件查找

网络命令

命令用途
curl发送 HTTP 请求
wget下载文件
ssh远程连接服务器
scp安全文件传输
rsync同步文件

进程管理命令

命令用途
ps查看进程
top实时进程监控
htop更友好的进程监控
kill终止进程

磁盘管理命令

命令用途
df磁盘使用情况
du目录大小
free内存使用情况

压缩命令

命令用途
tar创建/解压 tar 归档
zip/unzip创建/解压 zip
gzip/gunzip压缩/解压 gzip

管道与重定向

符号用途
``
>输出重定向(覆盖)
>>输出重定向(追加)
2>错误输出重定向
2>&1错误重定向到标准输出
<输入重定向

通过这一课的学习,你已经掌握了 Shell 和常用命令行工具的基本操作。这些工具是高效开发的基础,熟练使用它们可以极大提升你的工作效率。继续学习,探索更多强大的命令行技巧!