Qual é a diferença entre $ 'string' entre aspas simples e $ “string” entre aspas no bash?

9

Eu estava tentando executar uma nova linha usando echoe tentei seguir dois comandos:

  1. Primeiro comando:

    echo $'Hello World\nThis is a new line'

    Resposta:

    Hello World
    This is a new line
  2. Segundo comando:

    echo $"Hello World\nThis is a new line"

    Resposta:

    Hello World\nThis is a new line

A minha pergunta é qual é a diferença entre a corda enrolada com $' 'vs corda enrolada com $" "em bash's echo?

Rafaf Tahsin
fonte
Nota útil: As aspas duplas também são conhecidas como aspas fracas e as aspas simples também são conhecidas como aspas fortes.
Rafaf Tahsin
2
Sim, mas "weak quote"e 'strong quote'são diferentes de $'C String'e $"I18N String".
DopeGhoti 18/08/19
Você é o verdadeiro MVP. : D >>> @DopeGhoti
Rafaf Tahsin
Eu faço o que posso (:
DopeGhoti

Respostas:

10

Conforme explicado aqui , a sintaxe $'string'especifica uma string no estilo C que inclui caracteres de escape mágicos, como \npara uma nova linha. $"string"é para expansão I18N, que não tem escapatória mágica.

Observe que eles são distintos dos mais comuns "string"(cotação fraca) e 'string'(cotação forte).

DopeGhoti
fonte
9

O $no início da string em:

echo $'Hello World\nThis is a new line'

faz com que as seqüências de escape sejam interpretadas.

Manual de referência do Bash [diz]

Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para cadeia, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C. ..
..
O resultado expandido está entre aspas simples, como se o cifrão não estivesse presente.

Mas

echo $"Hello World\nThis is a new line"

é completamente diferente. Este [artigo] sobre tradução específica do código do idioma diz:

Uma sequência de aspas duplas precedida por um sinal de dólar ('$') fará com que a sequência seja traduzida de acordo com o código de idioma atual. Se o código do idioma atual for C ou POSIX, o cifrão será ignorado. Se a sequência for traduzida e substituída, a substituição será citada duas vezes.


Nota: IIRC ambos $'string'e $"string"pode não encontrar suporte entre diferentes reservatórios. Não apenas as pessoas de outros reservatórios olham para eles com curiosidade, mas também debatem se isso pode ser evitado quanto à portabilidade do script.

sjsam
fonte
1
ksh93também entende $'...'.
Kusalananda
@Kusalananda: Hmm, boa nota :)
sjsam
4
$'xxx'não é um basismo, mas foi introduzido kshvários anos antes bash. Atualmente é também apoiado por zshe busybox she está sob revisão pelo padrão POSIX.
Jlliagre
@ jlliagre: Aprecie o tempo :). Estou corrigido ..
sjsam 18/08/16