Minha pergunta é por que o bash não reporta a linha 2, onde parei o " final de propósito, para ver como ele reporta isso de volta.
Eu executo um script bash e recebo este erro: ./test: linha 4: EOF inesperado ao procurar por `"' correspondente
#!/usr/bin/bash
echo "this is life
echo "now is the time"
echo "have we reached the end"
Porque essa linha não contém um erro, pois é perfeitamente legal incluir um caractere de nova linha em uma string entre aspas.
Na verdade, qualquer caractere (exceto um "sem escape"
"
, que marca o início/fim de uma string entre aspas) poderia ser incluído em uma string entre aspas se, de alguma forma, fosse "colocado" depois de um"
caractere; um caractere de nova linha é facilmente digitado (como, por exemplo, qualquer caractere alfabético "comum") e, notavelmente, não é nem mesmo a coisa mais exótica que você poderia incluir em uma string entre aspas 1 .Sugiro que você abandone a mentalidade de que uma string pode conter apenas letras, números e pontuação, pois não é bem assim, e estar ciente disso ajuda muito no uso da linha de comando/script.
De qualquer forma, indo direto ao ponto, aqui está uma análise do que acontece e por que você está sendo notificado de um erro apenas na linha 4:
"
caractere; ele começa a interpretar o que vem depois como uma string e, quando tropeça no caractere de nova linha (como discutido acima, legal), ele o engole alegremente e começa a analisar a linha nº 3 como uma continuação da string que até então inclui o que veio depois do"
caractere, o que inclui a nova linha;"
caractere; a primeira string agora está correta e completamente analisada. Ele então analisa o restante da linha como uma string (legal) sem aspas até que o próximo"
caractere seja encontrado, quando o ciclo se repete: ele tropeça no caractere de nova linha (novamente, como discutido acima, legal), ele o engole alegremente e começa a analisar a linha #4 como uma continuação da string que até então inclui apenas a nova linha;"
caractere; a segunda string agora está correta e completamente analisada. Ele então analisa o restante da linha como uma string (legal) sem aspas até que o próximo"
caractere seja encontrado, quando o ciclo quebra; ele tropeça no caractere de nova linha (novamente, como discutido acima, legal), ele o engole alegremente e... não há mais nada para analisar / EOF (End-Of-File) foi alcançado. Como EOF foi alcançado, a última análise"
definitivamente não tem aspas de fechamento correspondentes - daí o errounexpected EOF while looking for matching `"'
ser lançadoNa verdade, por exemplo, qualquer outro caractere não imprimível (intervalo ASCII de 0 a 31 - e não apenas esses) também poderia ser incluído em uma string se fosse colado após um caractere `"`. Eles não são realmente diferentes de quebras de linha - são todos caracteres não imprimíveis - acontece que as quebras de linha podem ser simplesmente digitadas. Outra exceção aos caracteres não imprimíveis é o caractere de tabulação, que, assim como o caractere de quebra de linha, também pode ser simplesmente digitado.