Si el siguiente ejemplo, que establece la IFS
variable 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 IFS
variable de entorno y cuál es el \n
cará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 IFS
esté 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.
\n
es 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.-e
no está definido y\n
sin-e
trabajos 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=$IFS
no 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 "$*")
. restaurarIFS
de$' \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=$IFS
yOLDIFS="$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$FOO
que no se trataba esta pregunta) es un literal de cadena. Si ejecutaecho $'VAR'
, verá que imprime la cadenaVAR
, notest
.