Bourne shell:将$ 2到$ N的参数发送到可变参数函数?

chp*_*013 8 shell sh variadic-functions

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

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

例:

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

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

function build() {
   make $*
}

if [ $1 == 'build' ]; then
   build $2 -> $N
fi
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

小智 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
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 5

function build() {
   make "$@"
}

if [ "$1" == 'build' ]
then shift        # Lose $1
     build "$@"   # Pass what was $2 .. $N
fi
Run Code Online (Sandbox Code Playgroud)

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

也可以看看: