我有一个查找命令:
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
我想替换Alpha,Bravo,Charlie
为$find_dir
find Directory/{$find_dir} arg1 arg2
然而后者扩展到
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
而不是
find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2
为什么?它是相当复杂的 bash 脚本的一部分,可能有或多或少的目录,但并非所有目录都是相关的(因此通配 Upload/* 不起作用)。因此,如果我现在设置三个并添加另一个,我必须稍后手动添加它。另外,我需要它从目录的根目录运行以保持查找输出的视角(./Upload/Dir/file 而不是 ./Dir/file)。
但是使用变量可以让我根据需要进行更改,并使其与脚本的其他部分保持相关。
答案1
从bash
文档来看,支撑扩张部分:
大括号扩展在任何其他扩展之前执行,并且其他扩展所特有的任何字符都将保留在结果中。它是严格的文本。 Bash 不会对扩展上下文或大括号之间的文本应用任何语法解释。为了避免与参数扩展发生冲突,字符串“${”不被视为适合大括号扩展。
另一个注释,在bash
:
扩展的顺序为:大括号扩展、波形符扩展、参数、变量、算术扩展和命令替换 (以从左到右的方式完成)、分词和文件名扩展。
所以就你而言,bash
锯大括号扩展在变量扩展之前,它会先进行大括号扩展,产生结果{Alpha,Bravo,Charlie}
。
如果您可以控制$find_dir
可变内容,您可以使用eval
:
eval "find Directory/{$find_dir} arg1 arg2"