将展开的 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=$*
让我们考虑一个 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=$*