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.txt 或 nano file.txt 编辑文件find /path -name '*.log' 递归查找文件名grep -R "pattern" . 递归搜索内容;grep -n 显示行号which cmd 可执行路径;type -a cmd 显示内置/别名/路径whereis cmd 显示二进制、源码与手册路径locate filename 依赖索引(updatedb)的快速查找cmd1 | cmd2 用管道将 STDOUT 作为 cmd2 的 STDINcmd > out.txt 覆盖输出;cmd >> out.txt 追加输出cmd 2> err.txt 仅重定向 STDERR;cmd < in.txt 从文件读取cmd > file 2>&1 将两路合并到文件(顺序重要)cmd &> file Bash 专属的“同时重定向”语法;跨 shell 推荐 2>&1tee file.txt 同时写文件与标准输出ls > dirlist 2>&1 与 ls 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 脱离当前 shellnohup cmd >out 2>&1 & 忽略挂断信号(会写 nohup.out)set -m)。sudo -l 查看可用权限;su - user 切换用户chmod u+rwx,g+rx,o-r 符号式修改权限;chmod 755 filechown 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]}"; donesh 中不可用。[[ 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 判断( list ) 在子 shell 执行;对父级变量与目录无副作用{ list; } 在当前 shell 执行;末尾需分号与大括号空格lastpipe 可改变最后一个的行为)diff <(cmd1) <(cmd2) 用命令输出虚拟文件进行比较(进程替换)cmd <<EOF ... EOF Here 文档;cmd <<- 'EOF' 可剔除缩进cmd <<< "one line" Here 字符串(Here String)shopt -s globstar 使 ** 递归匹配;shopt -s extglob 启用模式 !(pat)shopt -s nullglob 未匹配的通配符展开为空;dotglob 包含点文件set -euo pipefail 常见组合:错误即退、未定义变量报错、管道传递错误set -e 在某些上下文(if、!、until 等)不生效;建议配合 pipefail 与 trap '...' ERR。"${var}";遍历实参用 "$@" 而非 $*IFS;确需分割时局部设定:IFS=, read -r a bhistory / 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/passwdcurl -sS -fL -o out.bin URL 安静输出、失败即非零、自动跟随rsync -avz --progress src/ dest/ 增量同步并显示进度'单引号':按字面量保留,几乎不进行扩展(' 内不能出现 ')"双引号":保留空白与通配符,但允许 $/\/` 的扩展$'ANSI-C':解析转义序列,如 $'\n\t\x41' → 换行/制表/A$"本地化":按 locale 做字符串翻译(少用)printf 比 echo 更可预期:printf '%s\n' "${s}"alias → function → builtin → 可执行文件(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 导出给子 shellreadonly -f name 只读函数;typeset -f 同 declare -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)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 $x in jpg|png) ... ;; txt) ... ;; *) ... ;; esac;;& 继续测试后续分支;;& 不测试,直接贯穿执行extglob 配合可用 ?(pat) *(pat) +(pat) @(pat) !(pat)。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。/etc/profile → ~/.bash_profile/~/.bash_login/~/.profile~/.bashrc(建议在 ~/.bash_profile 中 source ~/.bashrc)[[ $- == *i* ]] 判断是否交互式;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 $(...) 的分词陷阱bind -P 查看快捷键;bind 'set completion-ignore-case on' 忽略大小写complete -W "start stop restart" svc 给 svc 命令添加静态补全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 -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 . -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://apissh -i key.pem -p 22 -L 8080:127.0.0.1:80 user@host 本地端口转发scp -r -C dir user@host:/path 递归+压缩传输