Erro de syntax de Bash: final inesperado do arquivo

Perdoe-me por este é um script muito simples no Bash. Aqui está o código:

#!/bin/bash # june 2011 if [ $# -lt 3 -o $# -gt 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 

depois de executar sh file.sh:

erro de syntax: final inesperado do arquivo

Eu acho que file.sh é com terminadores de linha CRLF.

corre

 dos2unix file.sh 

então o problema será corrigido.

Você pode instalar o dos2unix no Ubuntu com isso:

 sudo apt-get install dos2unix 

Outra coisa para verificar (só aconteceu comigo):

  • encerrar corpos de funções de linha única com ponto e vírgula

Ou seja, este snippet aparentemente inocente causará o mesmo erro:

 die () { test -n "$@" && echo "$@"; exit 1 } 

Para fazer o parser mudo feliz:

 die () { test -n "$@" && echo "$@"; exit 1; } 

Eu também só tenho essa mensagem de erro usando a syntax errada em uma cláusula if

  • else if (erro de syntax: final inesperado do arquivo)
  • elif (syntax correta)

Eu depurei isso comentando os bits até que funcionou

uma cláusula fechada se => fi aumentará também

dica: use trap para depurar, se o seu script é enorme …

eg set -x trap read debug ...

no cygwin eu precisava: –

  export SHELLOPTS set -o igncr 

em .bash_profile. Desta forma não precisei rodar unix2dos

Então eu encontrei este post e as respostas não me ajudaram, mas eu fui capaz de descobrir por que isso me deu o erro. eu tive um

 cat > temp.txt < EOF some content EOF 

O problema foi que eu copiei o código acima para estar em uma function e, inadvertidamente, abordei o código. Precisa ter certeza de que o último EOF não é tabulado.

Consegui recortar e colar seu código em um arquivo e ele foi executado corretamente. Se você executar assim, deve funcionar:

Seu “arquivo.sh”:

 #!/bin/bash # june 2011 if [ $# -lt 3 -o $# -gt 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 

O comando:

 $ ./file.sh arg1 arg2 arg3 

Note que “file.sh” deve ser executável:

 $ chmod +x file.sh 

Você pode estar recebendo esse erro b / c de como você está fazendo a input (w / a pipe, cenoura, etc.). Você também pode tentar dividir a condição em dois:

 if [ $# -lt 3 ] || [ $# -gt 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 

Ou, como você está usando o bash , você pode usar a syntax interna:

 if [[ $# -lt 3 || $# -gt 3 ]]; then echo "Error... Usage: $0 host database username" exit 0 fi 

E, finalmente, você poderia apenas verificar se 3 argumentos foram dados (limpo, mantém a compatibilidade do shell POSIX):

 if [ $# -ne 3 ]; then echo "Error... Usage: $0 host database username" exit 0 fi 

Eu apenas copiei e colei seu exemplo em um arquivo; correu bem sob bash. Eu não vejo nenhum problema com isso.

Para uma boa medida, você pode querer garantir que ela termine com uma nova linha, embora bash não deva se importar. (Corre para mim tanto com e sem a nova linha final.)

Às vezes, você verá erros estranhos se tiver incorporado acidentalmente um caractere de controle no arquivo. Como é um script curto, tente criar um novo script colando-o em sua pergunta aqui no StackOverflow ou simplesmente digitando novamente.

Qual versão do bash você está usando? ( bash --version )

Boa sorte!

Certifique-se de que o nome do diretório no qual o arquivo .sh está presente não tenha um caractere de espaço. Por exemplo: diga se está em uma pasta chamada “Nova pasta”, você provavelmente encontrará o erro que citou. Em vez disso, nomeie-o como ‘New_Folder’. Eu espero que isso ajude.

Aparentemente, algumas versões do shell também podem emitir essa mensagem quando a última linha do script não possui uma nova linha.

Eu tenho essa resposta deste problema semelhante no StackOverflow

Abra o arquivo no Vim e tente

:set fileformat=unix

Converta eh terminações de linha para terminais unix e veja se isso resolve o problema. Se estiver editando no Vim, digite o comando: set fileformat = unix e salve o arquivo. Vários outros editores têm a capacidade de converter finais de linha, como o Notepad ++ ou Atom

Obrigado @lemongrassnginger

No Ubuntu:

 $ gedit ~/.profile 

Em seguida, File -> Save as e defina a end line para Unix/Linux

Eu tive o problema quando escrevi a declaração “if – fi” em uma linha:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

Escrever multilinha resolveu meu problema:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi