在启动脚本中使用getopts时丢失java主args

时间:2014-10-02 09:11:16

标签: java bash getopts

我有一个包含5个必需参数(5个路径)和3个选项的脚本(-d用于调试,-l用于log4j覆盖,-s用于另一个覆盖)。

我用getopts管理它。以下脚本已简化:

LOG4J_FILE=$DEFAULT_LOG4J_FILE
S_FILE=$DEFAULT_S_FILE
ECLIPSE_PROPS=

while getopts "l:s:d" flag; do
case "$flag" in
   l) LOG4J_FILE="$OPTARG";;
   s) S_FILE="$OPTARG";;
   d) ECLIPSE_PROPS="-Xdebug ...";;
   :) usage;;
   ?) usage;;
esac
done

shift $((OPTIND-1))
OPTIND=1

...

echo_and_eval $JAVA $ECLIPSE_PROPS -Dlog4.configuration=$LOG4J_FILE -Ds.file=$S_FILE -cp $CLASSPATH $MAIN_CLASS $ARGS

如果我只放了5个参数,它就可以了。 如果我添加一个或两个带参数(l或s)的可选项,它就可以工作。 如果我添加-d选项,我在Java main方法中没有args

有任何线索吗?这让我发疯了。

2 个答案:

答案 0 :(得分:1)

OPTARG 不是OPTARGS - http://www.gnu.org/software/bash/manual/bashref.html#index-getopts

l) LOG4J_FILE="$OPTARG";;

我鼓励你养成引用所有变量的习惯,这会保护任何包含空格或字符串的变量:

java "$ECLIPSE_PROPS" -Dlog4.configuration="$LOG4J_FILE" -Ds.file="$S_FILE" -cp "$CLASSPATH" Main "$1" "$2" "$3" "$4" "$5"

答案 1 :(得分:0)

简单地使用echo输出命令行不会向您展示如何将其解析为单个参数。 foo 'bar baz'foo bar baz是两个非常不同的命令,但在echo编辑时它们看起来相同。

显然,ECLIPSE_PROPS变量的实际值(即-d的参数)中的某些内容阻止了后面的参数传递给Java main方法。如果您提供了实际代码和实际值,我们可能会帮助您确定它是什么。