IFS
significa "separador de campo interno". El shell lo utiliza para determinar cómo dividir las palabras, es decir, cómo reconocer los límites de las palabras.
Pruebe esto en un shell como bash (otros shells pueden manejar esto de manera diferente, por ejemplo zsh):
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
El valor predeterminado para IFS
consiste en caracteres de espacio en blanco (para ser precisos: espacio, tabulación y nueva línea). Cada carácter puede ser un límite de palabra. Entonces, con el valor predeterminado de IFS
, se imprimirá el bucle anterior:
Word: foo:bar
Word: baz
Word: rab
En otras palabras, el shell piensa que el espacio en blanco es un límite de palabra.
Ahora, intente configurar IFS=:
antes de ejecutar el bucle. Esta vez, el resultado es:
Word: foo
Word: bar baz rab
Ahora, el caparazón también se divide mystring
en palabras, pero ahora, solo trata los dos puntos como el límite de la palabra.
El primer carácter de IFS
es especial: se utiliza para delimitar palabras en la salida cuando se usa la $*
variable especial (ejemplo tomado de la Guía avanzada de secuencias de comandos Bash , donde también puede encontrar más información sobre variables especiales como esa):
$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
Comparar con:
$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z
Tenga en cuenta que en ambos ejemplos, la cáscara se seguirá considerando todos los personajes :
, -
y ;
como límites de las palabras. Lo único que cambia es el comportamiento de $*
.
Otra cosa importante a saber es cómo la llamada "IFS espacio en blanco" es tratado . Básicamente, tan pronto como IFS
incluye espacios en blanco, los espacios en blanco iniciales y finales se eliminan de la cadena para dividirse antes de procesarlos y una secuencia de caracteres en blanco consecutivos también delimita los campos. Sin embargo, esto solo se aplica a los caracteres de espacios en blanco que están realmente presentes en IFS
.
Por ejemplo, veamos la cadena "a:b:: c d "
(espacio final y dos caracteres de espacio entre c
y d
).
- Con
IFS=:
ello se dividiría en cuatro campos: "a"
, "b"
, ""
(cadena vacía) y " c d "
(de nuevo, dos espacios entre c
y d
). Tenga en cuenta los espacios en blanco iniciales y finales en el último campo.
- Con
IFS=' :'
, que se divide en cinco campos: "a"
, "b"
, ""
(cadena vacía), "c"
y "d"
. Sin espacios en blanco iniciales y finales en ningún lado.
Observe cómo los caracteres de espacio en blanco consecutivos múltiples delimitan dos campos en el segundo ejemplo, mientras que los dos puntos consecutivos múltiples no lo hacen (ya que no son caracteres de espacio en blanco).
En cuanto a IFS=$'\n'
, que es una ksh93
sintaxis también apoyado por bash
, zsh
, mksh
y FreeBSD sh
(con variaciones entre todas las conchas). Citando la página de manual de bash:
Las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a "cadena", con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C.
\n
es la secuencia de escape para una nueva línea, por lo que IFS
termina configurada en un solo carácter de nueva línea.