通配符可以应用于命令中的多个参数吗?

通配符可以应用于命令中的多个参数吗?

我目前正在实现一个 shell,并希望根据众所周知的 shell 来模仿通配符的行为。

假设有一个命令foo需要两个文件名参数。那是:

foo file1.txt file2.txt

是正确的用法。还假设当前目录中有以下文件。

file1.txt
file2.txt
file3.txt

file1.dat
file4.dat

在 shell(例如 Bash)中执行命令时是否可以使用多个 glob 参数?例如,

foo *.txt *.dat

如果是这样,这意味着什么或评估什么?我想知道将执行哪些组合,如下所示:

foo file1.txt file1.dat
foo file2.txt file4.dat
...

提前致谢!

答案1

当然。您自己可以尝试一下,所花的时间比提出问题所需的时间还要短。

Unix shell(例如 bash)扩展通配符调用该程序。程序本身看不到参数的预扩展版本。

因此,在您的示例中,foo将使用多个参数调用,第一个参数将是 的扩展*.txt,最后一个将是 的扩展*.dat

通常 的扩展*.txt将是当前目录中以.txt.如果没有,那么 的扩展*.txt只是不变的*.txt。这可以通过 和shopt -s nullglob来改变set -f

答案2

将 glob 扩展为数组可能会有所帮助。这将foo在每次配对时调用:

shopt -s nullglob

txts=(*.txt)
dats=(*.dat)

for txt in "${txts[@]}"; do
    for dat in "${dats[@]}"; do
        foo "$txt" "$dat"
    done
done

相关内容