2014-09-23 2 views
-3

스크립트가 파일을 하나씩 선택하는 여러 줄의 파일을 읽는 스크립트를 작성했으며 파일 이름이 Java로 끝나면 pmd 검사가 수행됩니다 코드에. 그것은 그것이 쓰여진 아이디어였습니다. 그러나 아래 스크립트가 실행될 때 오류가 발생하고 구문의 일부인 thenwhile 내에 사용 된 경우 오류가 발생합니다.오류 : while 루프를 사용하는 경우

$git diff origin/master..master --name-onlyHelloWorld.java을 반환합니다. 그리고 예, 검색 할 위치를 전달해야하고 스크립트의 $each_file에 추가해야 할 수도 있습니다.

하지만 주로이 스크립트가 아래 표시된 오류를 반환하는 이유에 대한 해결책을 원합니다. 패턴 일치 코드 (즉, if 블록)로 인해 오류가 발생합니까?

스크립트는 전체적으로 저장소의 변경된 모든 파일에 대해 pmd 검사를 실행해야합니다. 그게 내 질문에 대답하는 데 도움이된다면. 당신은 기대처럼

Syntax error: "then" unexpected (expecting "done") 
+4

'if' – hek2mgl

+3

...과'['와']'다음에 공백이 누락되었습니다. 그리고 너의 속임수는 고장났다. 그리고'exec' *와 *'$()'를 사용하고 싶습니까? – Biffen

+0

시도'help ['... ...그것은 명령입니다. bash의 구문 요소가 아닙니다. – hek2mgl

답변

3

[] 문자가 bash에 의해 구문 분석되지 않습니다

#\bin\bash 
changed_files=$(git diff origin/master..master --name-only) 
export PATH=$PATH:pmd/bin 
while read each_file 
do 
     if[$each_file == *.java] 
     then 
       exec $(run.sh pmd -d $each_file -f text -R rulesets/internal/all-java.xml) 
     fi 
done<$changed_files 

출력 :

스크립트는 아래에 표시됩니다 [은 실제 명령이며 모든 명령을 공백으로 구분해야합니다 (닫는 경우 ][의 매개 변수이므로 공백으로 구분해야합니다). 따라서 앞에공백을 배치해야합니다. 대괄호 뒤에.

또한 좋은 측정을 위해 env 변수 주위에 따옴표를 추가했습니다.

또한 pmd 소스 코드 분석기를 실행하려고합니다. 출력은 텍스트 (또는 HTML 등) 보고서입니다. 너는 exec 텍스트 데이터를 읽을 수 없으므로 나는 그 exec도 제거했다.

#\bin\bash 
changed_files=$(git diff origin/master..master --name-only) 
export PATH=$PATH:pmd/bin 
while read each_file 
do 
     if [ "$each_file" == "*.java" ] 
     then 
       run.sh pmd -d $each_file -f text -R rulesets/internal/all-java.xml 
     fi 
done<$changed_files 

현재 진행중인 문제를 해결하는 데 더 많은 문제가 있지만 사용자의 질문에 대한 답이 있어야합니다.


#/bin/bash 
changed_files=$(git diff origin/master..master --name-only) 
export PATH=$PATH:pmd/bin 
while read each_file 
do 
    run.sh pmd -d $each_file -f text -R rulesets/internal/all-java.xml 
done<$changed_files 

나는 다시 수정했습니다. each_file이 아닌이 '* .java'가되는 git diff 명령의 결과로 제공됩니다. 그래서 나는 그것없이 모든 항목에 run.sh을 실행 시켰습니다.

또한 \bin\bash/bin/bash으로 변경했습니다.

run.sh은 (는) 제작 한 스크립트입니까? 또는 pmd/bin 폴더에 있습니까? 나는 run.sh를 넣을 필요가 없다고 생각하지만 확실하지 않습니다.

+2

(']'은 * 실제로 * 명령이 아닙니다.) – Biffen

+0

ok. 수정해 주셔서 감사합니다. 그럼 뭐야? (그래서 내 대답을 업데이트 할 수 있습니다) –

+2

그것은 테스트의 끝을 나타내는'['의 인수입니다. '['없이 실행하면 불평 할 것이다. – Biffen

관련 문제