如何在 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[@]}"
扩展到数组的所有元素,作为单独的词。 (记住引号!)
我正在尝试编写 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[@]}"
扩展到数组的所有元素,作为单独的词。 (记住引号!)