【Shell 知识速查表】

Shell 知识速查表

    • 一、符号与括号
    • 二、重定向操作符
    • 三、特殊变量速查
    • [四、变量展开(Parameter Expansion)](#四、变量展开(Parameter Expansion))
    • [五、sed / grep 正则表达式元字符](#五、sed / grep 正则表达式元字符)
    • [六、POSIX 字符组](#六、POSIX 字符组)
    • [七、输出命令:echo 与 printf](#七、输出命令:echo 与 printf)
      • [echo 常用](#echo 常用)
      • [printf 常用](#printf 常用)

一、符号与括号

符号 名称 / 说明 示例
() 进程列表,生成子 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 &> file stdout + stderr 都写入 file(Bash 简写)
cmd 2>&1 > file ❌ 顺序错误,stderr 仍输出到屏幕
cmd >&1 输出送到标准输出 fd1
cmd < file file 作为命令输入(fd0)

三、特殊变量速查

变量 说明
$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 正则表达式元字符

元字符 含义 示例
. 匹配任意单个字符(除换行符) 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

六、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 表格对齐
相关推荐
浩浩测试一下6 小时前
Linux 底层知识点 1
linux·运维·服务器
Escalating_xu7 小时前
【Linux 网络编程】TCP 跨平台实战:用 Windows 客户端访问 Linux 服务器
linux·服务器·网络
忆挽篱笙歌8 小时前
环境变量,本地变量
linux·运维·服务器
吹什么轩10 小时前
linux系统复习:僵尸进程与孤儿进程
linux·运维·php
殷忆枫11 小时前
告别依赖地狱!在 Ubuntu 上用 Docker 极速部署 Home Assistant 与 MQTT,并接入 Siri 与嵌入式 C 终端
linux·ubuntu·docker
第404号工位11 小时前
手机到底有没有偷听我们?我抓包了 72 小时,抓到了真凶
linux·人工智能·架构
字节跳动开源11 小时前
ByteDance 2026 上半年 Linux 内核贡献回顾
linux·开源
小此方11 小时前
Linux网络(二十八):从NAT转换到正反向代理:图解内网通信、NAPT端口映射
linux·运维·网络
刚入门的大一新生12 小时前
Linux-进程池
linux·运维·服务器
鱼很腾apoc12 小时前
【MySQL】第4期 用户管理与 C 语言连接编程详解
linux·服务器·c语言·mysql·connector/c