#!/bin/bash
read -p "Introduce dos numeros separados por espacios ? " N T
echo "Has introducido $N y $T"
read -a A -p "Introduce 10 numeros separados por espacios ? "
for i in "${A[@]}"
do
echo -n "$i "
done
echoEn Bash, como ya sabemos, todas las variables contienen solo cadenas
de caracteres y necesitamos utilizar programas externos para realizar
operaciones numéricas (o alternativamente el doble paréntesis
((...))).
La función read nos ofrece el flag -a con
el cual podremos leer una secuencia de valores separados por espacios
directamente en un array.
Podemos acceder a los valores utilizando la expresión
$A[indice], sin embargo, en esta ocasión hemos utilizado un
bucle sobre el valor ${A[@]}. Cuando utilizamos el caracter
@ como índice del array, estaremos imprimiendo todos los
valores separados por espacios, lo cual es muy conveniente para iterar
sobre el array. También podríamos imprimir el array de esta forma:
for ((i = 0; i < ${#A[@]}; i++)); do echo -n "${A[$i]} "; doneLa línea anterior nos muestra además como obtener el tamaño del array y acceder a elementos individualmente.
Podemos convertir la salida de cualquier comando en un array utilizando la expresión
arr=($(comand)). Por ejemplo,F=($(ls))creará un array llamadoFconteniendo los ficheros del directorio actual.Otras expresiones útiles son:
arr+=(valor)Añade valor al final del array${!arr[@]}Retorna la lista de índices del array${arr[@]:inicio:fin}Retorna los elementos del array desde inicio a fin
La forma de poder controlar la validez de los datos que introduce el usuario es utilizando expresiones regulares. El siguiente fragmento de código muestra como podemos comprobar que el valor entrado es un entero.
read -p "Introduce un numbero: " num
if [[ $num =~ ^[0-9]+$ ]]; then
echo "Correct"
else
echo "Error: '$num' no es un número" >&2
fiNada loco como podéis ver.
Las expresiones regulares son una herramienta muy útil y potente que está disponible en muchos lenguajes y merece la pena dominar. Las expresiones regulares, en su forma más sencilla, como la usamos aquí. La expresión regular
^[0-9]+$se lee como lo siguiente.Busca algo que *
^esto fuerza a que lo que sigue debe estar al principio de la entrada *[0-9]+esto significa que esperamos números (caracteres del 0 al 9) y que debe existir al menos uno.+significa uno o más mientras que*significa 0 o más *$esto indica que la entrada debe terminar justo tras el patrón anterior.Un ejemplo un poco más complejo para aceptar números con decimales sería
^-?[0-9]+([.][0-9]+)?$, Veamos que hace: *^principio de línea *-?esto significa que puede seguir el signo menos. El?significa que el caracter que lo precede es opcional y puede aparecer o no. *[0-9+]+que como ya sabemos significa una secuencia de números. *([.][0-9]+)?$esta ya deberíais de ser capaz de leerla vosotros mismos. Los paréntesis seguidos de?indican que toda esta expresión es opcional (?), lo que significa que podremos leer número con o sin punto decimal. Una vez entendido eso, la expresión dentro de los paréntesis es la misma que la anterior pero comprobando que el primer caracter es un punto, el cual indica el inicio de la parte decimal.Si, amigos, las expresiones regulares son increíbles y super poderosas.
Como podéis ver, la validación de los datos suele ser la parte que requiere más código y además es la más engorrosa por lo que muchas veces se obvia especialmente en tutoriales o herramientas internas.
Sumario
- Podemos leer datos en nuestro programa utilizando
read readnos permite leer varios valores directamente en un array.- Podemos usar expresiones regulares para validar la entrada del usuario y detectar errores.
■
