Estaba leyendo este hilo: ¿Cómo recorrer las líneas de un archivo?
¿Qué es IFS? ¿Y cuál es su uso en el contexto de for-loops?
Estaba leyendo este hilo: ¿Cómo recorrer las líneas de un archivo?
¿Qué es IFS? ¿Y cuál es su uso en el contexto de for-loops?
IFSsignifica : es un personaje que separa los campos. En el ejemplo que publicó, se establece en un nuevo carácter de línea ( ); así que después de configurarlo, procesará el texto línea por línea. En ese ejemplo, podría cambiar el valor de (a alguna letra que tenga en su archivo de entrada) y verificar cómo se dividirá el texto.InputInternal Field Separator\nforIFS
Por cierto, de la respuesta que publicó la segunda solución es que se recomienda ...
Como @jasonwryan notó, no es Inputsino Internal. Nombre de donde Inputproviene awktambién OFS- Output Field Separator.
Sfue para el separador en el shell Bourne de donde se originó. En el shell Korn y en la mayoría de los otros shell similares a Bourne, como se ha especificado ahoraPOSIX,Ses para Delimitador (solo estira tu imaginación un poco) ya que,A::B:por ejemplo, se divide en "A", "" y "B" (sin extra ""). Eso es diferente deawk'sFSo lasbandera de expansión de parámetros dezsh.IFSno está directamente relacionado con el bucle, está relacionado con la división de palabras.IFSdetermina indirectamente cómo la salida del comando se divide en partes sobre las que el ciclo itera.Cuando tiene una sustitución de variable desprotegida
$fooo una sustitución de comando$(foo), hay dos casos:"$foo"o en una asignación variablex=$foo, la cadena resultante de la sustitución se utiliza tal cual.$IFSse considera un separador de palabras. Por ejemplo,IFS=":"; foo="12:34::78"; echo $fooimpresiones12 34 78(con dos espacios entre34y78, ya que hay una palabra vacía).foo="*"; echo $fooimprime la lista de archivos en el directorio actual.Para los bucles, como muchos otros contextos, espere una lista de palabras. Entonces
se divide
$(foo)en palabras y trata cada palabra como un patrón global. El valor predeterminado deIFSes space, tab y newline , por lo que sifooimprime dos líneashello worldyhowdyluego el cuerpo del bucle se ejecuta conx=hello, entoncesx=worldyx=howdy. SiIFSse cambia explícitamente para contener solo una nueva línea, el bucle se ejecuta parahello worldyhowdy. SiIFSse cambia a sero, entonces el bucle se ejecuta parahell, w,rldh(dondees un carácter de nueva línea) ywdy.fuente
"IFS indirectly determines how ..."?IFS(directamente) determina cómo se divide la salida de la sustitución del comando, que luego (indirectamente) determina sobre qué se repite el bucle.Desde
man bashEsta es una de las variables internas de Bash. Determina cómo Bash reconoce campos, o límites de palabras, cuando interpreta cadenas de caracteres.
Si bien el valor predeterminado es el espacio en blanco (espacio, tabulación y nueva línea), se puede cambiar, por ejemplo, para analizar un archivo de datos separados por comas.
http://tldp.org/LDP/abs/html/internalvariables.html
fuente
Además de las excelentes respuestas anteriores, permítanme agregar que IFS es muy útil para un análisis eficiente y portátil en casos simples en combinación con el conjunto . Eficiente, porque evita el uso de subcapas y herramientas de desove como grep o sed:
Solo tenga en cuenta que necesitamos almacenar y recuperar el valor anterior de IFS para evitar roturas no deseadas en otras partes del script.
fuente