No puede tener espacios alrededor de su signo '='.
Cuando escribes:
STR = "foo"
bash intenta ejecutar un comando llamado STR con 2 argumentos (las cadenas '=' y 'foo')
Cuando escribes:
STR =foo
bash intenta ejecutar un comando llamado STR con 1 argumento (la cadena '= foo')
Cuando escribes:
STR= foo
bash intenta ejecutar el comando foo con STR establecido en la cadena vacía en su entorno.
No estoy seguro de si esto ayuda a aclarar o si es una simple ofuscación, pero tenga en cuenta que:
- el primer comando es exactamente equivalente a:
STR "=" "foo"
,
- el segundo es el mismo que
STR "=foo"
,
- y el último es equivalente 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 y redirecciones de variables opcionales, en cualquier secuencia, opcionalmente seguida de palabras y redirecciones, terminadas por un operador de control.
En ese contexto, a word
es el comando que bash va a ejecutar. Cualquier cadena que contenga =
(en cualquier posición que no sea al principio 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 variable.