Expansión variable en Bash

Expansión variable en Bash

Probé los siguientes comandos

variable='one|name'
echo $variable

La salida es

one|name

mientras que echo one|nameda un error No command 'name' found. Esto es razonable porque bash lo trata |como una tubería e intenta ejecutar el comando namecomo oneentrada.

Pero ¿por qué se echo $variableimprime one|name? Después de la expansión de parámetros y variables, ¿no debería ser equivalente a echo one|name?

Versión:

GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)

Respuesta1

No, no debería, por la forma en quebash operar el comando.

Cuando escribe echo one|name, bashanaliza el comando, lo trata |como un token de canalización, por lo que |realiza la canalización.

Cuando escribe echo $variable, debido a que el análisis del token ocurre antes de la expansión de la variable, bashel análisis del comando en dos partes echoy $variable. Después de eso, realiza una expansión variable, expandiéndose $variablea one|name. En este caso, one|namees una cadena, |es parte de una cadena y no puede tratarse como un token de canalización (por supuesto,la frase de reconocimiento simbólicoestaba hecho). Lo único que puede ser especial si IFSla variable contiene |, bashse usará |como delimitador para realizar la división de campos:

$ variable='one|name'
$ IFS='|'
$ echo $variable
one name

Respuesta2

La razón es por la forma en que Bashse expande la variable.

En lugar de expandir la variable a, one|nameexpande la variable a "one|name". Así que aquí, como el valor está entre comillas, se trata como una cadena en lugar de un comando.

A continuación se muestra el straceresultado del comando que muestra cómo se expande el comando.

$ variable='one|name'
$ strace echo $variable 
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0)                                  = 0x9cc7000

Respuesta3

Las comillas son parte de la cadena que creaste.

Si lo hiciste

variable=one|name
echo $variable

el resultado sería el esperado. Pero sólo puedes hacer esto en un script (gracias por el útil comentario).

información relacionada