Expansão variável no Bash

Expansão variável no Bash

Eu tentei os seguintes comandos

variable='one|name'
echo $variable

A saída é

one|name

enquanto echo one|namedá um erro No command 'name' found. Isso é razoável porque o bash trata |como um canal e tenta executar o comando namecomo oneentrada.

Mas por que echo $variableimprimir one|name? Após a expansão de parâmetros e variáveis, não deveria ser equivalente a echo one|name?

Versão:

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

Responder1

Não, não deveria, por causa do jeitobash operar o comando.

Quando você digita echo one|name, bashanalisa o comando, trata |como um token de pipe, então |execute o pipeline.

Quando você digita echo $variable, porque a análise do token ocorre antes da expansão da variável, basha análise do comando em duas partes echoe $variable. Depois disso, realiza a expansão variável, expanda $variablepara one|name. Nesse caso, one|nameé uma string, |faz parte da string e não pode ser tratado como um token de pipe (é claro,a frase de reconhecimento de tokenfoi feito). A única coisa que pode ser especial se IFSa variável contiver |, bashserá usada |como delimitador para realizar a divisão do campo:

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

Responder2

O motivo é a forma como Basha variável se expande.

Em vez de expandir a variável para one|nameele expande a variável para "one|name". Portanto, aqui, como o valor está entre aspas, eles são tratados como string em vez de um comando.

Abaixo está a stracesaída do comando que mostra como o comando é expandido.

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

Responder3

As aspas fazem parte da string que você criou.

Se você fez

variable=one|name
echo $variable

o resultado seria o esperado. Mas você só pode fazer isso em um script (obrigado pelo comentário útil).

informação relacionada