如何在 Bash 变量中存储大括号

How to store curly brackets in a Bash variable

我正在尝试编写 bash 脚本。我不确定为什么在我的脚本中:

ls {*.xml,*.txt} 

工作正常,但是

name="{*.xml,*.txt}"
ls $name

不起作用。我得到

ls: cannot access {*.xml,*.txt}: No such file or directory

表达式

ls {*.xml,*.txt}

结果 Brace expansion 和 shell 将扩展(如果有)作为参数传递给 ls。设置 shopt -s nullglob 使此表达式在没有匹配文件时不计算任何值。

双引号字符串会抑制扩展,shell 将文字内容存储在变量 name 中(不确定这是否是您想要的)。当您使用 $name 作为参数调用 ls 时,shell 会进行变量扩展但不会进行大括号扩展。

正如@Cyrus 所提到的,eval ls $name 将强制展开大括号,您会得到与 ls {\*.xml,\*.txt}.

相同的结果

你的扩展不起作用的原因是变量扩展之前执行了大括号扩展,请参阅手册中的Shell expansions

我不确定你要做什么,但如果你想存储文件名列表,请使用数组:

files=( {*.txt,*.xml} )           # these two are the same
files=(*.txt *.xml)
ls -l "${files[@]}"               # give them to a command
for file in "${files[@]}" ; do    # or loop over them
    dosomething "$file"
done

"${array[@]}" 扩展到数组的所有元素,作为单独的词。 (记住引号!