我对 bash 解析输入和执行扩展的方式感到困惑。
对于输入来说,\'"\"hello world\""
作为 bash 中的参数传递给显示其输入内容的脚本,我不太确定 Bash 如何解析它。
Example,
var=\'"\"hello world\""
./displaywhatiget.sh "$var"
I got '"hello world"
据我了解,双引号"$var"
告诉 bash 处理 的值var
一起。但是,我不明白的是,在 bash 的扩展过程中,反斜杠转义和双引号解析何时发生。
我来自shell操作 https://www.gnu.org/software/bash/manual/bash.html#Shell-Operation, and 外壳扩展 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions.
所有有趣的事情都发生在任务中,var=\'"\"hello world\""
。让我们来分解一下:
-
\'
- 这是转义的单引号。如果没有转义,它将开始一个单引号字符串,但转义后它只是一个文字单引号。因此,最终的字符串将以'
.
-
"
- 这开始一个双引号字符串。
-
\"
- 转义双引号;就像转义的单引号一样,它被视为文字双引号,所以"
将是最终字符串的第二个字符。
-
hello world
- 因为我们仍然在双引号字符串中,所以这只是字面上包含在最终字符串中。请注意,如果此时我们没有使用双引号,则空格将标记字符串的结尾。
-
\"
- 另一个转义双引号;再次,按字面意思包含,因此最终字符串的最后一个字符将是"
.
-
"
- 这会关闭双引号字符串。
Thus, var
被赋值'"hello world"
. In ./displaywhatiget.sh "$var"
,双引号的意思是$var
被替换为var
的值,但不做进一步的解释;这只是直接传递给脚本。
更新:使用时set -vx
,bash 以一种有点奇怪的方式打印作业。正如我在评论中所说,它的作用是获取原始命令,解析它(如上所述)以找出它的含义,然后反向翻译它以获得等效的命令(即具有相同命令的命令)影响)。它提出的等效命令是var=''\''"hello world"'
。这是如何解析的:
-
''
- 这是一个零长度的单引号字符串;它没有任何效果。我不确定为什么 bash 包含它。我很想称其为错误,但实际上并非如此wrong,完全没有意义。顺便说一句,如果您想要一个删除引号的示例,这里是:在此命令中,这些引号将被删除,不留任何痕迹。
-
\'
- 这是一个转义的单引号,就像原始命令一样。最终字符串将以'
.
-
'
- 这开始一个单引号字符串。除了寻找右引号之外,在单引号内根本不执行任何解释。
-
"hello world"
- 由于我们位于单引号字符串中,因此这只是字面上包含在最终字符串中,包括双引号和空格。
-
'
- 这会关闭单引号字符串。
所以它得到分配给相同的值var
,只是写法不同。其中任何一个也会产生相同的效果:
var=\''"hello world"'
var="'\"hello world\""
var=\'\"hello\ world\"
var="'"'"hello world"'
var=$'\'"hello world"'
...以及许多其他人。 bash 从技术上讲可以打印any其中set -vx
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)