news 2026/9/15 8:53:48

【Shell 知识速查表】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Shell 知识速查表】

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/homels -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 > &12>&1
关闭文件描述符2 > &-2>&-

空格灵活的场合

场景可以这样也可以这样
重定向到文件ls>filels > file(推荐)
数组赋值arr=( 1 2 3 )arr=(1 2 3)(推荐)
算术运算((a=5+3))(( a = 5 + 3 ))(推荐)
管道cat file|grepcat 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 > filestdout 写入 file,stderr 输出到屏幕
cmd 2> filestderr 写入 file,stdout 输出到屏幕
cmd > file 2>&1stdout + stderr 都写入 file(通用写法)
cmd > /dev/null 2>&1stdout + stderr 都写入 /dev/null(全部丢弃)
cmd &> filestdout + stderr 都写入 file(Bash 简写)
cmd 2>&1 > file❌ 顺序错误,stderr 仍输出到屏幕
cmd >&1输出送到标准输出 fd1
cmd < filefile 作为命令输入(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 的选项标志(如hBxuhimBHs
$?上一条命令的退出状态码(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.cabca1ca c
*匹配前一个字符 0 次或多次ab*cacabcabbc
^匹配行首^root→ 以 root 开头的行
$匹配行尾bash$→ 以 bash 结尾的行
[]匹配方括号中任意一个字符[0-9]→ 包含数字的行
[^]匹配不在方括号中的字符(取反)[^0-9]→ 匹配包含非数字字符的行(即不全是数字的行)
\转义特殊字符\$5→ 匹配$5
\?匹配前一个字符 0 次或 1 次colou\?rcolorcolour
\+匹配前一个字符 1 次或多次[0-9]\+→ 匹配数字串
\{}匹配前一个字符指定次数a\{2,4\}aaaaaaaaa
|或(匹配多个模式之一)error|fatal→ 匹配 error 或 fatal
\(\)分组\(error|fatal\)
  • 通配符(glob):给shell 文件名匹配用的,只有*?[]
  • 正则(regex):给文本内容匹配用的,符号多、能力强。

用途不同

通配符 glob正则 regex
匹配对象文件名 / 字符串整体文本中的一段内容
谁在用shell、lsfind -namecasegrepsedawk[[ =~ ]]
典型场景ls *.txtgrep '^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 + CSIGINT2前台进程组终止进程中断信号,程序可自定义回调逻辑,优雅退出
Ctrl + ZSIGTSTP20前台进程组暂停进程(挂起)进程后台挂起,可通过 fg/bg 恢复运行
kill pid(默认)SIGTERM15指定单个进程优雅终止进程系统推荐终止方式,允许程序收尾、释放资源
kill -9 pidSIGKILL9指定单个进程强制立即终止不能最高权限强制杀死,无法拦截、无法收尾,慎用
关闭终端/SSH断开SIGHUP1当前会话所有进程终止会话进程常用于重载配置(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"❌不支持
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 8:48:41

什么时候不需要MCP

问题 经常看到招聘 JD 上写着 MCP&#xff0c;似乎每个人都要会 MCP 才能做 agent 开发又有人说 MCP 太重了&#xff0c;没什么人用 MCP我们又会看到很多教程说&#xff0c;使用 MCP 统一接口很好用 我们平时看到的教程都是介绍 MCP 是什么&#xff0c;为什么要用 MCP。说了很多…

作者头像 李华
网站建设 2026/9/15 8:45:12

Open UI5日历加载机制与国际化应用实践

1. Open UI5 启动序列中的日历加载机制剖析在Open UI5框架的初始化过程中&#xff0c;loadCalendar.js扮演着关键但常被忽视的角色。这个不到200行的文件位于UI5核心模块的启动序列中&#xff0c;负责处理与区域设置&#xff08;locale&#xff09;相关的日历加载逻辑。不同于其…

作者头像 李华
网站建设 2026/9/15 8:42:10

AI编程时代程序员生存指南:从编码执行者到问题解决者

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华