Bash下的转义序列

Bash下的转义

有时在Bash下需要输入进行光标移动、改变文本颜色格式等操作,这些功能是由一些无法直接输入的特殊字符来实现的,此时就需要转义字符(escape code)与转义序列(escape sequence)的形式来实现。
反斜杠\是Bash下使用的转义标志,例如\b就代表十六进制为0x08的特殊字符,其代表退格操作。

注意,bash中的echo命令默认不解析反斜杠转义(interpretation of backslash escapes),需要加上-e参数启用转义,如:

1
2
3
echo -e '\e[33Test' # 单双引号皆可
# or
echo $'\e[33Test' # 仅能使用单引号

Bash支持C语言式的转义字符,与ANSI转义序列,详见下文:

C语言式的转义字符:

ANSI-C规定了一系列转义字符的表示方法,这些方法在Bash、Python等语言中也可使用。
而Bash中常用的转义字符如下:

转义字符 含义
\a alert (bell) 警报(响铃)
\b backspace 退格
\e \E an escape character (ESC) 转义字符, 等效于\x1b,可用于构建ANSI转义序列
\f form feed 换页
\n new line 换行
\r carriage return 回车
\t horizontal tab 水平制表符
\v vertical tab 垂直制表符
\\ backslash 反斜杠
\‘ single quote 单引号
\“ double quote 双引号
\? question mark 问号
\nnn the eight-bit character whose value is the octal value nnn (one to three octal digits) 八进制值为nnn的八位字符(一到三位八进制数字)
\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) 十六进制值为HH的八位字符(一到两位十六进制数字)
\uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) 值为HHHH的Unicode(ISO/IEC 10646)字符(一到四位的十六进制数字)
\UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits) 值为HHHHHHHH的Unicode(ISO/IEC 10646)字符(一到八位的十六进制数字)
\cx a control-x character Ctrl+x对应的控制字符

详见Bash Manual

ANSI转义(ANSI escape code):

控制字符(C0 Control codes)

ASCII中规定了一系列单字节的控制字符,用于控制文本显示等功能。
这些控制字符本身无法显示,为了方便阅读,可以用”^G”这种脱出字符表示法来显示。在Ubuntu等系统的终端中,可以用Ctrl键来代表脱出字符”^”。

