你如何编写一个对传递的参数动态的bash脚本函数?

And*_*ewC 1 bash

我有一个bash函数(稍微简化一下来解释)

copy_to() {
    cp $1 $2 $3
}
Run Code Online (Sandbox Code Playgroud)

这很好用:

copy_to -f /demo/example1.xml new_demo/
Run Code Online (Sandbox Code Playgroud)

但是假设我要复制所有的xml文件,以下代码会有问题:

copy_to -f /demo/*.xml new_demo/
Run Code Online (Sandbox Code Playgroud)

显然我可以写cp -f /demo/*.xml new_demo/,但是无论如何都要让copy_to函数用于文件列表(它传递的不仅仅是3个参数)以及单个文件?

scy*_*scy 5

$@$*包含所有参数的列表.你应该使用$@,因为它在双引号内部工作.否则,包含空格的文件名会破坏您的代码.

copy_to() {
    cp "$@"
}
Run Code Online (Sandbox Code Playgroud)

如果其中一个参数是特殊的,您可以使用该shift命令将其从参数列表中删除,如下所示:

example() {
    destination="$1"
    shift
    echo "copying $@ to $destination"
}
Run Code Online (Sandbox Code Playgroud)

shift从列表中删除第一个参数,因此您必须先将其保存在其他位置.在调用之后shift,内容$1将是什么$2,$2将包含什么$3等等.$@扩展到所有参数(不包括那些被删除的参数shift).

请注意,您不能仅从头开始将参数从参数列表的末尾移开.