bash: erro de sintaxe próximo ao token inesperado '}'

2

Eu tentei usar isso:

$ if [$a == 1] then { echo 'yes'; } fi;

mas recebo um erro:

-bash: syntax error near unexpected token '}'

Qual é o formato correto? Eu tentei vários sem sorte.

    
por Michael Durrant 30.09.2013 / 06:11

2 respostas

5

[ é apenas outro caractere, de acordo com bash; não é auto-delimitado. Então você precisa colocar espaços em torno de [ e ] . Embora seja melhor usar [[ e ]] .

E o comando seguinte if (sim, [ é um comando) deve ser terminado com um ; ou uma nova linha.

Finalmente, == (que não é posix, FWIW; posix prefere = ) é igualdade de string, não igualdade numérica.

Então você pode ter querido dizer:

if [[ $a -eq 1 ]]; then echo yes; fi

Mas você poderia usar a avaliação aritmética:

if ((a == 1)); then echo yes; fi

(Na avaliação aritmética, a igualdade é == e você não precisa de $ antes dos nomes das variáveis. Eu sei que é confuso.)

Para mais informações sobre [ : help test . Sobre [[ : help [[ (que se baseia em test ). Sobre (( : help let . Sobre bash : man bash

    
por 30.09.2013 / 06:21
2

[ é um comando no Bash, assim como qualquer outro comando, como if , while , etc. Você pode ver isso se verificar novamente a página man:

$ man [
NAME
       bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, .....

Você também pode dizer que é um comando real com este exemplo:

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

O primeiro resultado é a versão incorporada de [ que faz parte do Bash. A segunda é a versão de [ incluída nos coreutils GNU.

No Fedora você pode ver do que o RPM faz parte:

$ rpm -qf /usr/bin/[
coreutils-8.5-7.fc14.x86_64

Dado isso, você precisa ter certeza de que existem espaços em torno de qualquer comando para que eles sejam analisados corretamente.

Fazendo isso:

$ if [$a == 1] ...

Seria idêntico a isto:

$ lsblah
bash: lsblah: command not found...

O comando ls não pode ser analisado corretamente porque não é armazenado em buffer com espaços para que seja analisável.

    
por 30.09.2013 / 07:34

Tags