gpt4 book ai didi

linux - Bash 解析和 shell 扩展

转载 作者:IT王子 更新时间:2023-10-29 01:03:40 24 4
gpt4 key购买 nike

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

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

例子,

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

我明白 "$var" 中的双引号告诉 bash 将 var 的值放在一起。但是,我不明白的是,在 bash 的扩展过程中,反斜杠转义和双引号解析是什么时候发生的。

我来自shell-operation , 和 shell expansion .

最佳答案

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

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

因此,var 被赋予值 '"hello world"。在 ./displaywhatiget.sh "$var" 中,双引号表示 $var 被替换为 var 的值,但没有进一步解释完成;那只是直接传递给脚本。

更新:当使用 set -vx 时,bash 以一种有点奇怪的方式打印赋值。正如我在评论中所说,它所做的是获取原始命令,解析它(如上所述)以弄清楚它的含义,然后将其反向翻译以获得等效命令(即具有相同命令的命令影响)。它提供的等效命令是 var=''\''"hello world"'。解析方式如下:

  • '' - 这是一个零长度的单引号字符串;它没有任何效果。我不确定为什么 bash 包含它。我很想称它为错误,但它实际上不是错误,只是完全没有意义。顺便说一句,如果您想要一个删除引号的示例,请看这里:在此命令中,这些引号将被删除而不会留下任何痕迹。
  • \' - 这是一个转义的单引号,就像在原始命令中一样。最终字符串将以 ' 开头。
  • ' - 这开始一个单引号字符串。除了查找闭引号外,单引号内根本不进行任何解释。
  • "hello world" - 因为我们在单引号字符串中,所以它只是按字面意思包含在最终字符串中,包括双引号和空格.
  • ' - 这将关闭单引号字符串。

所以它得到分配给 var 的相同值,只是写法不同。这些中的任何一个也会产生相同的效果:

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

...还有很多其他的。从技术上讲,bash 可以在 set -vx 下打印任何这些。

关于linux - Bash 解析和 shell 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41655630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com