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

时间:2010-08-12 07:07:50

标签: bash

我有一个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个参数)以及单个文件?

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)

正如Scytale所说,$ @和$ *包含所有参数的列表。 $#包含参数计数。

您可以考虑使用getopts command进行参数解析。

祝你好运