我正在编写一个shell脚本来处理我对项目的所有测试。我已为这个脚本可以执行的每个任务设置函数(构建,运行,清理等),并且希望将任何其他命令行参数(除了命令本身)传递到所需的函数上。
示例:
./test.sh build -j
应将-j
传递给build
函数。
此逻辑的伪代码版本如下所示:
function build() {
make $*
}
if [ $1 == 'build' ]; then
build $2 -> $N
fi
我该如何做到这一点?
答案 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。