我的管道在 if 语句中不起作用

我的管道在 if 语句中不起作用

我有这个脚本来检查git status我的所有存储库:


find / -type d -name .git 2>&- | 
while read gitFolder; do
    if [[ $gitFolder == *"/Temp/"* ]]; then
        continue;
    fi
    if [[ $gitFolder == *"/Trash/"* ]]; then
        continue;
    fi
    if [[ $gitFolder == *"/opt/"* ]]; then
        continue;
    fi
    parent=$(dirname $gitFolder);
    if [[ `git -C $parent status --porcelain` ]]; then
        echo "";
        echo $parent;
        git -C $parent status --porcelain
    else if [[ $(git -C $parent status | grep ahead) ]]; then
        echo "";
        echo "$parent is not pushed yet";
    fi
done 

但它不起作用。如果我删除第二个,else-block它就可以正常工作。

基本上,我想知道 git 存储库是否有任何更改(第一个 if)或者它是否领先于 master(第二个 if)。

我应该如何改变第二个 if 条件?

答案1

Bashif...else if...else语句采用以下形式:

if CONDITION1; then
  STATEMENTS1
elif CONDITION1; then
  STATEMENTS2
else
  STATEMENTS3
fi

脚本中的具体错误是使用了错误的关键字else if而不是正确的关键字elif

如果 CONDITION1 的计算结果为 True,则执行 STATEMENTS1。如果 CONDITION2 的计算结果为 True,则执行 STATEMENTS2。如果所有测试命令的计算结果均不为 True,则执行 CONDITION3。

条件按顺序进行评估。一旦一个条件返回 True,则不会执行其余条件,并且程序控制将移至 if 语句的末尾。

语句中可以有一个或多个 elif 子句。

建议:你可以安装shellcheck软件包来检查你的 bash 代码。请参阅https://github.com/koalaman/shellcheck以供参考。

答案2

尝试更换

    else if [[ $(git -C $parent status | grep ahead) ]]; then

    else if git -C $parent status | grep ahead; then

您可能还想添加-q到 grep。

这可以通过[[用裸命令替换测试来实现。管道中的最后一个命令 ( grep) 以 true 或 false 值退出,具体取决于它是否发现任何内容。该-q选项告诉它只返回该值,而不是实际打印它发现的内容。

注意:您的脚本中还有其他错误也需要修复。

相关内容