在 bash 中如何解释具有多种引号的字符串?

How are strings with multiple kinds of quotes interpreted in bash?

为了提供上下文,我正在尝试创建 bash 的简单版本,为此我需要模仿 bash 使用多组单引号和双引号解析内容的方式。我无法弄清楚 bash 处理引号内引号的整个过程。我注意到一些重复的模式,但仍然没有完整的图片。

比如这个例子:

$ "'"ls"'"

评估为:

$ 'ls'

甚至这个丑陋的例子:

$ "'"'"""'"ls"'"""'"'"

评估为:

$ '"""ls"""'

我注意到出现了以下模式:

例如偶数换行引号:

$ ""'ls'""

评估反引号(单引号)内没有单引号本身的内容,评估:

$ ls

或者包装引号的奇数:

$ '''"ls"'''

它评估包含双引号的内容:

$ "ls" : command not found.

我仍然没有完全了解引号内更复杂引号的解析模式是如何完成的。

按顺序处理报价,寻找匹配的收盘报价。起始引号和结束引号之间的所有内容都变成一个字符串。嵌套引号没有特殊意义。

"'"ls"'"

当它处理第一个 " 时,它会扫描寻找下一个结束字符串的 ",其中包含 '.

然后扫描固定字符串ls.

当它处理 ls 之后的 " 时,它会扫描寻找下一个 ",从而得到另一个字符串 '.

这些都串联起来,结果是 'ls'

"'"'"""'"ls"'"""'"'"

"'" 是字符串 '.

'"""' 是字符串 """

"ls" 是字符串 ls

'"""' 是字符串 """

"'" 是字符串 '.

将它们连接在一起产生 '"""ls"""'

""'ls'""

"" 是一个空字符串。 'ls' 是字符串 ls"" 是另一个空字符串。将它们连接在一起会产生 ls.

'''"ls"'''

'' 是一个空字符串。 '"ls"' 是字符串 "ls"(包含文字双引号)。 '' 是一个空字符串。连接它们会产生 "ls"。由于没有使用该名称的命令(包括文字双引号),您会收到错误消息。

单引号和双引号之间存在差异,但它们不会影响您发布的任何示例。参见 Difference between single and double quotes in Bash