也许这是一个简单的问题,但我想知道引号如何与变量一起使用。变量值周围的引号是否也被该变量引用?例如:
fred="\*"
echo $fred
输出结果:
\*
为什么?我认为\*
将以$ fred的价格被取代,因此输出将是:
*
但事实并非如此。
摘自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,所以左侧*
不会转义,因此它是一个模式字符,并且该单词符合文件名扩展的条件。
[man bash
“ quoting”部分(我的重点是: