Diferença entre $ '$ foo' e $ “$ foo”

9

Estou com dificuldades para descobrir algumas nuances entre aspas simples e duplas dentro de um contexto variável

Eu defino:

foo=pwd

execute então:

echo $'$foo'

Qual echos $foo (significando que o primeiro $ no meu comando echo é descartado)

echo $"$foo"

Esse echos pwd (que significa que o bash expande $foo , minha variável, para seu valor)

echo $'$foo'

Finalmente, este echos $~/scripts (esperava que fosse impresso ~/scripts e não $~/scripts )

alguém pode me ajudar a descobrir essas diferenças?

    
por Ilan 18.02.2016 / 13:22

2 respostas

11

  • echo $'$foo' : o token $'[...]' em torno de $foo interpreta $foo literalmente (como $foo ) e tenta para expandir seqüências de escape semelhantes a ANSI C , que não estão presentes, portanto echo rende $foo ;
  • echo $"$foo" : o token $"[...]" em torno de $foo expande $foo para seu valor ( pwd ) e tenta traduzi-lo se a localidade atual não for POSIX / C ; isso não está acontecendo, porque a localidade atual é POSIX / C ou uma tradução para pwd não está disponível, portanto echo yields pwd ;
  • echo $'$foo' : o token '[...]' em torno de $foo permite a expansão de $foo , então $foo é expandido para seu valor ( pwd ); o valor expandido é executado em um subshell, cuja saída ( ~/scripts ) substitui todo o token '[...]' , portanto echo produz o token $ seguido pelo token ~/scripts ( $~/scripts ).

Por fim, o último imprime $~/scripts porque $'foo' é uma combinação de um literal $ seguido por uma substituição de comando; então o $ inicial é interpretado como um literal $ e o '$foo' à direita como uma substituição de comando.

    
por kos 18.02.2016 / 13:36
2

Primeiro caso:

echo $'$foo'
     

Qual echos $foo (significando que o primeiro $ no meu comando echo é descartado)

O primeiro $ é executado como um comando. O eco não requer espaços entre argumentos, apenas os leva.

Assim, echo $'$foo' se expande para executar o comando $ (que não é um comando para ignorar) e, em seguida, echo '$foo' . Qualquer coisa em '' é tomada pelo valor de face - não expande nem nada. Você pode colocar o que quiser "e nada acontece.

Se você substituir o $ por $$ , ele exibe o ID do processo.

Segundo:

echo $"$foo"
     

Esse echos pwd (que significa que o bash expande $foo , minha variável, para seu valor)

Isso porque "" não impede sua expansão. "" é normalmente usado para garantir que haja um valor para comparar.

Se você tem uma variável que pode estar vazia (por exemplo, é de um resultado grep ), então você quer comparar com outro valor / variável, você tem que colocar a primeira variável em "" . Isso garante que sempre haja uma comparação a ser verificada, em vez de apenas uma seção vazia do código (como o bash vê), o que gera um erro.

Finalmente, o número 3. Isso é interessante.

echo $'$foo'
     

Esse echos $~/scripts (esperava que ele imprimisse ~/scripts e não $~/scripts )

Isso porque (nesse caso) o echo está imprimindo o caractere $ primeiro. Colocar algo nos backticks faz com que o valor da variável seja executado como um comando (a melhor maneira de fazê-lo em versões mais recentes do bash é $(command) )

Primeiro, echos $ , em seguida, ele expande ​'$foo'​ para ​'pwd'​ , que é executado e retorna ~/Scripts . Mas nós tivemos o $ print anterior - então a saída inteira é $~/Scripts .

    
por Tim 18.02.2016 / 13:39