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

在启动脚本中使用getopts时丢失java主参数,java,bash,getopts,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";;

我有一个带有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主方法中没有参数


有线索吗?这简直让我发疯。

这是OPTARG
不是OPTARGS--

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

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

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


显然,
ECLIPSE_PROPS
变量(即
-d
的参数)的实际值中有某种东西阻止了后面的参数被传递到Java主方法。如果您提供了实际代码和实际值,我们可能可以帮助您确定这是什么。

使用
bash-ex./script.sh
运行脚本以获取调试信息。我已经完成了,但无论如何,最终的java命令行对我来说似乎完全没有问题。I“sysout”java main方法中的args参数。它是空的。你能为它显示相关的Java代码吗?可能是,但这只是我问题中的一个错误类型。我会修好的。这是我代码中的OPTARG。最后一行脚本类似于echo_和_eval“$JAVA$JVM_OPTIONS-cp$CLASSPATH$MAIN_CLASS$ARGS”在引用参数扩展时读取:+1,但请注意在赋值时不需要这样做(例如,
LOG4j_FILE=$OPTARG;
java "$ECLIPSE_PROPS" -Dlog4.configuration="$LOG4J_FILE" -Ds.file="$S_FILE" -cp "$CLASSPATH" Main "$1" "$2" "$3" "$4" "$5"