我有这个脚本来检查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
选项告诉它只返回该值,而不是实际打印它发现的内容。
注意:您的脚本中还有其他错误也需要修复。