Bash 解析和 shell 扩展

2024-05-16

我对 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(使用前将#替换为@)

Bash 解析和 shell 扩展 的相关文章