chp*_*013 8 shell sh variadic-functions
谷歌终于让我失望了.我似乎无法在Bourne shell脚本中找到如何执行此操作:
我正在编写一个shell脚本来处理我对项目的所有测试.我已经为这个脚本可以执行的每个任务(构建,运行,清理等)设置了函数,并且希望将任何其他命令行参数(除了命令本身)传递到所需的函数上.
例:
./test.sh build -j应该传递-j给build函数.
此逻辑的伪代码版本如下所示:
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)
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"对测试操作员的引用采取了非常保守的态度; 省略引号要谨慎.
也可以看看: