Bourne shell:将参数$ 2发送到$ N到variadic函数?

时间:2012-08-17 09:11:52

标签: shell variadic-functions sh

谷歌终于让我失望了。我似乎无法在Bourne shell脚本中找到如何执行此操作:

我正在编写一个shell脚本来处理我对项目的所有测试。我已为这个脚本可以执行的每个任务设置函数(构建,运行,清理等),并且希望将任何其他命令行参数(除了命令本身)传递到所需的函数上。

示例:

./test.sh build -j应将-j传递给build函数。

此逻辑的伪代码版本如下所示:

function build() {
   make $*
}

if [ $1 == 'build' ]; then
   build $2 -> $N
fi

我该如何做到这一点?

3 个答案:

答案 0 :(得分:10)

我认为您可以使用shift命令实现此效果。它会将所有位置参数向下移动一个位置并降低$1的值(因此$3的值会移至$2$2的值会被移动到$1并且$1的值丢失了)。完成后,您只需使用$@来获取您实际感兴趣的参数列表,例如

function build() {
    echo "build with $@"
}

echo "Starting args are $@"
cmd=$1
shift

if [ "$cmd" = 'build' ]; then
    build "$@"
fi

答案 1 :(得分:5)

function build() {
   make "$@"
}

if [ "$1" == 'build' ]
then shift        # Lose $1
     build "$@"   # Pass what was $2 .. $N
fi

注意在函数本身和函数调用中都使用"$@"。我认为在没有双引号或$*的情况下使用$@"$*"很少是正确的。只有"$@"保留原始参数列表的间距,如果您有包含空格的参数,则这很重要。如果你要回应这些论点,那么echo "The arguments: $*"是合理的。否则,超过90%的时间,您最好使用"$@"。我也对在测试运算符中引用"$1"采取了非常保守的态度;对于省略引号要谨慎。

另见:

答案 2 :(得分:2)

除非您想要发出更详细的错误消息,否则无需显式测试$1。只是做:

#!/bin/sh -e
function build() {
   make "$@"
}

"$@"

如果$1命名有效函数,则会根据需要调用它。如果没有,您将收到一条可能不太糟糕的错误消息,具体取决于您的shell。