shell 速查表
版本unknown 更新日志2025-11-17 GitHubbminor/bash
340px

文件与目录操作

  • ls -alh 列出所有文件(含隐藏),人类可读大小
  • cd /path/to/dir 切换当前目录;pwd 显示当前路径
  • mkdir -p /path/to/dir 递归创建目录
  • rm -rf /path 递归强制删除(危险)
  • cp -r src/ dest/ 复制目录;mv a b 重命名/移动
  • touch file.txt 创建空文件或更新时间戳

文件查看与编辑

  • cat file.txt 输出文件内容;less file.txt 分页查看
  • head -n 20 file.txt 前 20 行;tail -f /var/log/syslog 实时追踪
  • vi file.txtnano file.txt 编辑文件

查找与定位

  • find /path -name '*.log' 递归查找文件名
  • grep -R "pattern" . 递归搜索内容;grep -n 显示行号
  • which cmd 可执行路径;type -a cmd 显示内置/别名/路径
  • whereis cmd 显示二进制、源码与手册路径
  • locate filename 依赖索引(updatedb)的快速查找

管道与重定向

  • cmd1 | cmd2 用管道将 STDOUT 作为 cmd2STDIN
  • cmd > out.txt 覆盖输出;cmd >> out.txt 追加输出
  • cmd 2> err.txt 仅重定向 STDERRcmd < in.txt 从文件读取
  • cmd > file 2>&1 将两路合并到文件(顺序重要)
  • cmd &> file Bash 专属的“同时重定向”语法;跨 shell 推荐 2>&1
  • tee file.txt 同时写文件与标准输出
  • 示例:ls > dirlist 2>&1ls 2>&1 > dirlist 结果不同(重定向自左向右生效)。

文本处理

  • grep 'pat' file 模式搜索;grep -E 扩展正则
  • sed 's/old/new/g' file 行内替换;-n '1,10p' 选段
  • awk '{print $2}' file 字段处理;-F ':' 设分隔符
  • cut -d':' -f1-3 /etc/passwd 提取指定字段
  • sort file | uniq -c 去重计数(uniq 仅对相邻行去重)
  • tr '[:upper:]' '[:lower:]' 大小写转换

进程管理

  • ps aux 查看进程;top / htop 互动监控
  • kill -SIGTERM PID 友好结束;kill -9 PID 强制结束
  • pgrep -a NAME 按名查进程;pkill NAME 杀进程

