Diferença entre $ '$ foo' e $ "$ foo"

9

Estou tendo dificuldades para descobrir algumas nuances entre aspas simples e duplas em um contexto variável

Eu defino:

foo=pwd

então execute estes:

echo $'$foo'

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

echo $"$foo"

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

echo $`$foo`

Finalmente, este eco $~/scripts(eu esperava que fosse impresso ~/scriptse não $~/scripts)

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

Ilan
fonte

Respostas:

11

Por fim, o último imprime $~/scriptsporque $`foo`é uma combinação de um literal $seguido por uma substituição de comando; portanto, o líder $é interpretado como um literal $e o final `$foo`como uma substituição de comando.

kos
fonte
Eu removi as tags de código e as substitui por apenas `` `` `` `` `caracteres etc. Sinta-se à vontade para reverter, se você preferir as tags de código
Tim
@ Tim Obrigado, não sei o que fiz exatamente, mas por algum motivo após a sua edição, o post apareceu tão perturbado quanto na minha primeira revisão, então eu o revirei ... E agora vejo que parece ok na revisão. Não sei o que aconteceu, vou testar isso na sandbox de formatação antes de reverter para a sua versão, pois temo que possa atrapalhar a postagem novamente. Independentemente disso, obrigado pelo esforço.
kos
claro, sem problemas. O meu usa espaços com largura zero, portanto, tenha cuidado ao editar.
Tim
2

Primeiro caso:

echo $'$foo'

Qual eco $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.

Então o echo se $'$foo'expande para executar o comando $(que não é um comando, por isso o ignora) e, em seguida, echo '$foo'. Qualquer coisa ''é recebida pelo valor nominal - não a expande nem nada. Você pode colocar o que deseja '' e nada acontece.

Se você substituir o $por $$, ecoará o ID do processo.


Segundo:

echo $"$foo"

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

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

Se você tem uma variável que pode estar vazia (por exemplo, é de um grepresultado), então deseja comparar com outro valor / variável, é necessário inserir a primeira variável "". Isso garante que sempre haja uma comparação para verificar, em vez de apenas uma seção vazia de código (como o bash vê) que gera um erro.


Finalmente, número 3. Isso é interessante.

echo $`$foo`

Este eco $~/scripts(eu esperava que fosse impresso ~/scriptse não $~/scripts)

Isso porque (nesse caso) 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 fazer isso nas versões mais recentes do bash é $(command))

Então, primeiro ele faz eco e $depois se expande ​`$foo`​para o ​`pwd`​que é executado e retorna ~/Scripts. Mas nós tivemos a $impressão mais cedo - então toda a saída é $~/Scripts.

Tim
fonte
Bom trabalho em algumas formatações muito difíceis!
Arronical
11
@ Arronical Thanks :) Você não pode vê-lo, mas existem alguns espaços de largura zero para a última frase. O que eu faço para pontos de internet imaginários ...!
Tim
11
+1 boa resposta. Eu apenas acrescentaria que as variáveis ​​de citação devem ser o padrão, a menos que você tenha um motivo específico para não fazê-lo - não apenas para lidar com possíveis valores nulos. Consulte unix.stackexchange.com/questions/171346/… para obter mais do que você sempre quis saber sobre isso. ;)
Joe