Bash 命令与 Shell 使用指南

1. 命令组合与控制

1.1 命令组合方式

1
2
3
命令1 ; 命令2    # 无论命令1成功与否,都会执行命令2
命令1 && 命令2 # 只有命令1成功执行(返回0)才会执行命令2
命令1 || 命令2 # 只有命令1执行失败(非0)才会执行命令2

1.2 引用符号

符号 名称 功能说明
' 单引号 内部所有内容视为纯文本,不解释变量和特殊字符
" 双引号 会解释$、`和\等特殊字符,变量会被展开
` 反引号 执行内部命令并将结果替换到当前位置(等同于$(命令)语法)

2. 命令历史

2.1 history 命令

1
2
3
4
history        # 显示命令历史记录
!5 # 执行历史记录中第5条命令
!ls # 执行最近以ls开头的命令
!?config # 执行最近包含config的命令

2.2 历史记录管理

1
2
history -c    # 清除当前shell的历史记录
history -d 10 # 删除第10条历史记录

2.3 相关环境变量

1
2
3
HISTSIZE=1000       # 内存中保存的历史记录数量
HISTFILESIZE=2000 # 历史记录文件保存的最大数量
HISTFILE=~/.bash_history # 历史记录文件路径

3. Shell 类型与快捷键

3.1 常见Shell类型

  • Bourne Shell(sh): 经典Unix shell → 衍生出bash
  • Bash(Bourne-Again Shell): Linux默认shell
  • C Shell(csh): 类C语法 → 衍生出tcsh
  • Korn Shell(ksh): 结合sh和csh优点
  • Z Shell(zsh): 功能强大的现代shell

3.2 常用快捷键

快捷键 功能描述
Tab 命令/文件名自动补全
Ctrl+A 移动到行首
Ctrl+E 移动到行尾
Ctrl+D 删除当前字符(相当于Delete)
Ctrl+H 删除前一个字符(相当于Backspace)
Ctrl+L 清屏(等同于clear命令)
Ctrl+C 终止当前命令
Ctrl+Z 暂停当前命令(可用fg恢复)
Ctrl+S 暂停屏幕输出
Ctrl+Q 恢复屏幕输出

4. 变量与环境设置

4.1 变量操作

1
2
3
export VAR=value    # 设置环境变量(对新shell有效)
unset VAR # 删除变量
PATH=$PATH:/new/path # 追加PATH路径

4.2 set 命令选项

1
2
set -o option      # 启用选项
set +o option # 禁用选项

常用选项:

  • noclobber/-C: 防止重定向覆盖已有文件
  • histexpand/-H: 启用!历史命令扩展

4.3 提示符定制(PS1)

1
PS1='[\u@\h \W]\$ '  # 常见默认提示符格式

可用转义符:

  • \s: shell名称
  • \v: bash版本
  • \u: 用户名
  • \h: 主机名
  • \w: 当前工作目录

4.4 用户切换

1
2
su user       # 切换用户(不改变环境变量)
su - user # 完全切换用户(包括环境)

5.帮助命令 man 详解

基本用法

1
man command      # 查看命令的手册页(返回第一个匹配的帮助文件)

常用选项

选项 功能说明 等价命令
-a 显示所有匹配的手册页(按顺序显示) -
-f 查找完全匹配的命令文档 whatis
-k 查找包含关键词的文档 apropos
-w 显示手册页的存储路径 -

指定手册章节

1
2
man 5 passwd     # 查看/etc/passwd文件的格式说明(第5节)
man 3 printf # 查看C库函数printf的文档(第3节)

手册章节分类

Section 内容类型
1 用户命令
2 系统调用
3 C库函数
4 设备文件
5 配置文件格式
6 游戏
7 杂项
8 系统管理命令
9 Linux内核相关

手册页存储位置

1
2
/usr/share/man         # 系统手册页主目录
/usr/local/share/man # 本地安装软件的手册页

维护whatis数据库

1
2
makewhatis            # 生成/更新whatis数据库(供-f/-k使用)
mandb # 现代系统中更新手册数据库(替代makewhatis)

使用示例

1
2
3
4
man -a printf        # 查看所有章节的printf文档
man -k "copy" # 查找所有包含"copy"关键词的命令
man -f ls # 精确查找ls命令的文档
man -w 5 passwd # 显示passwd配置文件的文档路径

6. 管道与重定向

6.1 标准文件描述符

文件描述符 名称 默认设备
0 标准输入(stdin) 键盘
1 标准输出(stdout) 屏幕
2 标准错误(stderr) 屏幕

6.2 管道(|)

1
命令1 | 命令2    # 将命令1的输出作为命令2的输入

6.3 tee命令

1
2
命令 | tee 文件    # 同时输出到屏幕和文件
命令 | tee -a 文件 # 追加模式(不覆盖原文件)

6.4 重定向操作

语法 功能描述
命令 > 文件 标准输出覆盖写入文件
命令 >> 文件 标准输出追加写入文件
命令 < 文件 从文件读取标准输入
命令 2> 文件 标准错误覆盖写入文件
命令 2>> 文件 标准错误追加写入文件
命令 > 文件 2>&1 标准输出和错误都覆盖写入同一文件
命令 >> 文件 2>&1 标准输出和错误都追加写入同一文件
命令 << 结束标记 从标准输入读取直到遇到"结束标记"(here文档)
命令 &> 文件 标准输出和错误都覆盖写入文件(bash简写)

7. 文件操作命令

7.1 ls命令

1
2
3
4
5
6
7
8
ls -a    # 显示所有文件(包括.开头的隐藏文件)
ls -A # 类似-a但不显示.和..
ls -d # 显示目录本身而非内容
ls -F # 显示文件类型标识(/:目录, *:可执行, @:链接)
ls -i # 显示inode编号
ls -l # 长格式显示详细信息
ls -t # 按修改时间排序
ls -h # 人类可读的文件大小(如1K, 2M)

7.2 cp命令

1
2
3
4
5
6
cp -f    # 强制覆盖不提示
cp -i # 覆盖前提示确认
cp -p # 保留原文件属性
cp -r/R # 递归复制目录
cp -d # 保留链接文件
cp -a # 归档模式(相当于-dpR)

7.3 mv命令

1
2
mv -f    # 强制覆盖不提示
mv -i # 覆盖前提示确认

7.4 mkdir命令

1
2
mkdir -m 755 dir   # 创建指定权限的目录
mkdir -p dir1/dir2 # 创建多级目录

7.5 rm命令

1
2
3
rm -f    # 强制删除不提示
rm -i # 删除前提示确认
rm -r/R # 递归删除目录

7.6 rmdir命令

1
rmdir -p dir1/dir2 # 删除多级空目录

7.7 touch命令

1
2
3
touch -t 202405071530.00 file  # 设置特定时间戳(YYMMDDhhmm.ss)
touch -a file # 仅更新访问时间
touch -m file # 仅更新修改时间

7.8 file命令

1
file document.txt   # 检测文件类型和编码

8. 元字符(通配符)

元字符 功能描述 示例
* 匹配任意长度字符(包括空字符) ls *.txt
? 匹配任意单个字符 ls file?.txt
[] 匹配括号内任意一个字符 ls file[123].txt
[!] 匹配不在括号内的任意一个字符 ls file[!a-z].txt
{} 展开括号内逗号分隔的多个模式 touch file{1,2,3}

示例扩展:

  • [a-z]: 任意小写字母
  • [0-9]: 任意数字
  • [a-zA-Z]: 任意字母
  • file{1..3}: 展开为file1, file2, file3

9. 文档处理命令

9.1 文件内容查看

cat 命令

1
cat -n file.txt  # 显示文件内容并添加行号

nl 命令(行号显示)

1
2
3
nl -b a file.txt    # 所有行添加行号
nl -b t file.txt # 非空行添加行号
nl -h a -f a file.txt # 为页眉和页脚也添加行号

od 命令(二进制查看)

1
2
3
od -t c file.bin    # 以ASCII字符显示
od -t o file.bin # 以八进制显示
od -t x file.bin # 以十六进制显示

9.2 文件头部/尾部查看

head 命令

1
2
3
head -n 10 file.txt    # 显示前10行
head -10 file.txt # 同上
head -c 100 file.txt # 显示前100字节

tail 命令

1
2
3
4
tail -n 10 file.txt    # 显示最后10行
tail -10 file.txt # 同上
tail -c 100 file.txt # 显示最后100字节
tail -f log.txt # 实时监控日志文件

9.3 文本提取与转换

cut 命令

1
2
cut -c 1-5 file.txt      # 提取每行第1-5个字符
cut -d: -f1 /etc/passwd # 以冒号分隔,提取第一个字段

join 命令(合并文件)

1
join -j 1 file1.txt file2.txt  # 按第一个字段合并两个文件

paste 命令

1
paste -d";" file1.txt file2.txt  # 用分号分隔合并文件

tr 命令(字符转换)

1
2
3
4
tr 'a-z' 'A-Z' < file.txt    # 小写转大写
tr -d '\r' < file.txt # 删除回车符
tr -s ' ' < file.txt # 压缩连续空格
tr -d '[:digit:]' < file.txt # 删除所有数字

9.4 文本排序与统计

sort 命令

1
2
3
4
sort file.txt          # 按字母顺序排序
sort -n file.txt # 按数值排序
sort -r file.txt # 反向排序
sort -t: -k3n /etc/passwd # 按冒号分隔的第3列数值排序

uniq 命令(去重)

1
2
3
sort file.txt | uniq    # 去重(需先排序)
uniq -d file.txt # 只显示重复行
uniq -u file.txt # 只显示唯一行

wc 命令(统计)

1
2
3
wc -l file.txt    # 统计行数
wc -w file.txt # 统计单词数
wc -c file.txt # 统计字节数

9.5 文本分割与格式化

split 命令

1
split -l 1000 bigfile.txt part_  # 每1000行分割文件

pr 命令(分页)

1
pr -l 40 file.txt    # 按每页40行分页显示

fmt 命令(格式化)

1
fmt -w 80 file.txt   # 设置每行80个字符

expand/unexpand 命令

1
2
expand -t 4 file.txt    # 将tab转为4个空格
unexpand -t 4 file.txt # 将4个空格转为tab

8.6 高级文本处理

xargs 命令

1
2
find . -name "*.log" | xargs rm    # 删除所有log文件
find . -type f | xargs grep "text" # 在所有文件中搜索文本

10. vi/vim 编辑器

10.1 基本操作

启动与退出

1
2
3
4
5
vi file.txt        # 编辑文件
vi -R file.txt # 只读模式
:q # 退出
:q! # 强制退出
:wq 或 ZZ # 保存退出

模式切换

命令 说明
i 在光标前插入
a 在光标后插入
I 在行首插入
A 在行尾插入
o 在下一行插入
O 在上一行插入
ESC 返回命令模式

10.2 光标移动

命令 说明
h/j/k/l 左/下/上/右
0 行首
$ 行尾
gg 文件开头
G 文件末尾
50G 跳转到第50行
Ctrl+b 上一页
Ctrl+f 下一页

10.3 编辑命令

命令 说明
x 删除当前字符
X 删除前一个字符
dd 删除当前行
dw 删除下一个单词
yy 复制当前行
p 粘贴到光标后
P 粘贴到光标前
u 撤销
Ctrl+r 重做

10.4 搜索与替换

命令 说明
/pattern 向前搜索
?pattern 向后搜索
n 下一个匹配项
N 上一个匹配项
:%s/old/new/g 全局替换
:1,10s/old/new/g 替换1-10行的内容

10.5 设置选项

1
2
3
4
:set nu        # 显示行号
:set nonu # 隐藏行号
:set ts=4 # 设置tab4个空格
:set list # 显示不可见字符

11. 正则表达式与文本搜索

11.1 基本元字符

元字符 说明
. 匹配任意单个字符
* 前一个字符0次或多次
[] 匹配括号内任意一个字符
[^] 不匹配括号内的字符
^ 行首
$ 行尾
\ 转义特殊字符

11.2 grep 命令

1
2
3
4
5
6
grep "pattern" file.txt      # 基本搜索
grep -i "pattern" file.txt # 忽略大小写
grep -v "pattern" file.txt # 反向匹配
grep -n "pattern" file.txt # 显示行号
grep -E "regex" file.txt # 使用扩展正则
grep -r "pattern" /dir # 递归搜索目录

特殊变体

1
2
3
egrep = grep -E       # 扩展正则表达式
fgrep = grep -F # 不解析正则,快速搜索
pgrep -u root # 搜索root用户的进程

11.3 sed 流编辑器

基本用法

1
2
3
4
sed 's/old/new/' file.txt       # 替换第一个匹配
sed 's/old/new/g' file.txt # 替换所有匹配
sed '1,5d' file.txt # 删除1-5行
sed '/pattern/d' file.txt # 删除匹配行

高级用法

1
2
3
4
sed -n '10,20p' file.txt       # 只打印10-20行
sed 'y/abc/ABC/' file.txt # 字符转换
sed -i.bak 's/old/new/' file # 直接修改文件并备份
sed -e 'cmd1' -e 'cmd2' file # 执行多个命令

脚本示例

1
2
3
4
5
# 将1-5行行首添加>字符
sed '1,5s/^/>/' file.txt

# 将每行的第一个数字替换为#
sed 's/[0-9]/#/' file.txt

11.4 正则表达式示例

  1. 匹配IP地址:
1
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt
  1. 匹配邮箱地址:
1
grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' file.txt
  1. 提取HTML标签内容:
1
sed -n 's/<title>\(.*\)<\/title>/\1/p' file.html