Leer datos recibidos por teclado en Shell Script
Si bien muchas veces usamos scripts en shell para automatizar totalmente la realización de tareas, muchas veces necesitamos autorizaciones u otros datos recibidos por teclado. Para leer esos datos tenemos el comando read
Como siempre que declaramos una variable, escribiremos su nombre sin $, pero a la hora de usar el valor de esa variable, sí que escribiremos $ seguido del nombre de la variable.
Para ver el uso de read sin modificadores, vamos a pedir al usuario que escriba su nombre con echo, recibimos el nombre con read y vamos a saludarle de nuevo con echo:
#!/bin/bash echo "¿Cuál es su nombre?" read name echo "Hola, $name"
Podríamos realizar la pregunta en la misma instrucción usando el modificador -p:
#!/bin/bash read -p "¿Cuál es su nombre? " name echo "Hola, $name"
En caso de que no indiquemos un nombre de variable, la variable por defecto que usa read de $REPLY:
#!/bin/bash read -p "¿Cuál es su nombre? " echo "Hola, $REPLY"
Podemos indicar que sólo admita un determinado carácter, obviando todos los demás con -d (delimitador).
#!/bin/bash for i in {1..5} do echo $i done read -d "c" -p "Pulse c para continuar." echo "" for i in {6..10} do echo $i done
Para limitar el número de caracteres que lea read, lo indicaremos con -N seguido del número de caracteres a leer.
Limitemos el número de caracteres del script anterior a 1:
#!/bin/bash for i in {1..5} do echo $i done read -N 1 -p "Pulse c para continuar." echo "" if [ $REPLY == "c" ] then for i in {6..10} do echo $i done else echo "Fin de la secuencia." fi
El comando read tiene también un modificador muy interesante que es -t, que permite indicarle el número de segundos a esperar antes de que continúe la ejecución del programa.
Si queremos mostrar por pantalla del 1 al 5, como en la secuencia anterior, y que si no indica el usuario nada en cinco segundos, continúe mostrando del 6 al 10, podemos hacerlo con:
#!/bin/bash for i in {1..5} do echo $i done read -p "Pulse una tecla para continuar o espere 5 segundos." -N 1 -t 5 echo "" for i in {6..10} do echo $i done
Aunque read tiene más opciones, que podemos ver con:
read --help
con estas opciones que hemos aprendido en este artículo, podemos darle mayor interacción a nuestros scripts.