Capítulo 14: Manejo de la entrada del usuario
La forma más básica de pasar datos a un script de shell es utilizar parámetros de línea de comando. Los parámetros de la línea de comando le permiten agregar datos a la línea de comando cuando ejecuta un script.
El shell Bash asigna algunas variables especiales llamadas parámetros posicionales a todos los parámetros ingresados en la línea de comando. Esto también incluye el nombre del script ejecutado por el shell. La variable del parámetro de posición es un número estándar: 1 es el primer parámetro, 9.
Puedes usar el parámetro $0 para obtener el nombre del script que el shell inicia en la línea de comando.
Aquí existe un problema potencial. Si utiliza otro comando para ejecutar el script de shell, ese comando se combinará con el nombre del script. Cuando la cadena real de la variable 0 no es solo el nombre del script, sino la ruta completa del script, la variable $0 utilizará la ruta completa. Utilice el comando basename para resolver el problema anterior.
Hay algunas variables especiales en el shell bash que registran los parámetros de la línea de comando.
El shell Bash proporciona una variable especial $ # para indicar el número de parámetros de la línea de comando que se llevan cuando se ejecuta el script. Puede utilizar esta variable especial en cualquier parte de su secuencia de comandos como una variable normal.
A veces es necesario obtener todos los argumentos proporcionados en la línea de comando. @ se puede utilizar para acceder a todos los parámetros. Ambas variables pueden almacenar todos los argumentos de la línea de comando en una sola variable.
*La variable tratará estos parámetros como un todo, en lugar de como varios individuos.
La variable $@ trata todos los argumentos proporcionados en la línea de comando como múltiples palabras independientes en la misma cadena. De esta manera, se pueden recorrer todos los valores de los parámetros y se puede obtener cada parámetro.
@Variable maneja cada parámetro por separado.
El shell Bash proporciona parámetros de línea de comando y el comando shift puede usar estos parámetros para operar. El comando shift mueve los argumentos de la línea de comando según su posición relativa. Cuando utiliza el comando Mayús, de forma predeterminada mueve cada variable de parámetro una posición hacia la izquierda. Entonces en la variable 2, en la variable 1, y el valor de la variable 0, que es el nombre del programa, no cambiará).
Este script ejecuta un bucle while probando la longitud del primer valor del parámetro. El ciclo termina cuando la longitud del primer argumento es cero. Después de probar el primer parámetro, el comando de cambio moverá las posiciones de todos los parámetros una posición.
Una opción es una sola letra seguida de un único guión que cambia el comportamiento de un comando. El shell Bash proporciona varias formas de manejar opciones.
A primera vista, no hay nada especial en las opciones de la línea de comandos. En la línea de comando, siguen el script al igual que los argumentos de la línea de comando. De hecho, puede manejar las opciones de la línea de comando como los parámetros de la línea de comando.
La declaración de caso comprueba si cada parámetro es una opción válida. Si es así, ejecute el comando en la declaración de caso correspondiente.
En Linux, las opciones y los parámetros están separados por un carácter especial (-). Este carácter le indica al script cuándo terminan las opciones y comienzan los parámetros normales. El shell utilizará un guión doble para indicar el final de la lista de opciones. Después de la línea doble, el script puede tratar con seguridad los argumentos restantes de la línea de comando como argumentos en lugar de opciones.
Cuando encuentra una polilínea doble, el script utiliza el comando break para salir del bucle while. Debido a que salimos del bucle prematuramente, necesitamos agregar otro comando de mayúsculas para mover la línea de puntos fuera de la variable del parámetro.
Para una primera prueba, intente ejecutar el script con un conjunto común de opciones y parámetros.
Los resultados muestran que el script considera todos los parámetros de la línea de comando como opciones durante el procesamiento. A continuación, utilice guiones dobles para separar opciones y parámetros en la línea de comando.
Cuando el script encuentra una línea doble, detiene el procesamiento de opciones y trata los argumentos restantes como argumentos de línea de comando.
Algunas opciones toman valores de parámetros adicionales. En este caso, la línea de comando tiene este aspecto.
Cuando las opciones de la línea de comando requieren argumentos adicionales, el script debe poder detectarlos y manejarlos correctamente.
El comando getopt es una herramienta muy útil cuando se trata de opciones y parámetros de línea de comando.
Reconoce argumentos de línea de comando, lo que facilita su análisis en scripts.
El comando getopt puede aceptar una serie de opciones y parámetros de línea de comando arbitrarios y convertirlos automáticamente al formato apropiado. El formato del comando es el siguiente:
Optstring es la clave para este proceso. Define las letras de opción válidas en la línea de comando y también define qué letras de opción requieren valores de parámetros. Primero, enumere cada letra de opción de línea de comando que desea usar en su secuencia de comandos en optstring. Luego, agregue dos puntos después de cada letra de opción que requiera un valor de parámetro. El comando getopt analiza los parámetros proporcionados según la cadena de opción que defina.
Optstring define cuatro letras de opción válidas: a, b, cy d. Los dos puntos (:) se colocan después de la letra b porque la opción b requiere un valor de argumento. Cuando se ejecuta el comando getopt, verifica la lista de argumentos proporcionada y la analiza en función de la cadena de opción proporcionada. Tenga en cuenta que divide automáticamente la opción -cd en dos opciones separadas e inserta un guión doble para separar los argumentos adicionales en esa línea.
Puedes usar getopt en un script para formatear cualquier opción de línea de comando o parámetro que lleve el script, pero es un poco más complicado de usar. Esto se hace reemplazando las opciones y parámetros de la línea de comando existentes con versiones formateadas producidas por el comando getopt. Puede utilizar el comando set para lograr esto. Una de las opciones del comando set es un guión doble (-), que reemplaza los argumentos de la línea de comando con los valores de la línea de comando del comando set. Este método luego pasará los parámetros de la línea de comando del script original al comando getopt y luego pasará la salida del comando getopt al comando set, reemplazando los parámetros de la línea de comando original con los parámetros de la línea de comando formateados getopt, que se verán como esto:
Ahora el valor de la variable de parámetro de la línea de comando original será reemplazado por la salida del comando getopt. getopt ha formateado los parámetros de la línea de comando para nosotros.
A diferencia de getopt, que solo genera resultados después de procesar opciones y parámetros en la línea de comando, el comando getopts solo procesa un parámetro detectado en la línea de comando a la vez. Después de que se hayan procesado todos los parámetros, saldrá con un código de estado de salida mayor que 0. El comando getopts tiene el siguiente formato:
El valor de la cadena de opción es similar al valor del comando getopt. Las letras de opción válidas se enumeran en optstring. Si la letra de opción requiere un valor de parámetro, agregue dos puntos. Para eliminar mensajes de error, agregue dos puntos antes de optstring. El comando getopts guarda los parámetros actuales en variables definidas en la línea de comando.
El comando getopts utiliza dos variables de entorno. Si se requiere un valor de parámetro después de la opción, la variable de entorno OPTARG contendrá este valor. La variable de entorno OPTIND contiene la ubicación del parámetro en la lista de parámetros que está procesando getopts.
El comando getopts sabe cuándo detener las opciones de procesamiento y le deja los parámetros a usted. A medida que getopts procesa cada opción, incrementa el valor de la variable de entorno OPTIND en uno. Cuando getopts haya terminado de procesarse, los parámetros se pueden mover usando el comando shift y el valor OPTIND.
Cuando creas un script de shell, obviamente tienes control sobre qué hacer. Tú decides qué opciones de letras usar y cómo usarlas. Sin embargo, algunas opciones de letras tienen algunos significados estándar en el mundo Linux.
Aunque las opciones y argumentos de la línea de comandos son una forma importante de obtener información de los usuarios de scripts, a veces los scripts requieren una mayor interactividad. Bash Shell proporciona el comando de lectura para realizar una fuerte entrada de comandos interactivos.
El comando de lectura acepta entradas desde la entrada estándar (teclado) u otro descriptor de archivo. Después de recibir la entrada, el comando de lectura coloca los datos en una variable.
El comando echo utiliza la opción -n. Esta opción no genera un carácter de nueva línea al final de la cadena, lo que permite a los usuarios del script ingresar datos inmediatamente después en lugar de en la línea siguiente.
Cuando se utiliza el comando de lectura, el script puede esperar la entrada del usuario del script. Si el script debe continuar ejecutándose independientemente de la entrada de datos, puede usar la opción -t para especificar un temporizador. La opción t especifica la cantidad de segundos que el comando de lectura espera la entrada.
Cuando el contador expira, el comando de lectura devuelve un código de estado de salida distinto de cero.
El comando de lectura incluye la opción -p, que le permite especificar el mensaje directamente en la línea de comando de lectura.
A veces es necesario obtener información de un usuario del script, pero mostrar la información de entrada en la pantalla. Un ejemplo típico es ingresar una contraseña, pero hay muchos otros tipos de datos que deben ocultarse. La opción -s evita que los datos ingresados en el comando de lectura aparezcan en la pantalla (de hecho, los datos se mostrarán, pero el comando de lectura establecerá el color del texto al mismo color que el color de fondo).
Los datos ingresados en el mensaje de entrada no aparecerán en la pantalla, pero se asignarán a las variables utilizadas en el script.
Finalmente, también puedes usar el comando leer para leer datos guardados en un archivo en un sistema Linux. Cada vez que se llama al comando de lectura, lee una línea de texto del archivo. Cuando no haya más contenido en el archivo, el comando de lectura saldrá con un código de estado de salida distinto de cero. La parte más difícil es pasar los datos del archivo al comando de lectura. La forma más común es usar el comando cat en el archivo y canalizar los resultados directamente al comando while con el comando read.
El bucle while continúa procesando líneas en el archivo a través del comando de lectura hasta que el comando de lectura sale con un código de estado de salida distinto de cero.