shell 命令 'var="[ap]"; echo $var' 有输出“h”,有什么解释吗?

shell 命令 'var="[ap]"; echo $var' 有输出“h”,有什么解释吗?

bash 版本:

$ bash -version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

命令:

$ var="[a-p]"; echo $var
h

任何人都知道这种解释的原因是什么。

对于上下文,我正在使用 shell 解析配置文件并寻找模式来获取部分名称

[section-foo]
foo=bar

在读取文件时,如果一个节行例如是 [ap] ,它将出现奇怪的行为。

答案1

h您运行的目录中有一个文件名

echo $var

shell 尝试使用[a-p]glob,如果有任何内容匹配,它就会用匹配项替换 glob。如果文件名为h,则变为

echo h

您可以通过引用扩展来防止这种情况,这将导致它不被视为全局。

echo "$var"

答案2

通过不使用任何引号,echo $var您会将扩展暴露给“分割”和“路径名扩展”(又名“通配符”或“文件名生成”)。

[这意味着包含(also*和)的字符串?将按照“路径名扩展”规则进行扩展。就您而言,这意味着有一个文件的名称只有一个字符,称为h.

如果引用扩展,则不会执行“路径名扩展”:

$ echo "$var"
[a-p]

相关内容