Mia*_*ati 2 bash brace-expansion variable-substitution
我有一个查找命令:
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
Run Code Online (Sandbox Code Playgroud)
我想替换Alpha,Bravo,Charlie
为$find_dir
find Directory/{$find_dir} arg1 arg2
Run Code Online (Sandbox Code Playgroud)
然而后者扩展到
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
Run Code Online (Sandbox Code Playgroud)
而不是
find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2
Run Code Online (Sandbox Code Playgroud)
为什么?它是相当复杂的 bash 脚本的一部分,该脚本可能有或多或少的目录,并非所有目录都是相关的(因此 globbing Upload/* 不起作用)。所以如果我现在设置三个并添加另一个,我将不得不在以后手动添加它。另外,我需要它从目录的根目录运行以保持查找输出的角度(./Upload/Dir/file 而不是 ./Dir/file)。
但是使用变量将允许我根据需要更改它并使其与脚本的其他部分相关。
从bash
文档,支撑扩展部分:
大括号扩展在任何其他扩展之前执行,并且其他扩展所特有的任何字符都保留在结果中。它是严格的文本。Bash 不对扩展的上下文或大括号之间的文本应用任何句法解释。为避免与参数扩展冲突,字符串 '${' 不被视为符合大括号扩展的条件。
另一个注意事项,在bash
:
扩展的顺序是:大括号扩展、波浪号扩展、参数、变量和算术扩展和命令替换 (以从左到右的方式完成)、分词和文件名扩展。
所以在你的情况下,在变量扩展之前bash
看到大括号扩展,它会先做大括号扩展,产生结果{Alpha,Bravo,Charlie}
。
如果您可以控制$find_dir
变量内容,则可以使用eval
:
eval "find Directory/{$find_dir} arg1 arg2"
Run Code Online (Sandbox Code Playgroud)