Linux 上 Bash 中的字符转义

linuxoperating systemopen source更新于 2026/2/6 0:07:17

摘要

字符用于源代码、命令行以及大多数计算机交互。另一方面,大多数字符在标准键盘上无法通过按键表示,许多字符甚至无法读取。另一类字符是复杂的控制字符。

本教程将讨论 Bash 中的字符转义。首先,我们将简要概述计算机如何表示字符。首先,我们将研究 Bash 中的各种字符串类型。然后,我们将详细介绍 Bash 中的字符转义。

注意 - Linux 命令区分大小写。

Bash 中的字符串

由于一个按键并不能代表键盘上的每个符号,因此写入和存储字符是两个不同的过程。Bash 使用字符串来存储文本。事实上,Bash 中的所有变量本质上都是字符串。它们通常由单引号或双引号括起来的直线序列组成。

我们在一种上下文中解释或推断特定的字符组合,而在另一个上下文中则按字面意思理解,这是这两种方法之间的关键区别。

单引号

在 Bash 中使用单引号 (') 的主要目的是保留每个字符的字面值。当您希望输入保留其字面值而不进行任何数据插值时,可以使用单引号从字符中提取任何特殊值。当您不想使用转义符来改变 Bash 对输入字符串的理解方式时,单引号是一个有用的替代方案。

$ text='a $(echo b) c'
$ echo "${text}"
a $(echo b) c

请注意单引号是如何保持内容完整的。虽然不进行插值,但因此,我们也无法在任何时候将单引号放在另一个单引号内。

双引号

当允许历史记录扩展时,双引号 (") 保留所有字符的字面值,但 ($)、(')、(")、() 和 (!) 字符除外。

$ text="a"
$ text="${text} $(echo "b") c"
$ echo "${text}"
a b c

首先,我们单独使用 [a] 键将字符直接赋值给文本。接下来,使用 ${text} 变量扩展,获取其值。$ 在该句子中被翻译。最后,我们将该值与一个表达式和另一个字符连接起来,重新赋值给文本。

Bash 中的转义字符

Bash 中具有特定含义的字符必须在单引号之外进行转义,以保持其字面值。实际上,这主要使用反斜杠转义字符来实现。有时我们可能需要使用其他技巧。

让我们来看看每种方法的适用场合和方法。

1. 双引号

双引号内的反斜杠字符 () 只有在后接 ($)、(')、(")、() 或换行符时才具有特定含义。如果在双引号内,反斜杠字符后接上述任何字符,则输出中不会显示反斜杠字符。如果反斜杠字符前有反斜杠字符,则双引号之间可以使用双引号。 为了转义双引号字符串中的文本,我们需要在字符前添加反斜杠字符。

$ text1="a $(echo b) c"
$ text2="a \$(echo b) c"
$ echo "${text1}"
a b c
$ echo "${text2}"
a $(echo b) c

在上面的例子中,看看美元符号在 text2 中是如何转义的,这样它既保留了字面含义,又失去了其特殊功能。

不使用引号

正如我们已经演示的那样,取消引号是有代价的。为了使任何不带引号的序列统一,以下字符必须全部转义:逗号、句号、下划线、加号、冒号、商业符号、百分号、斜杠和连字符。

$ text=a\ \&\ b\ \&\ c
$ echo "${text}"
a & b & c

作为一种良好做法,最好不要使用引号。

结论

在本教程中,我们讨论了 Bash 中的字符转义。各种字符编码表是我们首先发现的。此外,我们还观察到一些字符仅用作命令或标记文本,无法打印。我们需要一种方法来避免使用此类字符,以便按字面意思使用它们。我们研究了纯 Bash 以及 Bash 中几种典型的内置字符转义情况。

本教程演示了如何在 Bash 中使用单引号和双引号,并阐明了它们之间的区别。了解了它们的区别后,您应该能够告诉 Shell 如何读取输入字符串,以及是按原样输出输入还是插入数据。


相关文章


有用资源