Comando integrado Bash mapfile

comando mapfile

En Tipo Unix sistemas operativos, mapfile es un comando incorporado del Intento cáscara. Lee líneas de entrada estándar en un indexado formación variable .

Consejo

Para obtener más información sobre las variables de matriz de bash, consulte matrices en bash .

Sintaxis

|_+_|

Opciones

La mapfile El comando incorporado toma las siguientes opciones:

-norte contar Leer un máximo de contar líneas. Si contar es cero, se copian todas las líneas disponibles.
-O origen Comience a escribir líneas en la matriz formación en el número de índice origen . El valor por defecto es cero.
-s contar Descartar el primero contar líneas antes de escribir a formación .
-t Si alguna línea termina en una nueva línea, quítela.
-u fd Leer líneas del descriptor de archivo fd en lugar de entrada estándar.
-C llamar de vuelta Ejecutar / evaluar una función / expresión, llamar de vuelta , cada vez cuántico se leen las líneas. El valor predeterminado de cuántico es 1 , a menos que se especifique lo contrario con -c .
-c cuántico Especifique el número de líneas, cuántico , después de la cual función / expresión llamar de vuelta debe ser ejecutado / evaluado si se especifica con -C .
formación El nombre de la variable de matriz donde se deben escribir las líneas. Si formación se omite, la variable predeterminada MAPFILE es el objetivo.

Notas

El nombre del comando readarray puede usarse como un alias para el nombre del comando mapfile , sin diferencia de funcionamiento.

Si el -u se especifica la opción, mapfile lee de descriptor de archivo fd en lugar de la entrada estándar.

Si formación no se especifica, la variable predeterminada MAPFILE se utiliza como variable de matriz de destino.

La mapfile El comando no es muy portátil. Es decir, si quiere asegurar su texto puede ejecutarse en una amplia gama de sistemas, no se recomienda su uso mapfile . Se proporciona principalmente para su comodidad. La misma funcionalidad se puede lograr utilizando un leer bucle, aunque en general mapfile funciona más rápido.

Estado de salida

La mapfile el comando regresa 0 para el éxito, o 1 si algo sale mal, por ejemplo, se proporciona una opción no válida, o la variable de destino es de solo lectura o no es una matriz.

Ejemplos de

La mapfile El comando lee la entrada línea por línea y coloca cada línea en una variable de matriz. Proporcionémosle varias líneas de entrada.

Nosotros podemos usar printf para hacer esto. Es una forma sencilla de imprimir texto con nuevas líneas .

En nuestro printf cadena de formato , podemos incluir ' orte ' (a barra invertida seguido inmediatamente por una minúscula norte ) para crear una nueva línea. (' orte 'es un metacarácter, una secuencia de caracteres que representan a otro carácter que no se puede escribir literalmente , como la tecla Intro. Para obtener una lista completa de los metacaracteres de bash, consulte citando en bash .)

Esto printf comando imprime tres líneas de texto:

|_+_| |_+_|

Queremos usar mapfile para poner cada una de estas líneas en su propio elemento de una matriz.

Por defecto, mapfile lee desde la entrada estándar, por lo que puede tener la tentación de canalizar la salida de printf a mapfile como esto:

|_+_|

Esperaría la variable de matriz predeterminada MAPFILE para contener los valores de estas líneas. Pero si comprueba el valor de MAPFILE :

|_+_| |_+_|

La variable está vacía. ¿Por qué?

Cada comando en una canalización se ejecuta en un subshell, una instancia de bash, ejecutada como un proceso secundario. Cada subcapa tiene su propio entorno y su propio alcance léxico: las variables que componen el entorno de cada subcapa en la canalización no se transfieren a otras. En otras palabras, no hay efectos secundarios ambientales compartidos de un elemento de una tubería al siguiente. En nuestro ejemplo anterior, mapfile funciona correctamente y establece los valores de MAPFILE , pero cuando la subcapa del comando termina, la variable MAPFILE desaparece.

Puede ver esto si se hace eco del valor de MAPFILE dentro de una subcapa que también contiene el mapfile comando, encerrando ambos entre paréntesis:

|_+_| |_+_|

En el comando anterior, echo imprime todos los elementos de la variable de matriz MAPFILE , separados por un espacio. El espacio aparece al comienzo de las líneas 2 y 3 debido a las nuevas líneas en nuestros datos. Nuestra subcapa explícita, expresada entre paréntesis, conserva el valor de MAPFILE el tiempo suficiente para que podamos ver los valores.

Podemos arreglar los saltos de línea eliminándolos con -t :

|_+_| |_+_|

(Podemos volver a poner los saltos de línea en nuestra salida si usamos printf - lo haremos en ejemplos posteriores).

Entonces, mapfile está funcionando, pero la variable de matriz es inaccesible para el shell padre. Normalmente, sin embargo, querrá MAPFILE variable para persistir para los comandos posteriores. Puede lograrlo con la sustitución de procesos.

Usando mapfile con sustitución de procesos

Con sustitución de procesos , podemos redirigir la salida a mapfile sin utilizar una tubería.

|_+_|

Veamos las partes individuales de este comando:

mapfile -t Mapfile toma la entrada de la entrada estándar y elimina las nuevas líneas ( -t ) desde el final de cada línea. Esto es (generalmente) lo que desea: solo el texto de la línea se almacena en su elemento de matriz y el carácter de nueva línea se descarta.
< El primero < es un personaje de redireccionamiento. Espera ir seguido de un nombre de archivo o descriptor de archivo. El contenido de ese archivo se redirige a la entrada estándar del comando anterior.
<( ... ) Estos caracteres indican la sustitución del proceso, que devuelve un descriptor de archivo. Los comandos entre paréntesis se ejecutan y su salida se asigna a este descriptor de archivo. En cualquier comando de bash, puede usar la sustitución de procesos como un nombre de archivo.

Cuando ejecuta todo el comando, mapfile lee en silencio nuestras tres líneas de texto y coloca cada línea en elementos individuales de la variable de matriz predeterminada, MAPFILE .

Podemos verificar esto usando printf para imprimir los elementos de la matriz.

|_+_|

El primer argumento, '%s' es la cadena de formato printf. El segundo argumento, '$ {MAPFILE [@]}' , se expande mediante bash. Todos los elementos (' @ ') de matriz MAPFILE se expanden a argumentos individuales. (Para más información, ver: Hacer referencia a elementos de matriz en bash .)

|_+_|

Como puede ver, nuestras tres líneas de texto están impresas una al lado de la otra. Eso es porque eliminamos las nuevas líneas con -t , y printf no genera nuevas líneas de forma predeterminada.

Para especificar eso printf imprimir una nueva línea después de cada línea, utilice orte en la cadena de formato:

|_+_| |_+_|

Para acceder a elementos individuales de la matriz, reemplace @ con un número de índice. La numeración se basa en cero, por lo que 0 indexa el primer elemento, 1 indexa el segundo, etc:

|_+_| |_+_| |_+_| |_+_|

leer - Leer una línea, dividirla en palabras y asignar cada palabra a una variable.