我最近阅读了 Opensource.com 特约撰稿人 Don Watkins 撰写的一篇关于 shell 元字符的文章。他的文章让我想到了你可以使用 shell 输入做的所有奇怪的事情。虽然我可能还没有发现极端情况,但我经常发现 shell 转义序列,如 \b
、\t
和 \f
非常有用。
转义序列是一种特殊的终端输入类型。它们旨在让您能够输入物理键盘上可能没有的字符或事件。以下是我最喜欢的 Bash shell 转义序列。
1. 退格
您可以输入退格字符作为命令的一部分,或多或少地加载它以在命令执行时触发。例如,随意查看此命令,您可能会期望其输出为 ab
,但请查看实际输出
$ echo a$'\b'b
b
从技术上讲,shell 确实输出了 ab
(您可以通过在命令末尾附加 | wc -m
来确认这一点),但总输出的一部分是 \b
退格事件。退格删除了 a
,然后输出了 b
,因此可见的输出仅为 b
。
2. 换行
换行符是您的 shell 转到下一行第 0 列的信号。当使用像 printf 这样的命令时,这至关重要,因为该命令不会像 echo
那样假定您希望在输出末尾添加换行符。请查看不带 \n
换行符的 printf
语句与带换行符的语句之间的区别
$ printf "%03d.txt" 1
001.txt$
$ printf "%03d.txt\n" 1
001.txt
$
3. 换页
\f
换页信号类似于换行符,但没有返回到第 0 列的强制要求。以下是使用换页而不是换行符的 printf
命令
$ printf "%s\f" hello
hello
$
您的 shell 提示符在下一行,但不在行的开头。
4. Tab
有两个制表符转义序列:\t
水平制表符和 \v
垂直制表符。水平制表符与您期望的完全一样。
$ echo a$'\t'b
a b
从理论上讲,垂直制表符的原理相同,但在垂直空间中。但在大多数控制台上,行的垂直间距不是可变的,因此它通常看起来很像换页
$ echo a$'\v'b
a
b
5. Unicode
Unicode 标准中有很多字符可用,而您的键盘只有大约 100 个键。在 Linux 上有几种输入特殊字符的方法,但将它们输入到终端的一种方法是使用 Unicode 转义序列。您可以使用 \u
后跟十六进制值来启动此转义序列。您可以在文件 /usr/share/X11/locale/en_US.UTF-8/Compose
中找到许多 Unicode 值,或者您可以查看 Unicode 规范 https://www.unicode.org/charts/。
对于输入常用符号(如 Pi,圆的周长与其直径的比率),这可能是一个有用的技巧
$ echo $'\u03C0'
π
还有许多其他符号和字符。
$ echo $'\u270B'
✋
$ echo $'\u2658'
♘
$ echo $'\u2B67'
⭧
有盲文、音乐符号、字母表、电气符号、数学符号、表情符号、游戏符号等等。实际上,有太多的可用符号,以至于有时您需要 \U
(注意大写字母)Unicode 转义序列来访问高范围内的 Unicode。例如,这张红桃 5 扑克牌仅在使用 \U
转义序列时才会出现
$ echo $'\U1F0B5'
🂵
在 Unicode 规范中四处看看,找到您感兴趣的领域,并使用 \u
和 \U
访问您需要的所有特殊符号。
转义 shell
Bash shell 的手册页中列出了 18 个转义序列,我发现其中一些比其他更有用。我在本文中介绍了我最喜欢的,Don Watkins 在他的文章中谈到了他最常用的元字符,但仍有更多内容有待发现。有多种方法可以编码字母和数字范围、子 shell、数学方程式等等。要全面了解 shell 可用的元字符,请下载我们的元字符速查表,并在您越来越擅长使用计算机上最强大的应用程序:Linux 终端时,将其放在手边。
2 条评论