Comando não encontrado erro na atribuição de variável Bash

Eu tenho esse script chamado test.sh:

#!/bin/bash STR = "Hello World" echo $STR 

quando eu corro sh test.sh eu recebo isso:

 test.sh: line 2: STR: command not found 

O que estou fazendo de errado? Eu olho para os tutoriais de script bash extremamente básicos / iniciantes e é assim que eles dizem para declarar variables ​​… Então, eu não tenho certeza do que estou fazendo de errado.

Eu estou no Ubuntu Server 9.10. E sim, o bash está localizado em /bin/bash .

Você não pode ter espaços ao redor do seu sinal ‘=’.

Quando você escreve:

 STR = "foo" 

O bash tenta executar um comando chamado STR com 2 argumentos (as strings ‘=’ e ‘foo’)

Quando você escreve:

 STR =foo 

O bash tenta executar um comando chamado STR com 1 argumento (a string ‘= foo’)

Quando você escreve:

 STR= foo 

O bash tenta executar o comando foo com o STR configurado para a string vazia em seu ambiente.

Não tenho certeza se isso ajuda a esclarecer ou se é mera ofuscação, mas note que:

  1. o primeiro comando é exatamente equivalente a: STR "=" "foo" ,
  2. o segundo é o mesmo que STR "=foo" ,
  3. e o último é equivalente a STR="" foo .

A seção relevante da especificação da linguagem sh, seção 2.9.1, afirma:

Um “comando simples” é uma sequência de atribuições de variables ​​opcionais e redirecionamentos, em qualquer sequência, opcionalmente seguida de palavras e redirecionamentos, finalizada por um operador de controle.

Nesse contexto, uma word é o comando que o bash vai executar. Qualquer string contendo = (em qualquer posição diferente do início da string) que não seja um redirecionamento é uma atribuição de variável, enquanto qualquer string que não seja um redirecionamento e não contenha = é um comando. Em STR = "foo" , STR não é uma atribuição variável.

Solte os espaços ao redor do sinal =

 #!/bin/bash STR="Hello World" echo $STR 

No modo interativo tudo parece bem

 $ str="Hello World" $ echo $str Hello World 

Obviamente ! como Johannes disse, não há espaço em torno de ‘=’. No caso de haver algum espaço em torno de ‘=’, então no modo interativo isso dá erros como ‘

Nenhum comando ‘str’ encontrado

Quando você define qualquer variável, você não precisa colocar nenhum espaço extra.

Por exemplo

 name = "Stack Overflow" // it is not valid, you will get an error saying- "Command not found" 

Então, remova espaços:

 name="Stack Overflow" 

e vai funcionar bem.