Qual é a diferença entre expandir uma variável e imprimi-la (como em echo ou printf)?

1

Qual é a diferença entre expandir uma variável e imprimi-la (como acontece com echo ou printf )?

Se eu entendi corretamente, imprimir uma variável (seu valor) é apenas um exemplo de expansão dela. Talvez substituição seu valor também é um exemplo.

Atualizar

Por favor, dê uma breve definição do termo "expansão de variáveis" em suas próprias palavras , antes de explicar a diferença.

    
por Arcticooling 10.11.2017 / 06:45

4 respostas

6

Expandir e imprimir são duas ações diferentes. Expansão abrange um número de fases no processamento de um comando pelo shell : no Bash , expansão de chave ( {1..5} se torna 1 2 3 4 5 ), expansão de til ( ~user se torna /home/user conforme apropriado), expansão de parâmetro de shell ( ${variable} é substituído pelo valor da variável), substituição de comando, expansão aritmética substituição de processos, divisão de palavras e expansão de nomes de arquivos. (Veja também Expansão das palavras POSIX .)

Uma possível explicação para o uso do termo expansão para todos estes é que eles podem resultar no comando expandindo, tornando-se mais longo (o que é uma preocupação particular ao desenvolver um shell em C). .

No seu caso, a expansão é a expansão de parâmetros:

echo "${variable}"

torna-se

echo "value"

depois do que você se refere como substituição de variável, então

echo value

após a remoção da cotação (simplificando um pouco) e echo faz a impressão. Acontece que echo e printf são internos do shell, portanto, apenas o shell está envolvido, mas os passos são separados, e a situação seria idêntica aos comandos externos.

Portanto, a impressão não é um caso especial de expansão; No entanto, a substituição (como na sua pergunta vinculada) é, consulte o manual de Bash para detalhes.

    
por 10.11.2017 / 06:52
3

Quando olhamos para o que as nossas cascas fazem, por exemplo:

  • aguardando entrada do usuário
  • interpretando entrada do usuário
  • agindo na entrada do usuário
  • comunicando-se com outros programas / processos

E, claro, existe

  • imprimindo dados para a tela

... para o terminal, na verdade. De qualquer forma, os shells agem para que o usuário possa ver os dados.

Expandir uma variável é o que um shell faz quando interpreta a entrada do usuário . O shell reconhece que o usuário fez uma referência a uma variável e continua interpretando a entrada do usuário como se a entrada do usuário contivesse o conteúdo da variável, em vez da referência. Por exemplo, que haja uma variável FOO que armazena o valor bar . O usuário digita a instrução echo $FOO . O shell começa a interpretar essa instrução, reconhece $FOO como uma referência à variável denominada FOO e passa a interpretar a instrução como se o usuário tivesse digitado a instrução echo bar .

Imprimir uma variável é projetar seu conteúdo de uma maneira que permite ao usuário perceber, ou seja, lê-lo. Ele está executando a tarefa real de processar o valor armazenado na variável para que seja transportado para o usuário. No exemplo de echo $FOO , a variável FOO é expandida primeiro e depois, como resultado da expansão, a rotina echo imprime o conteúdo de FOO na tela.

De certo modo, imprimir um valor é o oposto de expandir uma variável. Uma variável é expandida quando o shell está lendo dados , para determinar o que fazer. Quando uma variável é impressa, o shell está distribuindo dados para o usuário.

    
por 10.11.2017 / 10:54
1

Em termos simples, expandir uma variável substitui seu valor, que pode ser usado como parte de qualquer comando ou script shell.

echo e printf são comandos específicos que fazem com que uma cadeia seja impressa no stdout (geralmente a tela). Essa string pode ser uma variável de shell expandida, ou pode ser uma string literal ou a saída de outro comando ou conjunto de comandos.

Então, você pode ver, eles são bem diferentes: você pode expandir uma variável sem imprimi-la ou pode imprimir algo que não seja uma variável expandida.

    
por 10.11.2017 / 12:45
0

A expansão da variável é executada pelo shell antes de executar o comando afetado. Isso é independente do comando, pode ser echo , printf ou qualquer outra coisa.

Por exemplo:

param='-ltr'
ls $param

expande para

ls -ltr

e este é o comando que está sendo executado.

    
por 10.11.2017 / 13:29