Uma abordagem de baixa tecnologia é
tr -cd "'\n" < run_me.sh | awk 'length%2==1 {print NR, $0}'
O tr exclui todos os caracteres, exceto as aspas simples e as novas linhas,
e o awk identifica as linhas que possuem números ímpares de caracteres
(isto é, cotações não correspondentes).
Confira-os individualmente;
Observe que as strings válidas, como "That's not a bug!" , serão sinalizadas.
Se isso não destacar o problema, tente novamente com '"\n'
(para encontrar aspas duplas não correspondentes).
Em seguida, expanda o tr para permitir () , {} e, finalmente, {}
para passar. Neste ponto,
a inspeção manual da produção se torna uma busca menos proveitosa;
enquanto ( e ) são geralmente correspondidos na mesma linha,
e citações e colchetes quase sempre são,
isso não é verdade de { e } .
Se você reduziu o problema a uma incompatibilidade de chaves,
e, especialmente, se você restringiu um intervalo no arquivo, vá para o Plano B.
Abra o arquivo em vim (ou vi ).
Vá para um caractere { que você acredita ser antes do erro e digite % .
Se o cursor pular para o }
que você acha que corresponde ao { que você começou,
avance para o próximo { e repita.
Se ele pular para um } que não corresponde ao { iniciado,
o erro ocorre entre essas duas chaves.
Se não se move,
o erro ocorre entre a sua localização atual e o final do arquivo.
Zoom in.
Essa abordagem pode ser um pouco mais adequada para arquivos de programa em linguagens como C, C ++ e Java (se seus compiladores não fizerem um bom trabalho), mas deve funcionar muito bem para scripts de shell.