2014-10-02 1 views
2

5 개의 필수 매개 변수 (5 개 경로)와 3 개의 옵션 (-d는 디버그 용, -l은 log4j 무시 용, -s는 다른 무시 용)이있는 스크립트가 있습니다.시작 스크립트에서 getopts를 사용할 때 java 주 args 손실

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 주 방법에 arg가 없습니다.

단서가 있습니까? 이것은 나를 미치게 만든다.

+1

'bash -ex./script.sh'를 사용하여 스크립트를 실행하면 디버그 정보를 얻을 수 있습니다. – anubhava

+0

나는 그것을했지만 어쨌든, 최종 자바 커맨드 라인은 나에게 완전히 괜찮은 것 같습니다. 나는 java main 메소드의 args 파라미터를 "sysout"한다. 그것은 비어 있습니다. – Zofren

+0

관련 Java 코드를 표시 할 수 있습니까? – anubhava

답변

1

OPTARG 아니다 OPTARGS - 공백 또는 로빙 문자가 포함 그 어떤 보호 할 수 http://www.gnu.org/software/bash/manual/bashref.html#index-getopts

l) LOG4J_FILE="$OPTARG";; 

I의 모든 변수를 인용의 습관을하는 것이 좋습니다 것 :

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

+0

다음을 읽으십시오 : [변수에 명령을 넣으려고합니다. 그러나 복잡한 경우는 항상 실패합니다!] (http : //mywiki.wooledge.org/BashFAQ/050) –

+0

인용 확장 매개 변수에 +1하지만 할당시 필요하지 않음에 유의하십시오 (예 :'LOG4j_FILE = $ OPTARG ;;') –

0

단순히 echo을 사용하여 명령 줄을 출력하면 개별 인수로 구문 분석되는 방법을 알 수 없습니다. foo 'bar baz'foo bar baz은 매우 다른 두 명령이지만, echo ed.

ECLIPSE_PROPS 변수의 실제 값 (즉, -d의 인수)이 나중에 Java 기본 메소드로 전달되는 것을 막아줍니다. 실제 코드와 실제 값을 제공 한 경우 해당 코드를 결정하는 데 도움을 줄 수 있습니다.

관련 문제