bash变量替换和引用

问题描述 投票:1回答:2

也许这是一个简单的问题,但我想知道引号如何与变量一起使用。变量值周围的引号是否也被该变量引用?例如:

fred="\*"
echo $fred

输出结果:

\*

为什么?我认为\*将以$ fred的价格被取代,因此输出将是:

*

但事实并非如此。

bash variables echo quoting
2个回答
1
投票

摘自bash manual Shell Expansions重点:

扩展顺序为:大括号扩展;波浪号扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词和文件名扩展。

在可以支持它的系统上,还可以使用其他扩展:进程替换。这与代字号,参数,变量以及算术扩展和命令替换同时执行。

执行这些扩展后,除非单词本身被引号引起了引用,否则将删除原始单词中的引号字符(quote removal。)>]

然后quote removal扩展可以用\*代替*,重点是:

在前面的扩展名之后,所有未加引号的字符'\',','和'“ 不是由上述扩展名之一引起的,都已删除

然而,此处发生一种扩展(具有重要意义)-变量扩展。用可变扩展将$fred替换为\*\*字符串是另一个扩展的结果,因此不会对其执行引号删除。因此它保持为\*

变量值附近的引号是否也被该变量所引用?

没有$fred包含两个字符\*

为什么?

\如果由于其他扩展而没有删除。


您可能对文件名扩展感兴趣。当单词拆分扩展后的“单词”被“限定”为文件名扩展时,文件扩展名happens when。例如,如果存在一个*字符,该字符不在单引号或双引号内并且不能转义,则“字”可用于文件名扩展。 *中的\*用反斜杠字符转义,因此*在此处不是“模式字符” ...结果未执行文件名扩展。

在分配过程中是否确实发生了通配符?

没有“环球”即。不对变量赋值执行文件名扩展。从bash Shell Parameters

变量可以通过形式的声明分配给它

name=[value]

...不执行文件名扩展。 ...

有趣的是:您可以使用3个斜杠触发文件名扩展:

fred="\\\*"
touch '\file_with_backslash'
echo $fred  # will output `\file_with_backslash` 
            # and other files you have with leading backslash...

因此fred="\\\*"\\*分配给fred(两个\\代替单个\)。然后在echo $fred中,因为在\\中反斜杠转义了baskslash,所以左侧*不会转义,因此它是一个模式字符,并且该单词符合文件名扩展的条件。


2
投票

[man bash“ quoting”部分(我的重点是:

© www.soinside.com 2019 - 2024. All rights reserved.