我有一个bash函数(稍微简化一下解释)
copy_to() {
cp $1 $2 $3
}
这很好用:
copy_to -f /demo/example1.xml new_demo/
但是假设我要复制所有xml文件,以下代码会出现问题:
copy_to -f /demo/*.xml new_demo/
显然我可以写cp -f /demo/*.xml new_demo/
,但无论如何都要让copy_to函数用于文件列表(传递超过3个参数)以及单个文件?
答案 0 :(得分:5)
$@
和$*
包含所有参数的列表。您应该使用$@
,因为它在双引号内部工作。否则,包含空格的文件名会破坏您的代码。
copy_to() {
cp "$@"
}
如果其中一个参数是特殊的,您可以使用shift
命令将其从参数列表中删除,如下所示:
example() {
destination="$1"
shift
echo "copying $@ to $destination"
}
shift
会从列表中删除第一个参数,因此您必须先将其保存在其他位置。致电shift
后,$1
的内容将是$2
,$2
将包含$3
等内容。 $@
扩展为所有参数(不包括shift
删除的参数)。
请注意,您不能仅从头开始将参数从参数列表的 end 移开。
答案 1 :(得分:3)
如果你需要迭代参数:
f() {
for arg
do
do_something $arg
done
}
in $@
隐含for arg
(明确地:for arg in $@
)。
答案 2 :(得分:2)