Esse erro pode ser difícil de acompanhar em situações reais. Aqui eu forneço uma solução para a situação do mundo real. Vou usar meu script como exemplo.
Atualizei meu script de shell. Ao executá-lo, recebi a seguinte mensagem de erro:
/somepath/bin/myshellscript: line 1508: unexpected EOF while looking for matching '"'
/somepath/bin/myshellscript: line 1520: syntax error: unexpected end of file
line 1508 elif [ "$project" ]; then
Esta é a última linha que tem um par de aspas duplas.
Normalmente, eu verifico meu shell script toda vez que eu modifico. Desta vez, esperei um dia e esqueci onde fiz a modificação. O problema aconteceu em qualquer lugar antes desta linha (1508). O problema é que até eu comentei a linha 1508
#elif [ "$project" ]; then
o carrasco ainda diz que a linha 1508 tem problemas.
Em seguida, fiz uma cópia do script de shell original. Excluindo um monte de código da parte inferior. Então valide meu código com o seguinte comando
bash -n mysbashscript
mybashscript: line 515: unexpected EOF while looking for matching '"'
mybashscript: line 561: syntax error: unexpected end of file
Agora meu arquivo é 1/3 do tamanho original. Eu imediatamente vi o problema:
497 prepare_alignment() {
498 local projdir=${1:?"did not give project directory"}
499 local samp=${2:?"did not give sample name"}
500 local merged=${3:?"must give merged bam file name} # here is the problem
Por algum motivo, o "dentro {} não correspondido não é capturado pelo analisador de shell. É onde o analisador de shell pode ser melhorado ainda mais.
O algoritmo mais rápido para encontrar o problema, é excluir metade do seu código da parte inferior, se o erro de sintaxe desaparecer, então é nessa metade. Se o erro de sintaxe ainda estiver lá, o problema estará na metade superior.
Se o problema ocorrer na segunda metade, desfaça a exclusão. Repita este processo. Você pode diminuir para um tamanho menor para encontrar a origem do problema.
Ao excluir o código, você precisa excluir uma seção inteira do código. Por exemplo, toda a função.
Você pode usar bash -n scriptname ou apenas executar diretamente o script. Ambos devem funcionar.