当前位置:  开发笔记 > 编程语言 > 正文

Bash解析和shell扩展

如何解决《Bash解析和shell扩展》经验,为你挑选了1个好方法。

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

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

例,

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

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

我来自shell操作和shell扩展.



1> Gordon Davis..:

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

\' - 这是一个逃脱的单引号.没有逃脱,它将启动一个单引号字符串,但逃脱它只是一个字面单引号.因此,最后的字符串将以'.

" - 这会启动一个双引号字符串.

\" - 一个逃脱的双引号; 就像转义的单引号一样,这被视为文字双引号,因此"将是最终字符串的第二个字符.

hello world - 因为我们仍然使用双引号字符串,所以这只是字面上包含在最后一个字符串中.请注意,如果此时我们不是双引号,则空格将标记字符串的结尾.

\" - 另一个逃脱的双引号; 再次,字面上包括所以最终字符串的最后一个字符将是".

" - 这会关闭双引号字符串.

因此,var获得赋值'"hello world".在./displaywhatiget.sh "$var",双引号意味着$varvar值取代,但没有进一步的解释; 这只是直接传递给脚本.

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

'' - 这是一个零长度的单引号字符串; 它没有任何效果.我不确定为什么bash包含它.我很想把它称为一个bug,但它实际上并没有,只是毫无意义.顺便说一句,如果你想要一个引用删除的例子,这里是:在这个命令中,这些引号只是被删除而没有留下痕迹.

\' - 这是一个转义的单引号,就像在原始命令中一样.最后的字符串将以.开头'.

' - 这会启动一个单引号字符串.除了寻找close-quote之外,单引号内部没有任何解释.

"hello world"- 因为我们使用的是单引号字符串,所以它只包含在最终字符串中,包括双引号和空格.

' - 这会关闭单引号字符串.

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

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

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

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有