Bash下的转义序列
Bash下的转义
有时在Bash下需要输入进行光标移动、改变文本颜色格式等操作,这些功能是由一些无法直接输入的特殊字符来实现的,此时就需要转义字符(escape code)与转义序列(escape sequence)的形式来实现。
反斜杠\是Bash下使用的转义标志,例如\b就代表十六进制为0x08的特殊字符,其代表退格操作。
注意,bash中的echo命令默认不解析反斜杠转义(interpretation of backslash escapes),需要加上-e参数启用转义,如:
1 | echo -e '\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对应的控制字符 |
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 | echo -e '\e[1mHello 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
参考文章
本文使用Copilot辅助写作。