Error de comando no encontrado en la asignación de variables de Bash

Resuelto Jake Wilson asked hace 14 años • 6 respuestas

Tengo este script llamado test.sh:

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

cuando ejecuto sh test.shme sale esto:

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

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

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

Jake Wilson avatar Feb 16 '10 01:02 Jake Wilson
Aceptado

No puede haber espacios alrededor del =letrero.

Cuando escribes:

STR = "foo"

bash intenta ejecutar un comando nombrado STRcon 2 argumentos (las cadenas =y foo)

Cuando escribes:

STR =foo

bash intenta ejecutar un comando nombrado STRcon 1 argumento (la cadena =foo)

Cuando escribes:

STR= foo

bash intenta ejecutar el comando foocon STR configurado en 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 equivale a STR="" foo.

La sección relevante de la especificación del lenguaje sh, sección 2.9.1, establece:

Un "comando simple" es una secuencia de asignaciones de variables y redirecciones opcionales, en cualquier secuencia, seguidas opcionalmente de palabras y redirecciones, terminadas por un operador de control.

En ese contexto, a wordes el comando que ejecutará bash. Cualquier cadena que contenga =(en cualquier posición que no sea al principio de la cadena) que no sea una redirección y en la que la parte de la cadena antes de sea =un nombre de variable válido es una asignación de variable, mientras que cualquier cadena que no sea una redirección o una asignación de variable es un comando. En STR = "foo", STRno es una asignación de variable.

William Pursell avatar Feb 15 '2010 18:02 William Pursell

Suelta los espacios alrededor del =letrero:

#!/bin/bash 
STR="Hello World" 
echo $STR 
Joey avatar Feb 15 '2010 18:02 Joey

En el modo interactivo todo se ve bien:

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

Obviamente (!), como dijo Johannes, no hay espacio alrededor =. En caso de que haya algún espacio alrededor =, en el modo interactivo se muestran errores como

No se encontró ningún comando 'str'

Arkapravo avatar Feb 26 '2010 06:02 Arkapravo

Sé que esto ha sido respondido con una respuesta de muy alta calidad. Pero, en definitiva, no se pueden tener espacios.

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

No funcionó debido a los espacios alrededor del signo igual. Si tuvieras que correr...

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

funcionaria

Derek Haber avatar Mar 27 '2019 12:03 Derek Haber