Потеря основных аргументов Java при использовании 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.

Любая подсказка? Это сводит меня с ума.


person Zofren    schedule 02.10.2014    source источник
comment
Запустите свой скрипт с помощью bash -ex ./script.sh, чтобы получить отладочную информацию.   -  person anubhava    schedule 02.10.2014
comment
Я сделал это, но в любом случае окончательная командная строка java кажется мне полностью приемлемой. Я sysout параметр args в основном методе java. Он пуст.   -  person Zofren    schedule 02.10.2014
comment
Можете ли вы показать соответствующий код Java для этого?   -  person anubhava    schedule 02.10.2014


Ответы (2)


Это 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"
person glenn jackman    schedule 02.10.2014
comment
Возможно, это было так, но это просто опечатка в моем вопросе. Я исправлю это. Это OPTARG в моем коде. И последняя строка скрипта выглядит примерно так: echo_and_eval $JAVA $JVM_OPTIONS -cp $CLASSPATH $MAIN_CLASS $ARGS - person Zofren; 02.10.2014
comment
+1 за раскрытие параметров в кавычках, но обратите внимание, что это не обязательно для присваиваний (например, LOG4j_FILE=$OPTARG;; ) - person Mark Reed; 02.10.2014

Простое использование echo для вывода командной строки не покажет вам, как она разбивается на отдельные аргументы. foo 'bar baz' и foo bar baz — это две очень разные команды, но они выглядят одинаково, когда echoed.

Ясно, что что-то в фактическом значении переменной ECLIPSE_PROPS (то есть аргументе -d) препятствует передаче более поздних аргументов основному методу Java. Если вы предоставили фактический код и фактические значения, мы могли бы помочь вам определить, что это такое.

person Mark Reed    schedule 02.10.2014