Si el siguiente ejemplo, que establece la IFSvariable de entorno en un carácter de avance de línea ...
IFS=$'\n'
- ¿Qué hace el signo de dólar media exactamente el ?
- ¿Qué hace en este caso específico?
- ¿Dónde puedo leer más sobre este uso específico (Google no permite caracteres especiales en las búsquedas y no sé qué buscar)?
Sé cuál es la IFSvariable de entorno y cuál es el \ncarácter (salto de línea), pero ¿por qué no usar la siguiente forma:
IFS="\n"(que no funciona)?
Por ejemplo, si quiero recorrer cada línea de un archivo y quiero usar un ciclo for, podría hacer esto:
for line in (< /path/to/file); do
echo "Line: $line"
done
Sin embargo, esto no funcionará correctamente a menos que IFSesté configurado en un carácter de avance de línea. Para que funcione, tendría que hacer esto:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Nota: No necesito otra forma de hacer lo mismo, ya conozco muchas otras ... Solo tengo curiosidad por eso $'\n'y me pregunto si alguien podría darme una explicación al respecto.

\nes solo una letra (escapado) n. Tienes razón en eso'\n'y tienes una"\n"reacción violenta seguida de n.$'\n'es específico de bash: no funcionará en un shell POSIX (/bin/sh). Para obtener el mismo efecto de una manera compatible con POSIX, puede escribirIFS=', luego presionar regresar para escribir un carácter de nueva línea real, luego escribir el cierre'IFS=$(echo -e '\n')también debe hacerlo de una manera compatible con POSIX.-eno está definido y\nsin-etrabajos como una extensión XSI: pubs.opengroup.org/onlinepubs/9699919799/utilities/… .printf '\n'rocas;)Solo para dar al constructo su nombre oficial : las cadenas del formulario
$'...'se denominan cadenas con comillas C de ANSI .Es decir, como en las cadenas [ANSI] C, las secuencias de escape de reacción se reconocen y se expanden a su equivalente literal (consulte a continuación la lista completa de secuencias de escape compatibles).
Después de esta expansión, las
$'...'cadenas se comportan de la misma manera que las'...'cadenas , es decir, se tratan como literales que NO están sujetos a ninguna [más] expansión de shell .Por ejemplo, se
$'\n'expande a un carácter de nueva línea literal, que es algo que un literal de cadena bash normal (si'...'o no"...") puede hacer. [1]Otra característica interesante es que las cadenas entre comillas ANSI C pueden escapar
'(comillas simples) ya\'que,'...'(cadenas entre comillas simples) no pueden:Lista de secuencias de escape compatibles :
[1] Sin embargo, puede insertar nuevas líneas reales en las cadenas '...' y "..."; es decir, puede definir cadenas que abarcan varias líneas.
fuente
De http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :
Supongo que está obligando al script a escapar del avance de línea al estándar ANSI-C adecuado.
fuente
Recuperar el IFS predeterminado, esto
OLDIFS=$IFSno es necesario. Ejecute el nuevo IFS en subshell para evitar anular el IFS predeterminado:Además, realmente no creo que recuperes completamente el viejo IFS. Debería doble citarlo para evitar saltos de línea como
OLDIFS="$IFS".fuente
args=$(IFS='&'; echo "$*"). restaurarIFSde$' \t\n'una manera amigable con los Bourne no es una hazaña.Besides I don't really believe you recover the old IFS fully: la división de palabras se no lleva a cabo en el lado derecho de la asignación de variables (pero eliminación de comillas es), por lo queOLDIFS=$IFSyOLDIFS="$IFS"se comportan de la misma manera.Las cadenas entre comillas ANSI C son un punto clave. Gracias a @ mklement0.
Puede probar las cadenas entre comillas ANSI C con el comando od.
Salidas:
Puede conocer el significado claramente por las salidas.
fuente
Es como recuperar el valor de una variable:
son diferentes, por lo que el signo de dólar básicamente evalúa el contenido.
fuente
$'FOO'(a diferencia de lo$FOOque no se trataba esta pregunta) es un literal de cadena. Si ejecutaecho $'VAR', verá que imprime la cadenaVAR, notest.