Glob 作为 shell 函数的参数

Glob as the argument of a shell function

我正在编写一个可重用的函数,因此我需要参数尽可能灵活。

考虑一个简单的例子:

function testf(){
    print ./*.
}

这行得通。例如,使用 testf mp3 它会在数组中列出所有以 .mp3 结尾的文件,从而可以使用 for 循环。但是这样它只允许我使用扩展名。

因此,我尝试了:

function testf(){
    print ./
}

但是,它不起作用。使用testf *.mp3,不像在终端中使用print *.mp3,它只会传递第一个匹配的字符串而不是整个数组。

有什么建议吗?

shell 在 启动命令之前 执行多种类型的扩展。当你输入

testf *.mp3

shell 将首先扩展 glob,并将每个文件名作为单独的参数传递给函数

您的函数可能如下所示:

function testf(){
    printf './%s\n' "$@"
}

列出所有以.mp3结尾的文件在一个数组中 ...你的问题不涉及数组。

但是对于你的问题:首先,你想传递给你的函数一个通配符模式,但这不是你实际做的。 testf *.mp3 在调用函数 之前 扩展模式(此过程称为文件名生成),并且您的 testf 仅获取文件列表作为参数。你可以传递一个模式,但是你必须要求shell不要扩展它:

testf '*.mp3'

在这种情况下,您的 </code> 确实会包含字符串 <code>*.mp3。但是,您的 print ./ 仍然无法正常工作。原因是文件名生成发生在参数扩展之前(这是 </code> 被其包含的字符串替换的过程)。同样,您必须要求 shell 以相反的方式进行:</p> <pre><code>print ./${~1}