Me doy cuenta de que para establecer nueva línea IFS
debe tener un prefijo $ como
IFS=$'\n'
pero si establece dos puntos, solo
IFS=:
¿ \n
Es una variable?
Que $'...'
en bash
no es el parámetro de expansión, que es un tipo especial de cotización introducida por ksh93
que expande los \n
, \x0a
, \12
códigos a un carácter de nueva línea. zsh
También añadido \u000a
. ksh93
y bash
también tiene \cj
mientras zsh
tiene \C-J
. ksh93
También admite variaciones como \x{a}
.
El $
es una señal de que es alguna forma o expansión. Pero en cualquier caso, difiere de otras formas de expansión que usan $
(como $((1 + 1))
, $param
o $(cmd)
) en que no se realiza entre comillas dobles o aquí documentos (las echo "$'x'"
salidas $'x'
en todos los shells, aunque no están especificadas por POSIX) y su expansión no está sujeta a división + glob, definitivamente está más cerca de un operador de cotizaciones que de un operador de expansión.
IFS=\n
establecería IFS en n
( \
se trata como un operador de cotización) IFS="\n"
o IFS='\n'
establecería IFS en la barra diagonal inversa de dos caracteres y n
.
También puedes usar:
IFS='
'
o
IFS="
"
o
IFS=$'
'
Para pasar un fin de linea, aunque eso es menos legible (y uno no puede ver con excepción de usar cosas como set list
en vi
si $IFS
contiene otros caracteres de espaciado en ese código).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Todos IFS conjunto a :
por lo que no importa lo que usted usa.
$'...'
está soportado (con variaciones) por al menos: ksh93
, zsh
, bash
, mksh
, busybox sh
, FreeBSD sh
. ksh93
y bash
también tiene una $"..."
forma de citas utilizadas para la localización de texto, aunque rara vez se usa, ya que es engorroso implementar y usar de manera portátil y confiable.
Los shells es
y fish
también pueden usarse \n
fuera de las comillas para expandirse a la nueva línea.
Algunas herramientas como printf
, algunas implementaciones de echo
o awk
también pueden expandirlas \n
por sí mismas. Por ejemplo, uno puede hacer:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
a la salida del carácter de nueva línea, pero tenga en cuenta que:
IFS = $ (printf '\ n')
no funcionará porque la sustitución de comando ( $(...)
) elimina todos los caracteres de nueva línea finales. Sin embargo, puedes usar:
eval "$(printf 'IFS="\n"')"
Lo que funciona porque la salida de printf
termina en un "
carácter, no en una nueva línea.
Ahora, para completar, en el rc
shell y derivados (como es
o akanga
), $'\n'
es de hecho la expansión de esa \n
variable (una variable cuyo nombre es la secuencia de dos caracteres \
y n
). Esos proyectiles no tienen una limitación en lo que los personajes nombres de variables pueden contener y sólo tienen un tipo de comillas: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
todas las variables también se exportan al entorno, pero al menos en la variante Unix de rc
, para nombres de variables como \n
, la versión de la variable de entorno experimenta una forma de codificación:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( 0x5c
siendo el valor de byte de ASCII \
; vea también cómo esa variable de matriz se codificó con un byte 0x1 como separador).
+1
para el nivel inhumano de conocimiento habitualEsta es una cita de ANSI-C :
Por
$'\n'
lo tanto, se reemplaza por una nueva línea.Esto no está relacionado con la expansión de parámetros de shell , a pesar del uso de
$
.fuente
Cadenas como
$'\n'
han sido introducidas porksh93
y actualmente no son parte del estándar POSIX.Permiten usar la mayoría de los escapes de C, por ejemplo,
$'\u2345'
y los escapes que también son compatiblesecho
.Tenga en cuenta que si no le gusta (en el caso de ksh93 o bash) usar ese método de escape, aún puede usar:
que es equivalente pero más difícil de leer.
Por cierto: esta extensión ya ha pasado el comité estándar POSIX, pero está programada para SUSv8 que se espera que aparezca no antes del año 2020 porque primero tenemos que trabajar en nuestro retraso detrás de la lista actual de errores.
fuente
$'...'
expansiones difieren de la deecho
. Son más parecidos a los del argumento de formatoprintf
. Paraecho
, se requiere un 0 en\0123
while for$'...'
yprintf
format,\0123
sería\012
una nueva línea seguida de un literal 3.$'...'
especificación aún se está discutiendo. Aún quedan varios problemas por resolver con la redacción propuesta actualmente.\uxxxx
expansión) y no hay una resolución a la vista que se adapte a las implementaciones existentes. Por lo tanto, es posible que no llegue a la próxima versión POSIX. Tal vez podrían dejar la\uxxxx
expansión para el problema8, por lo que todavía podemos tener al menos$'\n'
.