Bash解析和shell扩展

时间:2017-01-14 22:22:46

标签: linux bash shell

我对bash解析输入和执行扩展的方式感到困惑。

对于输入说,\'"\"hello world\""作为参数在bash中传递给显示其输入的脚本,我不确定Bash如何解析它。

实施例,

var=\'"\"hello   world\""
./displaywhatiget.sh "$var"
I got '"hello   world"

我理解"$var"中的双引号告诉bash一起处理var的值。但是,我不明白的是反斜杠何时转义,并且在bash的扩展过程中对值进行双引号解析。

我来自shell-operationshell expansion

2 个答案:

答案 0 :(得分:5)

所有有趣的事情都发生在作业var=\'"\"hello world\""中。让我们分解一下:

  • \' - 这是一个转发的单引号。没有逃脱,它会启动一个单引号字符串,但逃脱它只是一个字面单引号。因此,最终字符串将以'开头。
  • " - 这会启动一个双引号字符串。
  • \" - 一个转义双引号;与转义的单引号一样,这被视为文字双引号,因此"将是最终字符串的第二个字符。
  • hello world - 因为我们仍然使用双引号字符串,所以这只是字面上包含在最终字符串中。请注意,如果此时我们不是双引号,则该空格将标记字符串的结尾。
  • \" - 另一个逃脱的双引号;再次,字面上包括所以最后一个字符串的最后一个字符将是"
  • " - 这会关闭双引号字符串。

因此,var被赋值'"hello world"。在./displaywhatiget.sh "$var"中,双引号表示$varvar的值替换,但不会进行进一步的解释;这只是直接传递给剧本。

更新:使用set -vx时,bash以一种奇怪的方式打印作业。正如我在评论中所说,它所做的是采取原始命令,解析它(如上所述)来弄清楚它的含义,然后反向转换它以得到一个等价命令(即有一个命令同样的效果)。它出现的等效命令是var=''\''"hello world"'。以下是解析的方法:

  • '' - 这是一个零长度的单引号字符串;它没有任何效果。我不确定为什么bash包含它。我很想把它称为一个错误,但它实际上并不是错误的,只是完全没有意义。顺便说一句,如果你想要一个删除引用的例子,这里是:在这个命令中,这些引号只是被移除而没有留下痕迹。
  • \' - 这是一个转义的单引号,就像在原始命令中一样。最后一个字符串将以'开头。
  • ' - 这会启动单引号字符串。除了寻找close-quote之外,单引号内部没有任何解释。
  • "hello world" - 因为我们在一个单引号字符串中,这只是字面上包含在最终字符串中,包括双引号和空格。
  • ' - 这会关闭单引号字符串。

所以它获得了分配给var的相同值,只是用不同的方式写的。任何这些也会产生同样的效果:

var=\''"hello world"'
var="'\"hello world\""
var=\'\"hello\ world\"
var="'"'"hello world"'
var=$'\'"hello world"'

......还有很多其他人。 bash在技术上可以在set -vx下打印任何

答案 1 :(得分:2)

\ - 前缀转义序列的解析在分配时发生

var=\'"\"hello   world\""

导致Bash在$var中存储以下文字:'"hello world"

稍后在双引号字符串($var)内引用"$var"时,上述文字将成为该双引号字符串的 literal 部分 - 无法解释该值此时执行$var

shell引用的双引号字符串被视为单个单词(参数)(在删除封闭的双引号后,称为quote removal的进程)。