我有一个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个参数)以及单个文件?
有$@和$*包含所有参数的列表.你应该使用$@,因为它在双引号内部工作.否则,包含空格的文件名会破坏您的代码.
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).
请注意,您不能仅从头开始将参数从参数列表的末尾移开.