Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 错误:在while循环中使用if_Bash - Fatal编程技术网

Bash 错误:在while循环中使用if

Bash 错误:在while循环中使用if,bash,Bash,我编写了一个脚本,它读取多行文件名,脚本从中逐个提取文件,如果文件名以Java结尾,则对代码执行pmd检查。这就是它的写作理念。但是,当执行下面的脚本并且它指向的行是while中使用的if构造的一部分时,会抛出一个错误 $git diff origin/master..master-name只返回HelloWorld.java。是的,我知道我可能需要传递搜索位置,并将其附加到脚本中的$each_文件中 但我主要想知道这个脚本返回错误的原因,如下所示。是否由于模式匹配代码(即if块)而导致错误 脚

我编写了一个脚本,它读取多行文件名,脚本从中逐个提取文件,如果文件名以Java结尾,则对代码执行pmd检查。这就是它的写作理念。但是,当执行下面的脚本并且它指向的行是while中使用的if构造的一部分时,会抛出一个错误

$git diff origin/master..master-name只返回HelloWorld.java。是的,我知道我可能需要传递搜索位置,并将其附加到脚本中的$each_文件中

但我主要想知道这个脚本返回错误的原因,如下所示。是否由于模式匹配代码(即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
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