有没有办法将一个变量扩展到多个参数而不用在 bash 中进行通配符?

Tom*_*son 8 bash shell-script variable-substitution

我想定义一个 find 表达式,其中在 -name 子表达式中包含通配符:

find_expression="-type f -name *.csv -mtime +14"
Run Code Online (Sandbox Code Playgroud)

然后稍后在几个地方使用它:

find /var/data $find_expression -delete -print
Run Code Online (Sandbox Code Playgroud)

如果我不引用 的使用$find_expression,那么当变量扩展时,glob 就会被解析,并且如果当前目录中碰巧有 CSV 文件,则 find 命令将执行错误的操作。

如果我确实引用了 的使用$find_expression,那么当变量扩展时,它不会拆分为多个参数来查找,并且 find 命令会执行错误的操作。

这没有帮助:

find_expression="-type f -name '*.csv' -mtime +14"
Run Code Online (Sandbox Code Playgroud)

我相信,因为它会产生第四个参数,该参数实际上以单引号字符开头和结尾。

set -f我可以用/对包围find 的调用set +f。但是,这意味着我无法使用 glob 作为查找表达式的路径,因此这不是通用的解决方案。

也许我可以在这里使用数组。

但是有没有什么方法可以专门将字符串扩展为参数而不解析全局变量呢?

jes*_*e_b 5

使用数组并引用它:

expression=('-type' 'f' '-name' '*.csv' '-mtime' '+14')
find /var/data "${expression[@]}" -delete -print
Run Code Online (Sandbox Code Playgroud)

每个元素将单独扩展,但不执行分词/通配。