![shell 命令 'var="[ap]"; echo $var' 有输出“h”,有什么解释吗?](https://linux22.com/image/107847/shell%20%E5%91%BD%E4%BB%A4%20'var%3D%22%5Bap%5D%22%3B%20echo%20%24var'%20%E6%9C%89%E8%BE%93%E5%87%BA%E2%80%9Ch%E2%80%9D%EF%BC%8C%E6%9C%89%E4%BB%80%E4%B9%88%E8%A7%A3%E9%87%8A%E5%90%97%EF%BC%9F%20.png)
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]