作业控制

  • cmd & 后台运行;jobs 列出现有作业
  • Ctrl+Z 挂起到后台(停止态);bg %1 后台恢复
  • fg %1 回到前台;disown %1 脱离当前 shell
  • nohup cmd >out 2>&1 & 忽略挂断信号(会写 nohup.out
  • 需启用作业控制(交互式默认启用;非交互 set -m)。

用户与权限

  • sudo -l 查看可用权限;su - user 切换用户
  • chmod u+rwx,g+rx,o-r 符号式修改权限;chmod 755 file
  • chown user:group file 变更所有者与组
  • id user / groups user 查询用户与组

网络操作

  • ping host 连通性;curl -I https://example.com 查看响应头
  • wget https://example.com/file 下载文件;ssh user@host 登录
  • scp file user@host:/path 复制到远程;rsync -avz 增量同步
  • ss -tuln 监听端口(推荐);netstat -tuln 旧工具
  • ip addr show 接口与地址;ip route 路由

环境变量与配置

  • export VAR=value 设置;printenv VAR 查看;unset VAR 删除
  • env 列出所有环境变量
  • source ~/.bashrc 重新加载配置;. script.sh 等价
  • alias ll='ls -alh' 定义别名;unalias ll 取消
  • umask 查看/设置新建文件默认权限掩码

提示符与脚本健壮性

  • PS1="\u@\h \w$ " 自定义提示符
  • set -e 出错即退;set -u 未定义变量报错
  • set -o pipefail 管道任一失败即返回非零
  • trap 'cleanup' EXIT 退出时清理;trap 'handler' ERR 统一错误处理

调试与跟踪

  • bash -x script.sh 跟踪执行;-v 打印脚本
  • bash -n script.sh 仅做语法检查
  • export PS4='+ $LINENO: ' 调试提示前缀(显示行号)

压缩与归档

  • tar -cvf archive.tar 路径 创建 tar;tar -xvf archive.tar 解包
  • tar -czvf archive.tar.gz 路径 gzip 压缩;tar -xzf 解压
  • tar -xjvf archive.tar.bz2 解压 bzip2 包
  • gzip file.txt 压缩;gunzip file.txt.gz 解压
  • zip -r archive.zip 目录 递归打包;unzip archive.zip 解压

参数与变量展开

  • ${var} 基本引用;${#var} 变量值长度
  • ${var:-def} 未设置或为空时返回默认;${var:=def} 同时赋值
  • ${var:?msg} 为空时报错退出;${var:+alt} 已设置时返回替代
  • ${var%pat}/${var%%pat} 从后删除最短/最长匹配
  • ${var#pat}/${var##pat} 从前删除最短/最长匹配
  • ${var/pat/repl} 首次替换;${var//pat/repl} 全部替换
  • ${var:off}/${var:off:len} 子串;${array[@]} 数组展开
  • 建议始终加引号:"${var}",避免分词与通配符扩展。

数组与关联数组

  • declare -a arr=(a b c) 普通数组;arr[0]=x 赋值
  • echo "${arr[1]}" 下标访问;"${arr[@]}" 遍历元素
  • ${#arr[@]} 元素个数;${!arr[@]} 索引列表
  • declare -A map=([k1]=v1 [k2]=v2) 关联数组(字典)
  • for k in "${!map[@]}"; do echo "$k=${map[$k]}"; done
  • 关联数组为 Bash 特性;在 sh 中不可用。

条件表达式与测试

  • [[ A == B ]] 字符串比较;[[ A =~ re ]] 正则匹配
  • [[ -z s ]] 空串;[[ -n s ]] 非空;[[ -v var ]] 已设置
  • [[ -e p ]] 存在;-f 普通文件;-d 目录;-s 非空
  • [[ -r/-w/-x p ]] 读/写/可执行;[[ p1 -nt p2 ]] 新于
  • (( i > j )) 整数比较;if ((n%2==0)); then ...; fi
  • [[ ... ]] 为 Bash/现代 shell 语法,避免旧式 [ ... ] 的转义陷阱。

算术与赋值

  • $(( expr )) 算术展开;(( i++ ))/(( ++i )) 自增
  • let i+=2 等价算术赋值;echo $((a&b)) 位运算
  • (( expr )) 的退出码可用于 if / while 判断

分组与子 shell

  • ( list ) 在子 shell 执行;对父级变量与目录无副作用
  • { list; } 在当前 shell 执行;末尾需分号与大括号空格
  • 管道中的每个命令通常在子 shell 中执行(lastpipe 可改变最后一个的行为)

进程替换与 Here 文本

  • diff <(cmd1) <(cmd2) 用命令输出虚拟文件进行比较(进程替换)
  • cmd <<EOF ... EOF Here 文档;cmd <<- 'EOF' 可剔除缩进
  • cmd <<< "one line" Here 字符串(Here String)

shopt 与 set 选项

  • shopt -s globstar 使 ** 递归匹配;shopt -s extglob 启用模式 !(pat)
  • shopt -s nullglob 未匹配的通配符展开为空;dotglob 包含点文件
  • set -euo pipefail 常见组合:错误即退、未定义变量报错、管道传递错误
  • set -e 在某些上下文(if!until 等)不生效;建议配合 pipefailtrap '...' ERR

引号、IFS 与分词

  • 始终给变量加引号:"${var}";遍历实参用 "$@" 而非 $*
  • 避免修改 IFS;确需分割时局部设定:IFS=, read -r a b
  • 避免无引号的通配符膨胀导致误删/误改

历史与交互

  • history / fc -l 查看;!! 上一条;!$:p 打印上一条最后一参
  • !!:s/old/new/ 快速替换;^old^new 上条命令内替换
  • HISTCONTROL=ignoredups:erasedups 去重;HISTSIZE/HISTFILESIZE 控制大小
  • bind -P 查看快捷键;set -o vi/set -o emacs 选择编辑模式

常用命令模式

  • find . -type f -name '*.log' -print0 | xargs -0 rm -f 空格安全地批量删除
  • find . -type f -mtime -1 -exec grep -Hn "ERR" {} + 查新增错误
  • grep -RIn --exclude-dir .git pattern . 递归搜索(显示行号)
  • sed -i.bak 's/old/new/g' file 就地替换并备份;awk -F: '{print $1,$3}' /etc/passwd
  • curl -sS -fL -o out.bin URL 安静输出、失败即非零、自动跟随
  • rsync -avz --progress src/ dest/ 增量同步并显示进度

引用与转义

  • '单引号':按字面量保留,几乎不进行扩展(' 内不能出现 '
  • "双引号":保留空白与通配符,但允许 $/\/` 的扩展
  • $'ANSI-C':解析转义序列,如 $'\n\t\x41' → 换行/制表/A
  • $"本地化":按 locale 做字符串翻译(少用)
  • printfecho 更可预期:printf '%s\n' "${s}"

命令搜索与覆盖

  • 优先级:aliasfunctionbuiltin → 可执行文件(PATH)
  • type -a cmd 查看解析链;command -v cmd 仅路径/内建名
  • command cmd 跳过别名/函数;builtin cd 强制调用内建
  • enable -n echo 暂禁内建;enable echo 重新启用
  • hash 查看/缓存命令路径;hash -r 清空缓存

别名与函数

  • alias ll='ls -alF' 定义;unalias ll 移除;alias 列出
  • name() { local x=1; echo $x; return 0; } 函数与局部变量
  • declare -f 列出函数;export -f name 导出给子 shell
  • readonly -f name 只读函数;typeset -fdeclare -f
  • 函数返回码在 $?;若需返回字符串请用 echo 或设置全局变量。

文件描述符与重定向

  • exec >out.log 2>err.log 为后续命令持久重定向
  • exec 3>&1 4>&2; cmd 1>&2 2>&3; exec 3>&- 4>&- 交换/恢复输出
  • exec <>file 读写同一文件;n>&- 关闭描述符
  • 日志分流常用模式:cmd 1> >(tee out.log) 2> >(tee err.log >&2)

getopts 参数解析

  • while getopts ":f:o:h" opt; do case $opt in f) F=$OPTARG;; o) O=$OPTARG;; h) usage; exit;; \?) echo "无效选项: -$OPTARG";; :) echo "缺少值: -$OPTARG";; esac; done; shift $((OPTIND-1))
  • 使用 getopts 而非外部 getopt,以获得更好移植性。

case 模式与扩展

  • case $x in jpg|png) ... ;; txt) ... ;; *) ... ;; esac
  • ;;& 继续测试后续分支;;& 不测试,直接贯穿执行
  • extglob 配合可用 ?(pat) *(pat) +(pat) @(pat) !(pat)

通配与 glob 选项

  • shopt -s extglob globstar 启用扩展与递归 ** 匹配
  • shopt -s nullglob 未匹配展开为空;failglob 未匹配即报错
  • shopt -s nocaseglob 大小写不敏感;dotglob 包含点文件

正则匹配([[ =~ ]])

  • if [[ $s =~ ^([0-9]+)x([0-9]+)$ ]]; then echo "${BASH_REMATCH[1]}x${BASH_REMATCH[2]}"; fi
  • [[ ]] 中使用正则时,右侧正则不要加引号;捕获组在 BASH_REMATCH

启动文件与交互

  • 登录 shell:读取 /etc/profile~/.bash_profile/~/.bash_login/~/.profile
  • 非登录交互 shell:读取 ~/.bashrc(建议在 ~/.bash_profilesource ~/.bashrc
  • [[ $- == *i* ]] 判断是否交互式;PS1 通常仅在交互式设置

提示符 PS1 与颜色

  • PS1='\u@\h:\w\$ ' 常用转义:\u 用户、\h 主机、\w 路径、\j 作业数
  • 彩色需用 \[...\] 包裹不可打印序列:PS1='\[\e[32m\]\u@\h\[\e[0m\]:\w$ '
  • PROMPT_COMMAND 每次显示提示符前执行的命令

目录栈

  • pushd /path 入栈并切换目录;popd 出栈;dirs -v 列出
  • 快速在两个目录间切换:cd -

临时文件与安全

  • tmp=$(mktemp -d) 创建临时目录;trap 'rm -rf -- "$tmp"' EXIT 退出清理
  • set -C/set -o noclobber 禁止覆盖重定向;用 >| 显式覆盖
  • read -r 禁止反斜杠转义;避免 for w in $(...) 的分词陷阱

补全与 Readline

  • bind -P 查看快捷键;bind 'set completion-ignore-case on' 忽略大小写
  • complete -W "start stop restart" svcsvc 命令添加静态补全
  • compgen -W "a b c" -- st 生成候选项(与 complete 配合)

时间统计与跟踪

  • time cmd 使用 shell 关键字版本;TIMEFORMAT='%R sec' 自定义格式
  • set -x; PS4='+ ${BASH_SOURCE##*/}:${LINENO}:${FUNCNAME[0]}: ' bash -c 'script' 带上下文的调试输出

grep/sed/awk 进阶

  • grep -RIn --include='*.{js,ts}' pattern src/ 递归多后缀
  • sed -E -i.bak 's/(foo)(bar)/\1-\2/g' file ERE 与就地备份(BSD 兼容)
  • awk -F, 'BEGIN{OFS=","} NR>1{sum+=$3} END{print sum}' file.csv 统计示例

find/xargs 进阶

  • find . -type f -name '*.log' -print0 | xargs -0 -P 8 -n 16 rm -f 并发删除
  • find . -path './node_modules' -prune -o -name '*.js' -print 排除目录
  • find . -type f -mtime -7 -exec grep -Hn "ERROR" {} + 高效批处理

归档与同步进阶

  • tar -czvf backup.tgz --exclude='.git' -C project . 排除/切换目录
  • rsync -avz --delete --checksum src/ dest/ 校验同步(删除多余)

网络命令常用参数

  • curl -fsSL -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"a":1}' https://api
  • ssh -i key.pem -p 22 -L 8080:127.0.0.1:80 user@host 本地端口转发
  • scp -r -C dir user@host:/path 递归+压缩传输