Shell 知识速查表
一、符号与括号
| 符号 | 名称 / 说明 | 示例 |
|---|---|---|
() |
进程列表,生成子 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 |
表格对齐 |