Bash 大括号扩展和变量

Bash 大括号扩展和变量

我有一个查找命令:

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"

相关内容