缩写 十六进制 控制字符 含义
BEL 0x07 ^G Beep 警报
BS 0x08 ^H Backspace 退格
HT 0x09 ^I Tab 水平制表符
LF 0x0A ^J Linefeed 换行
VT 0x0B ^K Vertical Tab 垂直制表符
FF 0x0C ^L Form Feed 换页
CR 0x0D ^M Carriage Return 回车
SO 0x0E ^N Activate G1 Character Set 激活G1字符集
SI 0x0F ^O Activate G0 Character Set 激活G0字符集
CAN 0x18 ^X Interrupt Escape Sequences 中断转义序列
SUB 0x1A ^Z Interrupt Escape Sequences 中断转义序列
ESC 0x1B ^[ Start Escape Sequence 开始转义序列
DEL 0x7F Ignored 忽略
CSI 0x9B Equivalent to ESC [ 等效于ESC [

要使用这些控制字符,可以利用反斜杠转义如”\xHH”、”\nnn”或”\cx”的形式输入他们。例如CR可以用”\x0E”或”\cm”表示。

注意,经过测试,Ubuntu的bash当中,ESC不能写为”\c[“,但可以用”\x1b”,”\033”或”\e”表示,而CSI应使用”ESC [“ (即”\x1b[“或”\e[“)来间接表示。

ESC控制序列 (Fe Escape sequences)

以ESC开始的一些转义序列。

ESC序列 含义
ESC c RIS - Reset 重置
ESC D IND - Linefeed 换行
ESC E NEL - Newline 新行
ESC H HTS - Set tab stop at current column 设置当前列的制表符
ESC M RI - Reverse linefeed 反向换行
ESC Z DECID - DEC private identification DEC私有标识
ESC 7 DECSC - Save current state 保存当前状态
ESC 8 DECRC - Restore state most recently saved by ESC 7 恢复最近由ESC 7保存的状态
ESC [ CSI - Control sequence introducer 控制序列引导符
ESC % Start sequence selecting character set 开始选择字符集
ESC % @ Select default (ISO 646 / ISO 8859-1) 选择默认字符集(ISO 646 / ISO 8859-1)
ESC % G Select UTF-8 选择UTF-8
ESC % 8 Select UTF-8 (obsolete) 选择UTF-8(已过时)
ESC # 8 DECALN - DEC screen alignment test DEC屏幕对齐测试
ESC ( Start sequence defining G0 character set 开始定义G0字符集
ESC ( B Select default (ISO 8859-1 mapping) 选择默认字符集(ISO 8859-1映射)
ESC ( 0 Select VT100 graphics mapping 选择VT100图形映射
ESC ( U Select null mapping - straight to character ROM 选择空映射 - 直接到字符ROM
ESC ( K Select user mapping 选择用户映射
ESC ) Start sequence defining G1 开始定义G1
ESC > DECPNM - Set numeric keypad mode 设置数字键盘模式
ESC = DECPAM - Set application keypad mode 设置应用键盘模式
ESC ] OSC - Operating system command 操作系统命令
ESC ] P Set palette 设置调色板
ESC ] R Reset palette 重置调色板

例如要使用CSI,可用”\x1b[“或”\e[“来表示

CSI (Control Sequence Introducer) sequences

以CSI即”ESC [“起始的控制序列。
在bash中使用时,需要用”\e[“或”\x1b[“来表示CSI。

CSI序列 缩写 英文名称 名称 效果
CSI n A CUU Cursor Up 光标上移 将光标向上移动n个(默认为1)个位置。如果光标已经在屏幕边缘,则不产生任何效果。
CSI n B CUD Cursor Down 光标下移
CSI n C CUF Cursor Forward 光标右移
CSI n D CUB Cursor Back 光标左移
CSI n E CNL Cursor Next Line 下一行 将光标移动到下一行开头(默认为1行)。
CSI n F CPL Cursor Previous Line 上一行 将光标移动到上一行开头(默认为1行)。
CSI n G CHA Cursor Horizontal Absolute 水平绝对定位 将光标移动到第n列(默认为第1列)。
CSI n ; m H CUP Cursor Position 光标定位 将光标移动到第n行,第m列。这些值是以1为基准的,如果省略,则默认为1(左上角)。例如,CSI ;5H是CSI 1;5H的同义词,而CSI 17;H与CSI 17H和CSI 17;1H相同。
CSI n J ED Erase in Display 清除屏幕 清除屏幕的一部分。如果n为0(或缺失),则从光标清除到屏幕末尾。如果n为1,则从光标清除到屏幕开头。如果n为2,则清除整个屏幕(并在DOS ANSI.SYS上将光标移动到左上角)。如果n为3,则清除整个屏幕并删除滚动缓冲区中保存的所有行(此功能是为xterm添加的,并受其他终端应用程序支持)。
CSI n K EL Erase in Line 清除行 清除行的一部分。如果n为0(或缺失),则从光标清除到行末尾。如果n为1,则从光标清除到行开头。如果n为2,则清除整行。光标位置不变。
CSI n S SU Scroll Up 向上滚动 将整个页面向上滚动n(默认为1)行。新行添加在底部。
CSI n T SD Scroll Down 向下滚动 将整个页面向下滚动n(默认为1)行。新行添加在顶部。
CSI n ; m f HVP Horizontal Vertical Position 水平垂直定位 与CUP相同,但被视为格式效应器函数(如CR或LF),而不是编辑器函数(如CUD或CNL)。这可能导致在某些终端模式下的不同处理。
CSI n m SGR Select Graphic Rendition 选择图形渲染 设置此代码后的字符的颜色和样式
CSI 5i AUX Port On 辅助端口打开 启用辅助串行端口,通常用于本地串行打印机
CSI 4i AUX Port Off 辅助端口关闭 禁用辅助串行端口,通常用于本地串行打印机
CSI 6n DSR Device Status Report 设备状态报告 通过传输ESC[n;mR报告光标位置(CPR),其中n是行号,m是列号。

举个例子,如果要使用CSI n T来向下滚动诶行,则应使用\e[代表CSI,n为3,于是有

1
echo -e '\e[3T'

SGR控制序列

为了调整bash终端输出的字符颜色与样式,可以使用SGR(选择图形渲染)控制序列,即CSI n m。
不同功能代码n的含义如下表所示。如果想同时实现多种功能就用分号;将功能代码隔开。
例如:

1
2
echo -e '\e[1mHello world!' # 文字加粗的Hello world!
echo -e '\e[5;31mHello world!' # 闪烁并且前景色为红色的Hello world!
代码 作用 备注
0 重置/正常 关闭所有属性。
1 粗体或增加强度
2 弱化(降低强度) 未广泛支持。
3 斜体 未广泛支持。有时视为反相显示。
4 下划线
5 缓慢闪烁 低于每分钟150次。
6 快速闪烁 MS-DOS ANSI.SYS;每分钟150以上;未广泛支持。
7 反显 前景色与背景色交换。
8 隐藏 未广泛支持。
9 划除 字符清晰,但标记为删除。未广泛支持。
10 主要(默认)字体
11–19 替代字体 选择替代字体 n − 10。
20 尖角体 几乎无支持。
21 关闭粗体或双下划线 关闭粗体未广泛支持;双下划线几乎无支持。
22 正常颜色或强度 不强不弱。
23 非斜体、非尖角体
24 关闭下划线 去掉单双下划线。
25 关闭闪烁
27 关闭反显
28 关闭隐藏
29 关闭划除
30–37 设置前景色 参见下面的颜色表。
38 设置前景色 下一个参数是5;n或2;r;g;b,见下。
39 默认前景色 由具体实现定义(按照标准)。
40–47 设置背景色 参见下面的颜色表。
48 设置背景色 下一个参数是5;n或2;r;g;b,见下。
49 默认背景色 由具体实现定义(按照标准)。
51 Framed
52 Encircled
53 上划线
54 Not framed or encircled
55 关闭上划线
60 表意文字下划线或右边线 几乎无支持。
61 表意文字双下划线或双右边线
62 表意文字上划线或左边线
63 表意文字双上划线或双左边线
64 表意文字着重标志
65 表意文字属性关闭 重置60–64的所有效果。
90–97 设置明亮的前景色 aixterm(非标准)。
100–107 设置明亮的背景色 aixterm(非标准)。

颜色表:

名称 绿 品红 亮黑(灰) 亮红 亮绿 亮黄 亮蓝 亮品红 亮青 亮白
前景色代码 30 31 32 33 34 35 36 37 90 91 92 93 94 95 96 97
背景色代码 40 41 42 43 44 45 46 47 100 101 102 103 104 105 106 107

更多关于ANSI转义的信息请看ANSI escape code

参考文章

  1. Console codes manual
  2. 维基百科: 控制字符
  3. 维基百科: ANSI转义序列
  4. Wikipedia: ANSI escape code

本文使用Copilot辅助写作。