我有一个包含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 。
有任何线索吗?这让我发疯了。
答案 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方法。如果您提供了实际代码和实际值,我们可能会帮助您确定它是什么。