Entrada de Datos. BASH
SOLUCIONARIO
Entrada de Datos. BASH
2026-06-21
Por
Occam's Razor

#!/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
echo

En 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]} "; done

La línea anterior nos muestra además como obtener el tamaño del array y acceder a elementos individualmente.

 

SABÍAS QUE

Podemos convertir la salida de cualquier comando en un array utilizando la expresión arr=($(comand)). Por ejemplo, F=($(ls)) creará un array llamado F conteniendo 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
fi

Nada loco como podéis ver.

 

SOY NOVATO

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
  • read nos permite leer varios valores directamente en un array.
  • Podemos usar expresiones regulares para validar la entrada del usuario y detectar errores.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)