Bash 错误:在while循环中使用if
我编写了一个脚本,它读取多行文件名,脚本从中逐个提取文件,如果文件名以Java结尾,则对代码执行pmd检查。这就是它的写作理念。但是,当执行下面的脚本并且它指向的行是while中使用的if构造的一部分时,会抛出一个错误 $git diff origin/master..master-name只返回HelloWorld.java。是的,我知道我可能需要传递搜索位置,并将其附加到脚本中的$each_文件中 但我主要想知道这个脚本返回错误的原因,如下所示。是否由于模式匹配代码(即if块)而导致错误 脚本作为一个整体应该对存储库中的每个更改的文件运行pmd检查。如果这有助于你回答我的问题 脚本显示在下面:Bash 错误:在while循环中使用if,bash,Bash,我编写了一个脚本,它读取多行文件名,脚本从中逐个提取文件,如果文件名以Java结尾,则对代码执行pmd检查。这就是它的写作理念。但是,当执行下面的脚本并且它指向的行是while中使用的if构造的一部分时,会抛出一个错误 $git diff origin/master..master-name只返回HelloWorld.java。是的,我知道我可能需要传递搜索位置,并将其附加到脚本中的$each_文件中 但我主要想知道这个脚本返回错误的原因,如下所示。是否由于模式匹配代码(即if块)而导致错误 脚
#\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
bash没有像您预期的那样解析[和]字符;[是一个实际的命令,所有命令都需要用空格分隔,并且结束符]是[,所以它也需要用空格分隔。因此,您需要在括号之前和之后放置空格
为了更好地度量,我还在env变量周围添加了引号
此外,您似乎希望运行pmd源代码分析器。它的输出将是文本或html等报告。您无法执行文本数据,因此我也删除了该执行
#\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
目前还有更多的问题需要解决,但这应该能回答你的问题
我再次修改了它。每个_文件都是git diff命令的结果,它永远不会是“*.java”。所以我让它在没有if的情况下对每个项目运行run.sh
此外,\bin\bash被更改为/bin/bash
run.sh是您编写的脚本吗?还是在pmd/bin文件夹中?我猜您不需要将run.sh放在那里,但我不确定。在if…和[and before]之后,您遗漏了一个空格。并且您的shebang已损坏。您确定要使用exec和$?请尝试“帮助”[…它是一个命令,而不是中的语法元素bash@dennis哦,那不是正则表达式,[看起来不太正确,请看,]的参数,也许你应该使用[[相反。我推荐man 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
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