Respostas:
Acho que file.sh está com terminadores de linha CRLF.
corre
dos2unix file.sh
então o problema será corrigido.
Você pode instalar o dos2unix no ubuntu com este:
sudo apt-get install dos2unix
Outra coisa a verificar (apenas me ocorreu):
Ou seja, este snippet de aparência inocente causará o mesmo erro:
die () { test -n "$@" && echo "$@"; exit 1 }
Para deixar o analisador burro feliz:
die () { test -n "$@" && echo "$@"; exit 1; }
;
é que se espera que a instrução Every termine com, de ;
modo que no final, por exemplo: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
irá produzir aquele erro, enquanto if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
que não ... observe os pequenos pontos-e-vírgulas no final, ou seja: após .bash
e fi
.
zsh
usuário. O ex funciona em zsh
mas não no sh
nem bash
. Queria ser 4 pessoas para poder dar 4 votos positivos
Também acabei de receber esta mensagem de erro ao usar a sintaxe errada em uma if
cláusula
else if
(erro de sintaxe: fim de arquivo inesperado) elif
(sintaxe correta)eu depurei comentando bits até que funcionou
uma cláusula não fechada if => fi também aumentará isso
dica: use trap para depurar, se seu script for enorme ...
por exemplo
set -x
trap read debug
unexpected end of file
erro ocorrerá assim que fi
for atingido.
Eu obtive essa resposta com este problema semelhante no StackOverflow
Abra o arquivo no Vim e tente
:set fileformat=unix
Converta as terminações de linha em terminações 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 Notepad ++ ou Atom
Obrigado @lemongrassnginger
dos2unix
que a resposta aceita aconselha.
Então eu encontrei este post e as respostas não me ajudaram, mas eu consegui descobrir porque ele me deu o erro. eu tive um
cat > temp.txt < EOF
some content
EOF
O problema era que copiei o código acima para estar em uma função e, inadvertidamente, tabulei o código. É necessário certificar-se de que o último EOF não seja tabulado.
EOF
recuado quatro espaços e o bash não o analisou por causa disso. Remover espaços corrigiu o problema.
Isso estava acontecendo comigo quando eu estava tentando chamar uma função usando parênteses, por exemplo
run() {
echo hello
}
run()
deveria estar:
run() {
echo hello
}
run
PARA WINDOWS:
No meu caso, estava trabalhando no sistema operacional Windows e recebi o mesmo erro ao executar o autoconf.
Então eu converti o arquivo com conversão EOL para Windows (CR LF) da seguinte maneira:
EDITAR -> CONVERSÃO EOL -> WINDOWS (CR LF)
Consegui recortar e colar seu código em um arquivo e ele funcionou corretamente. Se você executá-lo assim, ele deve funcionar:
Seu "file.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
Observe que "file.sh" deve ser executável:
$ chmod +x file.sh
Você pode estar recebendo esse erro por causa de como está fazendo a entrada (com um cano, cenoura, etc.). Você também pode tentar dividir a condição em duas:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Ou, já que está usando bash
, você pode usar a sintaxe integrada:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
E, finalmente, você pode, é claro, apenas verificar se 3 argumentos foram fornecidos (limpar, mantém a compatibilidade do shell POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Acabei de recortar e colar seu exemplo em um arquivo; funcionou bem no bash. Eu não vejo nenhum problema com isso.
Para uma boa medida, você pode querer garantir que termine com uma nova linha, embora o bash não deva se importar. (Funciona para mim com e sem a nova linha final.)
Às vezes, você verá erros estranhos se incorporar acidentalmente um caractere de controle ao arquivo. Como é um script curto, tente criar um novo script colando-o de sua pergunta aqui no StackOverflow ou simplesmente digitando-o 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: digamos que se estiver em uma pasta chamada 'Nova pasta', você certamente encontrará o erro que citou. Em vez disso, apenas nomeie como 'New_Folder'. Eu espero que isso ajude.
Eu sei que estou muito atrasado para a festa. Espero que isso possa ajudar alguém.
Verifique seu arquivo .bashrc. Talvez renomeie ou mova.
Discussão aqui: Não é possível obter um script bash simples
A falta de uma chave de fechamento em uma definição de função causará esse erro, como acabei de descobrir.
function whoIsAnIidiot() {
echo "you are for forgetting the closing brace just below this line !"
Que claro que deveria ser assim ...
function whoIsAnIidiot() {
echo "not you for sure"
}
No meu caso, há redundância \
no seguinte:
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}
Há não um \
, no final deDATA.PATH_PREFIX ./afs/kinetics400