9

谷歌终于让我失望了。我似乎无法在 Bourne shell 脚本中找到如何做到这一点:

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

例子:

./test.sh build -j应该传入-j函数build

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

function build() {
   make $*
}

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

我怎样才能做到这一点?

4

3 回答 3

16

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
于 2012-08-17T09:33:13.407 回答
5
function build() {
   make "$@"
}

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

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

也可以看看:

于 2012-08-17T09:33:23.447 回答
2

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

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

"$@"

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

于 2012-08-17T21:11:01.413 回答