2010-02-15 13 views
364

tengo este script llamado test.sh:El comando no se encuentra el error en la asignación de variables Bash

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

cuando corro sh test.sh me sale esto:

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

¿Qué estoy haciendo mal? Observo en línea los tutoriales básicos de bash/principiantes bash scripting y así es como dicen declarar variables ... Así que no estoy seguro de lo que estoy haciendo mal.

Estoy en Ubuntu Server 9.10. Y sí, bash se encuentra en /bin/bash.

+21

Me alegro de que hayas hecho la pregunta, ¡no eres el único novato que hay! –

+3

Gracias por hacer esa pregunta. Esta no es una pregunta para avergonzarse. Estoy trabajando hasta tarde en la oficina y no hay un experto en Bash a mi alrededor para responder a esto. –

+1

En estos días (¡casi siete años después!) Hay un linter/analizador de FOSS llamado [shellcheck] (http://www.shellcheck.net) que detectará automáticamente este y otros problemas de sintaxis comunes. Puede usarse en línea o instalarse sin conexión e integrarse en su editor. –

Respuesta

704

No se puede tener espacios alrededor de su signo '='.

Cuando se escribe:

STR = "foo" 

bash intenta ejecutar un comando llamado STR con 2 argumentos (las cadenas '=' y 'foo')

Cuando se escribe:

STR =foo 

bash intenta ejecutar un comando llamado STR con 1 argumento (la cadena '= foo')

Cuando escribe ite:

STR= foo 

bash intenta ejecutar el comando foo con juego de RTS a la cadena vacía en su entorno.

no estoy seguro de si esto ayuda a aclarar o si es mera ofuscación, pero tenga en cuenta que:

  1. el primer comando es exactamente equivalente a: STR "=" "foo",
  2. el segundo es el mismo que STR "=foo",
  3. y el último es equivalente a STR="" foo.

La sección pertinente de los sh language spec, section 2.9.1 estados:

A "comando simple" es una secuencia de asignaciones de variables opcionales y redirecciones, en cualquier secuencia, seguido opcionalmente de palabras y redirecciones, terminada por un control operador.

En ese contexto, un word es el comando que bash se va a ejecutar. Cualquier cadena que contenga = (en cualquier posición que no sea al comienzo de la cadena) que no sea una redirección es una asignación variable, mientras que cualquier cadena que no sea una redirección y no contenga = es un comando. En STR = "foo", STR no es una asignación de variable.

+0

Si tiene una variable con un nombre que contiene "-", ocurre el mismo error. En ese caso, la solución es eliminar el "-" – chomp

+0

chomp @ En la regla 7b de la sección 2.10.10 de http://pubs.opengroup.org/onlinepubs/9699919799/ "Si todos los caracteres que preceden a '=' forman un nombre válido (ver Nombre de XBD), se devolverá el token ASIGNACIÓN_DE_LA_DE_DE_DE_DE_DE_TABRA ". Siguiendo el enlace a la sección 3.231 de http://pubs.opengroup.org/onlinepubs/9699919799/, encontramos "En el lenguaje de comandos del shell, una palabra que consiste únicamente en guiones bajos, dígitos y alfabéticos del conjunto de caracteres portátil. el carácter de un nombre no es un dígito ". Entonces la palabra 'FOO-BAR = qux' no es una asignación de variable ya que' FOO-BAR' no es un nombre válido. –

+1

Ofrezco una recompensa para recompensar esta explicación clara a un problema siempre común para principiantes (bueno, y también para poder encontrarlo más rápido cuando quiero vincularlo: D). ¡Gracias por facilitar las cosas! – fedorqui

130

Caída de los espacios alrededor del signo =:

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

Esto es divertido , sin embargo, como 'set foo = bar' es un error común en los archivos por lotes de Windows también, y allí el lenguaje del lote es ridiculizado ;-) – Joey

+0

Gracias @joey. Me quedé atrapado en escribir un guión de shell donde estaba inicializando variables con espacios después de "=". Salvaste mi día –

+0

¿Por qué bash no acepta números en el campo de la izquierda? como 3 = "Hola mundo", se queja de que no se encontró el comando – Freedo

5

En el modo interactivo todo se ve bien

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

Obviamente! como dijo Johannes, no hay espacio alrededor de '='. En caso de que haya ningún espacio alrededor '=', entonces en el modo interactivo que da errores como `

Sin comando 'str' encontró

+1

Pero tenga en cuenta que el OP decía 'STR =" Hello World "', por lo que esta respuesta no se aplica aquí. – fedorqui

+0

@Arkapravo ¿cuál es el significado del modo interactivo? ¿Tiene algo que ver con la marca '$' –

+0

@KasunSiyambalapitiya por "modo interactivo", significa escribir esos comandos en el terminal actual, no en un script. – numbermaniac

1

Al definir cualquier variable, entonces no tiene que poner en cualquier espacio extra

E.g.

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

Así quitar espacios:

name="Stack Overflow" 

y funcionará bien.

Cuestiones relacionadas