将展开的 bash 变量复制到另一个变量

Copy expanded bash variable to another variable

让我们考虑一个 bash 变量,它包含通配符目录的名称 (file.txt):

var1='/home/user/file*'

和一个全名为 var2='/home/user/file.txt' 的变量。

现在,如果我执行 echo $var1,它会正确打印 file.txt。现在我想从 shell 调用一个程序,它使用 var1 作为参数之一。虽然使用 var2 工作正常,但仅将其替换为 var1 不会进行扩展。与我如何为所述函数提供参数无关,我如何制作与 var2 完全相同的 var1 的副本 var3,即我如何在传递变量之前强制扩展到函数?

Bash 将对未加引号的变量执行通配符扩展。假设您在变量中定义了一个模式(如 var1='PATTERN'),您可以通过将其放在任何引号外来强制扩展:

function foobar {
   echo ARGS="$@"
}

var1='/home/user/file*'
foobar $var1

在上面的示例中,foobar 将与所有匹配的文件一起调用,每个文件作为单独的参数。您可以用外部命令替换 foobar。同样的效果。

强制扩展到其他变量有点棘手和冒险。假设模式源是可信的,可以使用:

var1='/home/user/file*'
set -- $var1
var3=$*