Seu script usa o valor de $rc1 como um nome de arquivo, mas esta é a saída de grep .
Para alimentar a saída do primeiro grep em outro grep , use um canal:
grep -v ... filename | grep ...
Em vez de salvar o resultado de grep em variáveis (que podem ser bastante grandes), deixe o teste if agir diretamente sobre o resultado da execução desse pipeline:
if grep -v -F 'Msg 2714' "$Logfilename" | grep -q -F Msg; then
echo 'Error message, some query has failed' >&2
exit 1
fi
Isso usa o status de saída do pipeline (que será o status de saída de grep -q ) para determinar se o script deve exibir a mensagem de erro e sair. Nenhum dado precisa ser armazenado em variáveis.
grep -q não produzirá nada, mas sairá com sucesso se o padrão fornecido corresponder. Também usei -F com as invocações de grep , já que estamos combinando strings, não expressões regulares.
Também estou seguindo a diretriz geral de que as mensagens de erro são geradas no fluxo de erros padrão (com echo ... >&2 neste caso) e que o script terminará com um status de saída diferente de zero quando ocorrer um erro fatal.
Também possivelmente relevante, em relação à sua não-cotação de expansões variáveis: