¿Cuál es la diferencia entre $ 'string' entre comillas simples y $ “string” entre comillas dobles en bash?

9

echoIntenté ejecutar una nueva línea usando e intenté seguir dos comandos:

  1. Primer comando:

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

    Respuesta:

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

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

    Respuesta:

    Hello World\nThis is a new line

Mi pregunta es ¿cuál es la diferencia entre la secuencia envuelta con $' 'vs cadena envuelto con $" "en bash's echo?

Rafaf Tahsin
fuente
Nota útil: La comilla doble también se conoce como comillas débiles y la comilla simple también se conoce como comillas fuertes.
Rafaf Tahsin
2
Sí, pero "weak quote"y 'strong quote'son diferentes de $'C String'y $"I18N String".
DopeGhoti
Eres el verdadero MVP. : D >>> @DopeGhoti
Rafaf Tahsin
Hago lo que puedo (:
DopeGhoti

Respuestas:

10

Como se explica aquí , la sintaxis $'string'especifica una cadena de estilo C que incluye caracteres mágicos escapados, como \npara una nueva línea. $"string"es para la expansión I18N, que no tiene tales escapes mágicos.

Tenga en cuenta que estos son distintos de los más comunes "string"(cita débil) y 'string'(cita fuerte).

DopeGhoti
fuente
9

El $en el comienzo de la cadena en:

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

hace que las secuencias de escape sean interpretadas.

Manual de referencia de Bash [dice]

Las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a una cadena, con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C. ..
..
El resultado ampliado está entre comillas simples, como si el signo del dólar no hubiera estado presente.

Pero

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

Es completamente diferente. Este [artículo] sobre traducción específica del entorno local dice:

Una cadena entre comillas dobles precedida por un signo de dólar ('$') hará que la cadena se traduzca de acuerdo con la configuración regional actual. Si el entorno local actual es C o POSIX, se ignora el signo de dólar. Si la cadena se traduce y reemplaza, el reemplazo se cita entre comillas.


Nota: IIRC ambos $'string'y $"string"pueden no encontrar soporte entre diferentes shells. No solo las personas de otros shells los miran con curiosidad, sino que también debaten sobre si esto podría evitarse para la portabilidad del script.

sjsam
fuente
1
ksh93También entiende $'...'.
Kusalananda
@Kusalananda: Hmm, buena nota :)
sjsam
44
$'xxx'No es un bashismo, pero fue introducido por kshvarios años antes bash. Actualmente también es compatible con zshy busybox shy está siendo revisado por el estándar POSIX.
jlliagre
@jlliagre: aprecio el tiempo :). Estoy corregido ..
sjsam