Shell 知识速查表
- 一、引号与空格
- 二、符号与括号
- 三、重定向操作符
- 四、特殊变量速查
- 五、变量展开(Parameter Expansion)
- 六、sed / grep 正则表达式元字符
- 七、POSIX 字符组
- 八、输出命令:echo 与 printf
- echo 常用
- printf 常用
- 九、Linux 常用进程信号对照表
- 十、 /bin/sh 和 /bin/bash区别
一、引号与空格
| 引号 | 名字 | 作用 | 示例 |
|---|---|---|---|
'...' | 单引号 | 里面全部字面量,任何字符都不特殊(包括$、`、\) | echo '$PATH'输出$PATH |
"..." | 双引号 | 里面大部分字面量,但$、`、\、!(历史展开)仍特殊 | echo "$PATH"输出/usr/local/sbin:/usr/local/bin:... |
`...` | 反引号 | 命令替换(旧写法,建议用$(...)代替) | $( ls )子 shell 执行ls命令 |
$var不加引号,变量值里的空格、Tab、换行会被当成参数分隔符,* ? [ 还会被当成通配符展开- [[ ]] 里 =~ 右边的正则 不能加引号,加了正则就废了。
- [[ ]] 里 == 右边想用通配符 不能加引号。
- (( )) 里是整数运算,不加引号
- ANSI-C 引号,它支持转义序列
IFS=$'\n'
必须加空格的地方
| 场景 | 错误写法 ❌ | 正确写法 ✅ |
|---|---|---|
| 选项和参数 | ls-ld/home | ls -ld /home |
[[ ]]关键字 | [["$a" == "$b"]] | [[ "$a" == "$b" ]] |
| test 条件判断 | [$value1 -gt 5] | [ $value1 -gt 5 ] |
| 比较操作符 | [[ "$a"=="$b" ]] | [[ "$a" == "$b" ]] |
| 逻辑运算符 | [[ -f file ]]&&echo | [[ -f file ]] && echo |
| 数组元素 | arr=(1,2,3) | arr=(1 2 3)或arr=({1,2,3}) |
| 函数定义 | func(){ echo; } | func() { echo; } |
绝对不能加空格的地方
| 场景 | 错误写法 ❌ | 正确写法 ✅ |
|---|---|---|
| 变量赋值 | var = "hello" | var="hello" |
| 文件描述符重定向 | 2 > &1 | 2>&1 |
| 关闭文件描述符 | 2 > &- | 2>&- |
空格灵活的场合
| 场景 | 可以这样 | 也可以这样 |
|---|---|---|
| 重定向到文件 | ls>file | ls > file(推荐) |
| 数组赋值 | arr=( 1 2 3 ) | arr=(1 2 3)(推荐) |
| 算术运算 | ((a=5+3)) | (( a = 5 + 3 ))(推荐) |
| 管道 | cat file|grep | cat file | grep(推荐) |
二、符号与括号
| 符号 | 名称 / 说明 | 示例 |
|---|---|---|
() | 进程列表,生成子 Shell 执行命令 | (pwd ; (echo $BASH_SUBSHELL)) |
$() | 命令替换,将命令输出赋给变量 | var01=$(date "+%F %T.%3N") |
{} | 命令分组,coproc、函数定义用到 | { ls; sleep 10; } |
(()) | 整数算术表达式,支持算术和逻辑 | if (( a < b && b < 30 )); ... |
$(( )) | 整数算术并返回结果 | var02=$(( -7 / 2 )) |
[] | 旧式 test 条件判断 | [ $value1 -gt 5 ]、[ -n var03 ]、[ -f $file_name ] |
[[]] | Bash 增强条件判断,支持模式匹配和正则 | [[ $file == *.txt ]]、[[ ! $username =~ ^[a-zA-Z0-9]+$ ]]、[[ -f $file ]] |
$[] | ⚠️ 旧式整数运算,已过时(deprecated),建议统一用$(( )) | var04=$(( var0 + 1 )) |
一句话记忆:数字用
(( )),字符串用[[]],兼容老脚本才用[]。
三、重定向操作符
| 符号 | 名称 | 作用 |
|---|---|---|
> | 覆盖重定向 | 将 stdout 写入文件,覆盖原有内容 |
>> | 追加重定向 | 将 stdout 追加到文件末尾 |
< | 输入重定向 | 将文件内容作为命令的 stdin |
<< | Here-Document | 多行文本作为 stdin(sh/bash 通用) |
<<< | Here-String | 单行字符串作为 stdin(Bash 独有) |
常用重定向写法
| 写法 | 说明 |
|---|---|
cmd > file | stdout 写入 file,stderr 输出到屏幕 |
cmd 2> file | stderr 写入 file,stdout 输出到屏幕 |
cmd > file 2>&1 | stdout + stderr 都写入 file(通用写法) |
cmd > /dev/null 2>&1 | stdout + stderr 都写入 /dev/null(全部丢弃) |
cmd &> file | stdout + stderr 都写入 file(Bash 简写) |
cmd 2>&1 > file | ❌ 顺序错误,stderr 仍输出到屏幕 |
cmd >&1 | 输出送到标准输出 fd1 |
cmd < file | file 作为命令输入(fd0) |
shell 脚步自定义重定向
# 注意3与>不能有空格# exec 3>>test13outexec3>testout# 这句话输出到文件testoutecho"this should be stored in the file">&3重定向文件描述符
# 文件描述符fd 3重定向到标准输出STDOUT(fd 1)exec3>&1# 将标准输出STDOUT(fd 1)重定向到文件testout1exec1>testout1echo"This should store in the output file"echo"along with this line."# STDOUT(fd 1)又指向了它原来的位置(显示器)exec1>&3创建输入文件描述符
# 文件描述符6用来保存STDINexec6<&0# 脚本将STDIN重定向到文件testfileexec0<testfilecount=1whilereadlinedoecho"Line #$count:$line"count=$[$count+1]done# 将STDIN重定向到文件描述符6,从而将STDIN恢复到原先的位置exec0<&6四、特殊变量速查
| 变量 | 说明 |
|---|---|
$0 | 脚本名称;若 source 加载,则为当前 Shell 名称 |
$1…$9 | 第 1 到第 9 个位置参数 |
${10}${11} | 第 10 个及以上位置参数,必须加大括号 |
$# | 位置参数总个数(不含$0) |
$* | 所有参数合并为一个字符串(受IFS影响) |
$@ | 所有参数保持独立(推荐用于循环遍历) |
$- | 当前 Shell 的选项标志(如hB、xu、himBHs) |
$? | 上一条命令的退出状态码(0成功,非0失败) |
$$ | 当前 Shell 的 PID,常用于临时文件(如tmp.$$) |
$! | 最后一个后台进程的 PID(配合&使用) |
$_ | 上一条命令的最后一个参数 |
五、变量展开(Parameter Expansion)
| 写法 | 作用 | 是否修改变量 |
|---|---|---|
${var:-default} | 变量为空/未定义 → 返回 default;否则返回变量本身 | ❌ 不修改 |
${var:=default} | 变量为空/未定义 → 赋值为 default 并返回 | ✅ 会修改 |
${var:+alt} | 变量非空 → 返回 alt;为空 → 返回空 | ❌ 不修改 |
${var:?error_msg} | 变量为空/未定义 → 打印错误并退出脚本 | ❌ 不修改 |
六、sed / grep 正则表达式元字符
在Linux中,有两种流行的正则表达式引擎:
- POSIX基础正则表达式(basic regular expression,BRE)引擎
- POSIX扩展正则表达式(extended regular expression,ERE)引擎
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.c→abc、a1c、a c |
* | 匹配前一个字符 0 次或多次 | ab*c→ac、abc、abbc |
^ | 匹配行首 | ^root→ 以 root 开头的行 |
$ | 匹配行尾 | bash$→ 以 bash 结尾的行 |
[] | 匹配方括号中任意一个字符 | [0-9]→ 包含数字的行 |
[^] | 匹配不在方括号中的字符(取反) | [^0-9]→ 匹配包含非数字字符的行(即不全是数字的行) |
\ | 转义特殊字符 | \$5→ 匹配$5 |
\? | 匹配前一个字符 0 次或 1 次 | colou\?r→color或colour |
\+ | 匹配前一个字符 1 次或多次 | [0-9]\+→ 匹配数字串 |
\{} | 匹配前一个字符指定次数 | a\{2,4\}→aa、aaa、aaaa |
| | 或(匹配多个模式之一) | error|fatal→ 匹配 error 或 fatal |
\(\) | 分组 | \(error|fatal\) |
- 通配符(glob):给shell 文件名匹配用的,只有
*?[]。 - 正则(regex):给文本内容匹配用的,符号多、能力强。
用途不同
| 通配符 glob | 正则 regex | |
|---|---|---|
| 匹配对象 | 文件名 / 字符串整体 | 文本中的一段内容 |
| 谁在用 | shell、ls、find -name、case | grep、sed、awk、[[ =~ ]] |
| 典型场景 | ls *.txt | grep '^a.*z$' file |
符号对照表
| 目的 | 通配符 | 正则 |
|---|---|---|
| 任意多个字符 | * | .* |
| 任意一个字符 | ? | . |
| 字符集合 | [abc] | [abc] |
| 不在集合 | [!abc] | [^abc] |
| 转义 | \* | \. |
- glob 有转义,用
\或引号,让*?[]变字面量。 - 转义是谁解释,就按谁的规则:shell 层是 glob,
find -name是 glob,grep/=~是正则。
七、POSIX 字符组
| POSIX 字符组 | 含义 | 等价 ASCII |
|---|---|---|
[[:alnum:]] | 字母 + 数字 | [a-zA-Z0-9] |
[[:alpha:]] | 大小写字母 | [a-zA-Z] |
[[:digit:]] | 数字 0–9 | [0-9] |
[[:lower:]] | 小写字母 | [a-z] |
[[:upper:]] | 大写字母 | [A-Z] |
[[:blank:]] | 空格、制表符(不含换行) | [ \t] |
[[:space:]] | 所有空白字符:空格、tab、换行、回车、垂直制表、换页 | [ \t\n\r\v\f] |
[[:punct:]] | 标点符号 | `!"#$%&'()*+,-./:;<=>?@[]^_{}|`` |
[[:graph:]] | 可见图形字符(不含空格) | alnum + punct |
[[:print:]] | 可打印字符(含空格) | graph + 空格 |
[[:cntrl:]] | 控制字符(不可打印) | ASCII 0–31、127 DEL |
[[:xdigit:]] | 十六进制字符 | [0-9a-fA-F] |
八、输出命令:echo 与 printf
echo 常用
| 用法 | 说明 |
|---|---|
echo "Hello World" | 基本输出 |
echo 'Hello $USER' | 单引号不展开变量 |
echo "Hello $name" | 双引号展开变量 |
echo -e "Line1\nLine2" | 启用转义字符(换行) |
echo -n "No newline" | 不换行输出 |
printf 常用
| 示例 | 说明 |
|---|---|
printf "%s\n" "Hello" | 输出字符串并换行 |
printf "%d\n" 42 | 输出整数 |
printf "%.2f\n" 3.1415 | 输出浮点数,保留 2 位小数 |
printf "%-10s" "text" | 左对齐,宽度 10 |
printf "%10s" "text" | 右对齐,宽度 10 |
printf "%05d" 7 | 输出00007(补零) |
printf "%-15s %5d\n" "Name" 123 | 表格对齐 |
九、Linux 常用进程信号对照表
| 操作 | 信号名 | 信号编号 | 发送对象 | 默认行为 | 能否捕获/拦截 | 补充说明 |
|---|---|---|---|---|---|---|
| Ctrl + C | SIGINT | 2 | 前台进程组 | 终止进程 | 能 | 中断信号,程序可自定义回调逻辑,优雅退出 |
| Ctrl + Z | SIGTSTP | 20 | 前台进程组 | 暂停进程(挂起) | 能 | 进程后台挂起,可通过 fg/bg 恢复运行 |
| kill pid(默认) | SIGTERM | 15 | 指定单个进程 | 优雅终止进程 | 能 | 系统推荐终止方式,允许程序收尾、释放资源 |
| kill -9 pid | SIGKILL | 9 | 指定单个进程 | 强制立即终止 | 不能 | 最高权限强制杀死,无法拦截、无法收尾,慎用 |
| 关闭终端/SSH断开 | SIGHUP | 1 | 当前会话所有进程 | 终止会话进程 | 能 | 常用于重载配置(nginx -s reload 依赖此信号) |
Ctrl + D 不是发送信号!是触发 TTY 终端的 EOF(End Of File,输入流结束),
cat/read等待键盘输入时结束输入,空提示符下按就是退出 shell
十、 /bin/sh 和 /bin/bash区别
| 特性 | bash 独有(不能在 /bin/sh 下跑) | POSIX sh(/bin/sh 可用) |
|---|---|---|
| 条件判断 | [[ "$var" == "abc" ]] | [ "$var" = "abc" ] |
| 数组 | arr=(1 2 3) | ❌不支持 |
| 算术 | ((i++)) | i=$((i+1)) |
| 字符串替换 | ${str//old/new} | 需要 sed/tr |
| here-string | <<< "hello" | ❌不支持 |