Esta não é uma tarefa fácil. Você já identificou várias das dificuldades. A análise baseada em texto é muito propensa a erros, muito fácil de contornar (se alguém quiser) e quase garantida de estar incompleta.
O Bash tem uma função interna 'set' que analisa o script sem realmente executá-lo. Isso pode ajudá-lo, mas mesmo isso será limitado.
[set] -n Read commands but do not execute them. This may be used
to check a shell script for syntax errors. This is
ignored by interactive shells.
Para testá-lo em um script, basta adicionar set -n
no início do script e executá-lo.
strace
será muito útil, mas exige que o script seja realmente executado, o que é algo que você quer fazer depois de ter certeza de que o script está seguro.