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 |
错误输出追加到文件 |
&> |
重定向 stdout 和 stderr |
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 |
| & |
将 stdout 和 stderr 一起传入管道 |
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. 常见组合写法
只在成功时继续
失败时输出错误
后台运行并记录日志
错误也进管道
统计文件行数
生成多行文件
备份并恢复 stdout/stderr
11. 易错点速记
2>&1 顺序不能乱
正确:
错误语义不同:
| 默认不传 stderr
只传 stdout。
* 是 Shell 展开,不是正则
cmd & 不等于守护进程
只是后台运行,终端关闭后可能退出。
() 和 {} 不同
前者不影响当前 shell,后者会影响。
12. 一行口诀
极简速查
| 符号 | 作用 |
|---|---|
> |
覆盖重定向 stdout |
>> |
追加重定向 stdout |
< |
重定向 stdin |
2> |
重定向 stderr |
2>&1 |
stderr 合并到 stdout |
| |
管道 |
| & |
stdout + stderr 一起进管道 |
& |
后台执行 |
&& |
前一个成功才执行后一个 |
| | |
前一个失败才执行后一个 |
; |
顺序执行,不管成功失败 |
! |
取反退出码 |
() |
子 Shell 执行 |
{} |
当前 Shell 分组 |
$(...) |
命令替换 |
$((...)) |
算术扩展 |
* |
任意字符通配 |
? |
单字符通配 |
[] |
字符集通配 |
"..." |
保留空格,允许变量展开 |
'...' |
原样保留,不展开 |
\ |
转义 |
<<EOF |
Here Document |
<<< |
Here String |
# |
注释 |