Bash read comando incorporado

comando de lectura

En Tipo Unix sistemas operativos, leer es un comando incorporado del Intento cáscara. Lee una línea de texto de entrada estándar y lo divide en palabras. Estas palabras se pueden utilizar como entrada para otros comandos.

Descripción

leer lee una sola línea de la entrada estándar o del descriptor de archivo fd Si el -u se utiliza la opción (ver -u , debajo).

Por defecto, leer considera un nueva línea carácter como el final de una línea, pero esto se puede cambiar usando el -D opción.

Después de leer, la línea se divide en palabras según el valor de la variable de shell especial IFS , el separador de campo interno. De forma predeterminada, el valor IFS es 'espacio, tabulación o nueva línea'. Si leer encuentra caracteres legibles antes de encontrar un IFS, considera que esos caracteres son una palabra. (Para obtener más información sobre IFS, consulte división de palabras en bash .)

Consejo

Para preservar espacio en blanco al principio o al final de una línea, es común especificar IFS = (sin valor) inmediatamente antes del leer mando. Una vez completada la lectura, el IFS vuelve a su valor anterior. Para obtener más información sobre esto, consulte el ejemplos debajo.

leer asigna la primera palabra que encuentra a nombre , la segunda palabra para nombre2 , etc. Si hay más palabras que nombres, todas las palabras restantes se asignan al último nombre especificado. Si solo una nombre se especifica, toda la línea se asigna a esa variable.

Si no nombre se especifica, la entrada se almacena en una variable denominada RESPUESTA .

Sintaxis

|_+_|

Opciones

La leer El comando incorporado toma las siguientes opciones:

-a formación Almacene las palabras en un índice formación llamado formación . La numeración de los elementos de la matriz comienza en cero.
-D delimitar Selecciona el delimitador personaje a delimitar . Este carácter señala el final de la línea. Si -D no se utiliza, el delimitador de línea predeterminado es un nueva línea .
-es Obtenga una línea de entrada de un shell interactivo. El usuario ingresa caracteres manualmente hasta que se alcanza el delimitador de línea.
-I texto Cuando se usa junto con -es (y solo si -s no se utiliza), texto se inserta como el texto inicial de la línea de entrada. El usuario puede editar texto en la línea de entrada.
-norte nchars Dejar de leer después de un número entero nchars se leen los caracteres, si no se ha alcanzado el delimitador de línea.
-NORTE nchars Ignore el delimitador de línea. Deje de leer solo después de nchars se leen caracteres, se alcanza EOF o se agota el tiempo de lectura (consulte -t ).
-pag inmediato Imprime la cadena inmediato , sin una nueva línea, antes de comenzar a leer.
-r Utilice 'entrada sin procesar'. Específicamente, esta opción provoca leer interpretar barras invertidas literalmente , en lugar de interpretarlos como personajes de escape .
-s No repita las pulsaciones de teclas cuando leer está recibiendo información del terminal.
-t se acabó el tiempo Se agota el tiempo de espera y falla de retorno, si no se lee una línea completa de entrada dentro de se acabó el tiempo segundos. Si el valor del tiempo de espera es cero, leer no leerá ningún dato, pero devuelve correctamente si la entrada estaba disponible para leer. Si se acabó el tiempo no se especifica, el valor de la variable de shell TMOUT se utiliza en su lugar, si existe. El valor de se acabó el tiempo son números fraccionarios, por ejemplo, 3.5 .
-u fd Leer del descriptor de archivo fd en lugar de la entrada estándar. El descriptor de archivo debe ser un número entero pequeño. Para obtener información sobre cómo abrir un descriptor de archivo personalizado, consulte abriendo descriptores de archivos en bash .

Estado de salida

El estado de salida de leer es cero a menos que se encuentre EOF, se exceda el tiempo de espera, se produce un error al asignar un valor a nombre , o el descriptor de archivo proporcionado a -u no es válido.

Si se excede un tiempo de espera, el estado de salida es superior a 128.

Ejemplos de

|_+_|

