2012-08-17 19 views
7

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

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

实施例:

./test.sh build -j应该通过-jbuild功能。

这种逻辑的伪代码版本会是什么样子:

function build() { 
    make $* 
} 

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

我怎样才能做到这一点?

回答

9

我想你可以使用shift命令来达到这个效果。它会将所有位置参数向下移动一个位置并丢弃值$1(因此$3的值被移动到$2$2的值被移动到$1,并且$1的值丢失)。完成之后,您可以使用[email protected]来选取您实际感兴趣的参数列表,例如

function build() { 
    echo "build with [email protected]" 
} 

echo "Starting args are [email protected]" 
cmd=$1 
shift 

if [ "$cmd" = 'build' ]; then 
    build "[email protected]" 
fi 
+1

你应该在'build'的调用中使用''$ @''',否则就会出现。 – 2012-08-17 09:34:18

5
function build() { 
    make "[email protected]" 
} 

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

请注意函数本身以及函数的调用使用"[email protected]"两者。我认为使用$*[email protected]而不使用双引号或"$*"是很少正确的;只有"[email protected]"保留了原始参数列表的间距,如果您的参数中包含空格,那么这很重要。如果你打算回应这些论点,那么echo "The arguments: $*"是合理的。否则,超过90%的时间,你会更好使用"[email protected]"。在测试操作员中引用"$1"时,我也采取非常保守的态度;谨慎地省略引号。

参见:

2

除非你是想发出更详细的错误信息,就没有必要测试$1明确。只要做:

#!/bin/sh -e 
function build() { 
    make "[email protected]" 
} 

"[email protected]" 

如果$1命名一个有效的函数,它会根据需要调用。如果没有,你会得到一个错误信息,这可能不是太糟糕,这取决于你的shell。

相关问题