Eu tenho este script para verificar git status
todos os meus repositórios:
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
Mas não está funcionando. Se eu remover o segundo else-block
, então funciona.
Basicamente eu quero saber se um repositório git tem alguma alteração (primeiro if) ou se está à frente do master (segundo if).
Como devo alterar essa segunda condição if?
A instrução Bash
if...else if...else
tem a seguinte forma:O erro específico em seu script é o uso da palavra-chave incorreta
else if
em vez da corretaelif
.Se CONDITION1 for avaliado como True, o STATEMENTS1 será executado. Se CONDITION2 for avaliado como True, o STATEMENTS2 será executado. Se nenhum dos comandos de teste for avaliado como True, a CONDITION3 será executada.
As condições são avaliadas sequencialmente. Uma vez que uma condição retorna True, as condições restantes não são executadas e o controle do programa se move para o final das instruções if.
Você pode ter uma ou mais cláusulas elif na instrução.
Sugestão: você pode instalar
shellcheck
o pacote para verificar seu código bash. Consulte https://github.com/koalaman/shellcheck para referência.Tente substituir
com
Você também pode querer adicionar
-q
ao grep.Isso funciona substituindo o
[[
teste por um comando nu. O último comando no pipeline (grep
) sai com um valor true ou false, dependendo se encontrou alguma coisa ou não. A-q
opção diz para ele retornar apenas com esse valor e não imprimir o que encontrou.Nota: existem outros erros em seu script que também precisam ser corrigidos.