leer toma datos del terminal. Escribe lo que quieras y presiona Enter. El texto es repitió en la siguiente línea. Este bucle continúa hasta que presione Ctrl + D (EOF) en una nueva línea. Debido a que no se especificaron nombres de variable, toda la línea de texto se almacena en la variable RESPUESTA .

|_+_|

Igual que arriba, usando el nombre de la variable texto .

|_+_|

Proporciona un mensaje y un texto inicial para la entrada del usuario. El usuario puede borrar 'Mi texto es' o dejarlo como parte de la entrada. Mecanografía Ctrl + D en una nueva línea termina el bucle.

|_+_|

Adjuntando el leer y echo Los comandos entre paréntesis los ejecutan en una subcapa dedicada. Esto permite RESPUESTA variable a la que accederán ambos leer y echo . Para más información, ver entornos de ejecución de comandos bash: subshells .

|_+_|

Haz eco de 'uno, dos, tres, cuatro' y pásalo al tiempo bucle, donde leer lee la primera palabra en palabra1 , el segundo en palabra2 y todo lo demás en palabra3 . Producción:

|_+_| |_+_|

Igual que el anterior, pero asigne las palabras a los elementos de una matriz indexada, Wordarray . La numeración comienza en cero, por lo que $ {wordarray [1]} devuelve la segunda palabra. Para más información, ver matrices bash . Producción:

|_+_| |_+_|

Los comandos anteriores son la forma 'correcta' de usar encontrar y leer juntos para procesar archivos. Es especialmente útil cuando desea hacer algo con muchos archivos que tienen nombres extraños o inusuales. Echemos un vistazo a partes específicas del ejemplo anterior:

|_+_|

IFS = (sin nada después del signo igual) establece el separador de campo interno en 'sin valor'. Por lo tanto, los espacios, tabulaciones y nuevas líneas se consideran parte de una palabra, lo que conserva los espacios en blanco en los nombres de los archivos.

Tenga en cuenta que IFS = viene después tiempo , asegurándose de que IFS se modifique solo dentro del tiempo círculo. Por ejemplo, no afectará encontrar .

|_+_|

Utilizando la -r La opción es necesaria para conservar las barras invertidas en los nombres de los archivos.

|_+_|

La -D La opción establece el delimitador de nueva línea. Aquí, lo configuramos con el carácter NULL, ASCII código cero. (Un cero de escape entre comillas simples, precedido por un signo de dólar, es interpretado por bash como NULL. Para obtener más información, consulte: Expansión de cadenas con escapes interpretados en la documentación de bash.)

Estamos usando NULL como delimitador de línea porque los nombres de archivo de Linux pueden contener nuevas líneas, por lo que debemos preservarlos. (Esto suena horrible, pero sí, sucede).

Sin embargo, un NULL nunca puede ser parte de un nombre de archivo de Linux, por lo que es un delimitador confiable para usar. Afortunadamente, encontrar puede usar NULL para delimitar sus resultados, en lugar de una nueva línea, si el -print0 se especifica la opción:

|_+_|

Aquí, encontrar . -print0 crea una lista de todos los archivos en y debajo . (el directorio de trabajo) y delimita todos los nombres de archivo con un NULL. Cuando usas -print0 , todos los demás argumentos y opciones deben precederlo, así que asegúrese de que sea la última parte del comando.

Adjuntando el encontrar comando en <( ... ) realiza sustitución de procesos : la salida del comando se puede leer como un archivo. A su vez, esta salida se redirige a la tiempo bucle usando el primer ' < '.

Cada iteración del tiempo círculo, leer lee una palabra (un solo nombre de archivo) y pone ese valor en la variable expediente , que especificamos como el último argumento de la leer mando.

Cuando no haya más nombres de archivos para leer, leer devuelve falso, lo que desencadena el final de la tiempo bucle, y la secuencia de comando termina.

tiempo - Ejecuta un conjunto de acciones mientras una determinada condición es verdadera.
encontrar - Busque archivos dentro de una jerarquía de directorios.