2014-09-23 4 views
-3

Я написал сценарий, который читает несколько строк имен файлов, из которых сценарий берет файл один за другим, и если имя файла заканчивается Java, то выполняется проверка pmd по коду. Это была идея, с которой она была написана. Но возникает ошибка при выполнении сценария ниже, и строка, на которую он указывает, равна then, которая является частью конструкции if, используемой в пределах while.Ошибка: использование в цикле while

$git diff origin/master..master --name-onlyHelloWorld.java. И да, я знаю, что мне, возможно, придется передать места для поиска и добавить это в $each_file в сценарий.

Но в основном я хочу решить, почему этот скрипт возвращает ошибку, как показано ниже. Является ли ошибка результатом из-за кода соответствия шаблону i.e блоку if?

Сценарий в целом должен запускать проверку на каждый измененный файл в репозитории pmd. Если это поможет вам ответить на мой вопрос.

Сценарий отображается ниже:

#\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 

Выход:

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

вы пропустили пробел после 'if' – hek2mgl

+3

... и после' ['и before'] '. И ваш shebang сломан. И вы уверены, что хотите использовать 'exec' * и *' $() '? – Biffen

+0

попробуйте 'help [' ...это команда, а не элемент синтаксиса в bash – hek2mgl

ответ

3

в [ и ] символы не разобран баш, как вы ожидаете; [ - это действительная команда, и все команды должны быть разделены пробелами (и закрытие ] является параметром [, поэтому его также нужно разделять пробелами). Поэтому вам необходимо разместить пробелы до и после скобки.

Я также добавил цитаты вокруг переменной 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 приходит только в результате команды git diff, которая будет никогда be '* .java'. Таким образом, у меня он запустил run.sh на каждый элемент, если он вообще отсутствует.

Также, \bin\bash был изменен на /bin/bash.

Является ли run.sh сценарий, который вы создали? или это в папке pmd/bin? Я предполагаю, что вам не нужно ставить run.sh, но я не уверен.

+2

(']' не * действительно * команда.) – Biffen

+0

ok. Спасибо за исправление. Что тогда? (так что я могу обновить свой ответ) –

+2

Это просто аргумент '[', который отмечает конец теста. Если вы запустите '[' без него, он будет жаловаться. – Biffen

Смежные вопросы