Skip to content

Shell 速查表

1. I/O 重定向

符号 含义 示例 说明
> 重定向 stdout,覆盖写 echo hello > out.txt 文件不存在则创建,存在则清空后写入
>> 重定向 stdout,追加写 echo hello >> out.txt 追加到文件末尾
< 重定向 stdin wc -l < file.txt 将文件内容作为输入
1> 重定向 stdout echo hello 1> out.txt 1 就是标准输出,通常可省略
2> 重定向 stderr ls nofile 2> err.txt 错误输出写入文件
2>> 追加 stderr cmd 2>> err.txt 错误输出追加到文件
&> 重定向 stdoutstderr cmd &> all.log Bash 用法,兼容性不如 > file 2>&1
2>&1 stderr 指向 stdout 当前目标 cmd > out.log 2>&1 顺序非常重要
1>&2 stdout 指向 stderr 当前目标 echo "err" 1>&2 常用于输出错误信息
>/dev/null 丢弃标准输出 cmd > /dev/null 黑洞设备
2>/dev/null 丢弃错误输出 cmd 2> /dev/null 忽略报错
>/dev/null 2>&1 丢弃所有输出 cmd >/dev/null 2>&1 静默执行

2. 管道与流程控制

符号 含义 示例 说明
| 管道,将前一个命令的 stdout 传给后一个命令的 stdin ps aux \| grep nginx 默认只传 stdout
| & stdoutstderr 一起传入管道 cmd \|& grep error Bash 中等价于 cmd 2>&1 \| grep error
&& 前一个命令成功才执行后一个 make && make install 依赖退出码 0
| | 前一个命令失败才执行后一个 mkdir data || echo fail 常用于失败兜底
; 顺序执行,不管前一个成功还是失败 cmd1; cmd2 单纯串联
& 后台执行 sleep 60 & 当前 shell 不阻塞
! 取反退出码 if ! grep -q x a.txt; then ... fi 成功变失败,失败变成功

3. 分组与作用域

符号 含义 示例 说明
() 在子 Shell 中执行 (cd /tmp && ls) 内部环境变化不会影响外部
{} 在当前 Shell 中分组执行 { cd /tmp; ls; } 会影响当前 shell 环境
exec 修改当前 Shell 的文件描述符或替换当前进程 exec >app.log 2>&1 后续命令输出也会被重定向

4. 变量、展开与替换

符号 含义 示例 说明
$var 变量展开 echo $HOME 取变量值
${var} 明确变量边界 echo ${name}_test 推荐用于拼接
${var:-default} 变量为空或未定义时使用默认值 echo ${PORT:-8080} 常用于参数兜底
${var:=default} 为空或未定义时赋默认值 : ${PORT:=8080} 会写回变量
${var:+alt} 变量已定义且非空时返回替代值 echo ${DEBUG:+enabled} 条件展开
${#var} 取变量长度 echo ${#name} 字符串长度
$(...) 命令替换 now=$(date +%F) 推荐,支持嵌套
`...` 命令替换(旧写法) now=`date +%F` 不推荐,嵌套难看
$((...)) 算术扩展 echo $((1 + 2 * 3)) 仅整数运算

5. 通配与匹配

符号 含义 示例 说明
* 匹配任意长度字符 ls *.log Shell 通配,不是正则
? 匹配单个字符 ls a?.txt 匹配 1 个字符
[] 匹配字符集合 ls file[123].txt 匹配指定字符之一
[a-z] 匹配范围 ls [a-z]*.txt 也是 shell glob

6. 引号与转义

符号 含义 示例 说明
"..." 双引号,保留空格,允许变量展开 echo "$HOME" 最常用
'...' 单引号,原样保留,不展开变量 echo '$HOME' 内容完全字面量
\ 转义符 echo \$HOME 让特殊字符失去特殊含义
\ + 换行 续行 echo hello \
world
将一行命令拆成多行

7. Here 文本输入

符号 含义 示例 说明
<<EOF Here Document,多行文本输入 cat <<EOF 常用于生成配置文件
<<'EOF' Here Document,禁止变量展开 cat <<'EOF' 保留原始内容
<<< Here String,单字符串输入 grep hi <<< "hi world" echo ... \| cmd 更直接

8. 注释与特殊用途

符号 含义 示例 说明
# 注释 # this is comment 引号内不算注释
: 空命令(no-op) : > file.txt 常用于清空文件、占位
-- 参数结束标记 rm -- -file 防止文件名被当成选项

9. 文件描述符相关

写法 含义 示例 说明
0 stdin 0< input.txt 标准输入
1 stdout 1> out.txt 标准输出
2 stderr 2> err.txt 标准错误
3>&1 将 FD 3 指向当前 stdout exec 3>&1 常用于备份输出
1>&3 stdout 恢复到 FD 3 exec 1>&3 配合备份使用
3>&- 关闭 FD 3 exec 3>&- 释放自定义 FD

10. 常见组合写法

只在成功时继续

cmd1 && cmd2

失败时输出错误

cmd >/dev/null 2>&1 &

后台运行并记录日志

nohup cmd > app.log 2>&1 &

错误也进管道

cmd 2>&1 | grep error

统计文件行数

wc -l < file.txt

生成多行文件

1
2
3
4
cat > app.conf <<EOF
port=8080
host=127.0.0.1
EOF

备份并恢复 stdout/stderr

1
2
3
4
5
6
7
exec 3>&1 4>&2
exec > app.log 2>&1

echo "write to log"

exec 1>&3 2>&4
exec 3>&- 4>&-

11. 易错点速记

2>&1 顺序不能乱

正确:

cmd > out.log 2>&1

错误语义不同:

cmd 2>&1 > out.log

| 默认不传 stderr

cmd1 | cmd2

只传 stdout。

* 是 Shell 展开,不是正则

ls *.log

cmd & 不等于守护进程

python app.py &

只是后台运行,终端关闭后可能退出。

(){} 不同

(cd /tmp)
{ cd /tmp; }

前者不影响当前 shell,后者会影响。

12. 一行口诀

1
2
3
4
5
6
7
> 覆盖,>> 追加,< 输入,
2> 错误,2>&1 合流,
| 管道,& 后台,
&& 成功继续,|| 失败继续,; 无脑继续,
() 子 shell,{} 当前 shell,
$() 命令替换,$(( )) 算术,
" " 可展开,' ' 原样,\ 转义。

极简速查

符号 作用
> 覆盖重定向 stdout
>> 追加重定向 stdout
< 重定向 stdin
2> 重定向 stderr
2>&1 stderr 合并到 stdout
| 管道
| & stdout + stderr 一起进管道
& 后台执行
&& 前一个成功才执行后一个
| | 前一个失败才执行后一个
; 顺序执行,不管成功失败
! 取反退出码
() 子 Shell 执行
{} 当前 Shell 分组
$(...) 命令替换
$((...)) 算术扩展
* 任意字符通配
? 单字符通配
[] 字符集通配
"..." 保留空格,允许变量展开
'...' 原样保留,不展开
\ 转义
<<EOF Here Document
<<< Here String
# 注释