在 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
为了提供上下文,我正在尝试创建 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