Shell 与常用命令
easyLinuxShellBash命令行
Shell 是什么
Shell 是用户与操作系统内核之间的 命令行解释器。用户输入的每条命令,Shell 都会解析并转化为系统调用,交给内核执行。
用户输入命令 ──▶ Shell 解析 ──▶ 系统调用 ──▶ 内核执行
"ls -la" 解析参数 fork+exec 读目录返回
可以把 Shell 理解为一个「翻译官」:你说人话(命令),它翻译成内核能听懂的语言(系统调用)。
常见 Shell 类型
| Shell | 说明 |
|---|---|
| Bash | 最广泛使用的 Linux 默认 Shell |
| Zsh | Bash 的增强版,macOS 默认 Shell |
| Fish | 语法友好、自动补全强大的现代 Shell |
| sh | 最原始的 Bourne Shell,POSIX 标准 |
| Dash | 轻量级 sh 兼容 Shell,Debian/Ubuntu 用于系统脚本 |
# 查看当前使用的 Shell
echo $SHELL # /bin/bash
# 查看系统支持的所有 Shell
cat /etc/shells
文件与目录操作
导航与查看
pwd # 显示当前目录
ls -la # 列出所有文件(含隐藏文件),显示详细信息
cd /path/to/dir # 进入目录
cd ~ # 回到 home 目录
cd - # 返回上一个目录
tree -L 2 # 树形显示目录结构,深度 2 层
文件操作
# 创建
touch file.txt # 创建空文件 / 更新时间戳
mkdir -p a/b/c # 递归创建多级目录
# 复制 / 移动 / 删除
cp -r src/ dst/ # 递归复制目录
mv old.txt new.txt # 重命名 / 移动
rm -rf dir/ # 强制递归删除(⚠️ 危险操作)
# 查看文件内容
cat file.txt # 一次性输出全部内容
less file.txt # 分页查看(支持搜索)
head -n 20 file.txt # 查看前 20 行
tail -f log.txt # 实时跟踪文件末尾(看日志常用)
文本搜索与处理
grep — 文本搜索
grep "error" log.txt # 搜索包含 error 的行
grep -i "error" log.txt # 忽略大小写
grep -r "TODO" src/ # 递归搜索目录
grep -n "pattern" file.txt # 显示行号
grep -c "error" log.txt # 统计匹配行数
grep -v "debug" log.txt # 反向匹配(排除 debug 行)
find — 文件搜索
find / -name "*.log" # 按名称搜索
find . -size +100M # 搜索大于 100MB 的文件
find . -mtime -7 # 搜索 7 天内修改的文件
find . -type f -name "*.tmp" -delete # 搜索并删除
awk / sed — 文本处理
# awk: 按列处理文本
awk '{print $1, $3}' file.txt # 打印第 1 和第 3 列
awk -F: '{print $1}' /etc/passwd # 以冒号为分隔符,打印用户名
awk '$3 > 100 {print $0}' data.txt # 打印第 3 列大于 100 的行
# sed: 流式文本编辑
sed 's/old/new/g' file.txt # 全局替换
sed -i '3d' file.txt # 删除第 3 行(原地修改)
sed -n '10,20p' file.txt # 打印第 10~20 行
管道与重定向
管道 |
管道将前一个命令的标准输出作为后一个命令的标准输入,实现命令串联:
# 统计当前目录下的文件数
ls -l | wc -l
# 查找占用内存最多的前 5 个进程
ps aux | sort -k4 -rn | head -5
# 实时监控日志中的错误
tail -f app.log | grep --line-buffered "ERROR"
重定向
# 标准输出重定向
echo "hello" > file.txt # 覆盖写入
echo "world" >> file.txt # 追加写入
# 标准错误重定向
command 2> error.log # 错误输出到文件
command 2>&1 # 错误合并到标准输出
command > all.log 2>&1 # 所有输出到文件
# /dev/null — 黑洞设备(丢弃输出)
command > /dev/null 2>&1 # 静默执行,丢弃所有输出
文件描述符:
0 ── stdin (标准输入) ← 键盘
1 ── stdout (标准输出) → 终端
2 ── stderr (标准错误) → 终端
进程管理命令
# 查看进程
ps aux # 查看所有进程(BSD 风格)
ps -ef # 查看所有进程(POSIX 风格)
top # 实时监控(CPU、内存使用率)
htop # top 的增强版(更直观)
# 终止进程
kill PID # 发送 SIGTERM(优雅终止)
kill -9 PID # 发送 SIGKILL(强制终止,不可忽略)
killall nginx # 按进程名终止
# 后台执行
command & # 后台运行
nohup command & # 后台运行,退出终端后不中断
jobs # 查看后台任务
fg %1 # 将后台任务 1 切换到前台
网络相关命令
# 网络状况
ifconfig / ip addr # 查看网卡和 IP 地址
ping host # 测试网络连通性
traceroute host # 跟踪路由路径
curl url # 发送 HTTP 请求
wget url # 下载文件
# 端口与连接
netstat -tlnp # 查看监听中的端口
ss -tlnp # netstat 的现代替代
lsof -i :8080 # 查看哪个进程占用了 8080 端口
Shell 脚本基础
脚本结构
#!/bin/bash # Shebang:指定解释器
# 这是注释
# 变量(注意等号两边不能有空格)
name="World"
echo "Hello, $name!"
# 命令行参数
echo "脚本名: $0"
echo "第一个参数: $1"
echo "参数个数: $#"
echo "所有参数: $@"
echo "上一条命令的退出码: $?"
条件判断
# if-else
if [ -f "file.txt" ]; then
echo "文件存在"
elif [ -d "dir" ]; then
echo "是目录"
else
echo "不存在"
fi
# 常用判断条件
# -f 文件存在且为普通文件 -d 目录存在
# -e 文件/目录存在 -z 字符串为空
# -n 字符串非空 -eq 数字相等
# -gt 大于 -lt 小于 -ge 大于等于
循环
# for 循环
for file in *.log; do
echo "处理: $file"
done
# while 循环
count=0
while [ $count -lt 5 ]; do
echo "计数: $count"
count=$((count + 1))
done
# 读取文件逐行处理
while IFS= read -r line; do
echo "$line"
done < input.txt
函数
# 定义函数
greet() {
local name=$1 # local 限定局部变量
echo "Hello, $name!"
return 0 # 返回退出码
}
# 调用函数
greet "Alice" # Hello, Alice!
生产高频题
如何查找某个端口被哪个进程占用?
lsof -i :8080 # 方法一
ss -tlnp | grep 8080 # 方法二
netstat -tlnp | grep 8080 # 方法三
如何实时查看日志文件中的错误?
tail -f /var/log/app.log | grep "ERROR"
> 和 >> 有什么区别?
> 会覆盖文件内容(文件不存在则创建),>> 在文件末尾追加内容。
软链接和硬链接用什么命令创建?
ln source target 创建硬链接,ln -s source target 创建符号链接(软链接)。