2014-10-02 45 views
2

我有一个包含5个必需参数(5个路径)和3个选项(-d用于调试的脚本,-l用于log4j重写,-s用于另一个重写)的脚本。在启动脚本中使用getopts时丢失了java主要参数

我正在用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主要方法中没有参数。

任何线索?这真让我抓狂。

+1

用'bash -ex。/ script.sh'运行脚本来获取调试信息。 – anubhava 2014-10-02 09:33:12

+0

我已经做到了,但无论如何,最终的java命令行对我来说似乎完全没问题。我在“java”主要方法中“sysout”args参数。它是空的。 – Zofren 2014-10-02 09:48:44

+0

你能为此显示相关的Java代码吗? – anubhava 2014-10-02 09:51:04

回答

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" 
+0

本来是说不过这只是我的问题录入错误。我会解决它。这是我的代码中的OPTARG。而最终的脚本行是像echo_and_eval“$ JAVA $ JVM_OPTIONS -cp $ CLASSPATH $ MAIN_CLASS $ ARGS” – Zofren 2014-10-02 15:24:49

+0

阅读:[我想在一个变量把一个命令,但是复杂的情况下总是失败!(HTTP ://mywiki.wooledge.org/BashFAQ/050) – 2014-10-02 15:48:03

+0

+1报价参数扩展,但要注意,它不是必要的任务(例如'LOG4j_FILE = $ OPTARG ;;') – 2014-10-02 16:07:24

0

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

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