Apuntes mientras aprendo sobre software y computadoras.

programación

Un programa para conocer las frutas y verduras de estación usando Bash

En este apunte práctico voy a revisar una opción para crear un programa que nos permite conocer las frutas y verduras de estación utilizando el lenguaje de programación Bash.

Si bien hay muchas formas de conocer esta información creo que este ejercicio puede ayudarnos. Este apunte va a permitirnos conocer estos datos de una forma sencilla utilizando solamente las herramientas dentro de nuestro sistema Linux.

Más importante aún se trata de una buena forma de practicar un poco más, desarrollando otro ejercicio escrito en Bash.

La idea

El objetivo es contar con una aplicación que pueda hacer dos cosas:

1- El programa puede reconocer el mes en el que nos encontramos, y en base a eso nos entrega la lista de productos de temporada.

2- Podemos buscar directamente un producto, y la aplicación va a decirnos a que temporada pertenece.

La información de frutas y verduras de estación pertenece a la Argentina. Pero con algunos pequeños cambios, el programa puede ser utilizado en cualquier lugar.

El programa

Este es el programa completo. Lo comparto directamente por si te interesa empezar a analizarlo, aunque luego voy a revisar algunas otras partes por separado.

#!/bin/bash

# Este programa nos permite conocer las frutas y verduras de temporada en Argentina. 
# Podemos descubrir las frutas y verduras de estación en base a la fecha del sistema actual de nuestra computadora.
# También podemos buscar una hortaliza en particular, y va a decirnos la temporada asociada. 


# Frutas por temporada para cada estación
declare -A temporada_productos=(
  ["Primavera"]="Las frutas y verduras correspondientes a la estación de Primavera son: remolacha, zapallito, radicha, perejil, puerro, habas, lechuga, nabiza, nabo, acelga,\
   apio, alcaucil, espárrago, frutilla, frambuesa, cereza, arándano, manzana, naranja, palta, ananá, banana, frutilla, limón."
  
  ["Otoño-Invierno"]="Las frutas y verduras correspondientes a la estación de Otoño-Invierno son: aceitunas, acelga, achicoria, apio, batata, berro, brócoli, cardo, coliflor,\
  cebolla de verdeo, chaucha, escarola, espinaca, hinojo, nabo, nabiza, puerro, rábano, radicheta, remolacha, repollo, repollitos de Bruselas, zanahoria, zapallo, calabaza, banana,\
  ciruela, durazno, limón, mandarina, melón, membrillo, naranja, palta, pelón, pera, pomelo."
  
  ["Verano"]="Las frutas y verduras correspondientes a la estación de Verano son: zapallo, calabaza, rabanito, tomate, espárrago, morrón, cebolla, chauchas,\
  pepino, acelga, berenjena, choclo, frambuesa, mora, manzana, sandía, uva, limón, pelón, pera, arándanos, frutilla, higo, mamón, melón, naranja, ananá, ciruela, cereza, damasco, durazno."
)

# Funcion para encontrar la temporada segun el mes del sistema usando "Date"
determinar_temporada() {
  local mes_actual=$(date +%m)
  local temporada=""

  case $mes_actual in
    09|10|11|12)
      temporada="Primavera"
      ;;
    01|02|03)
      temporada="Verano"
      ;;
    04|05|06|07|08)
      temporada="Otoño-Invierno"
      ;;
    *)
      echo "Ese número no corresponde a ninguna temporada"
      return
      ;;
  esac

  echo "${temporada_productos[$temporada]}"
}

# Declarar array para buscar palabra con el contenido de cada temporada
declare -a temporadas=(
 "Primavera:remolacha zapallito radicha perejil puerro habas lechuga nabiza nabo acelga apio alcaucil esparrago frutilla frambuesa cereza arandano manzana naranja palta anana banana frutilla limon"
  
 "Verano:zapallo calabaza rabanito tomate esparrago morron cebolla chauchas pepino acelga berenjena choclo frambuesa mora manzana sandia uva limon pelon pera arandanos frutilla higo mamon melon naranja anana ciruela cereza damasco durazno"
  
 "Otoño-Invierno:aceitunas acelga achicoria apio batata berro brocoli cardo coliflor verdeo chaucha escarola espinaca hinojo nabo nabiza puerro rabano radicheta remolacha repollo repollitos de Bruselas zanahoria zapallo calabaza banana ciruela durazno limon mandarina melon membrillo naranja palta pelon pera pomelo"
)

# Función para revisar si la fruta se encuentra en la temporada
revisar_temporada() {
 local fruta="$1"
 local temporadas_encontradas=()

 for temporada_def in "${temporadas[@]}"; do
    IFS=':' read -r temporada_nombre frutas <<< "$temporada_def"
    if [[ "$frutas" =~ (^| )"$fruta"($| ) ]]; then
      temporadas_encontradas+=("$temporada_nombre")
    fi
 done

 if [ ${#temporadas_encontradas[@]} -eq 0 ]; then
    echo " '$fruta' no aparece entre los datos."
 else
    echo " '$fruta' pertenece a las temporadas de: ${temporadas_encontradas[*]}"
 fi
}


# Opciones para usar el comando en la terminal
case "$1" in
  -t)
    determinar_temporada
    ;;
  -b)
    # Revisar si un argumento fue pasado con el comando
    if [ $# -ne  2 ]; then
      echo "Opciones: ./script.sh [-b <fruta>] [-t]"
    else
      revisar_temporada "$2"
    fi
    ;;
  *)
    echo "Opciones: ./script.sh [-b <fruta>] [-t]"
    ;;
esac

Las partes

Al igual que dije antes, el programa consiste en dos partes.

En la primera parte vamos a recibir una lista completa de frutas y verduras según el mes del sistema. A partir del mes vamos saber la estación meteorológica en la que nos encontramos.

Primero establecemos el texto que nos va a informar en la terminal para saber que producto corresponde a cada estación:

# Frutas por temporada para cada estación
declare -A temporada_productos=(
  ["Primavera"]="Las frutas y verduras correspondientes a la estación de Primavera son: remolacha, zapallito, radicha, perejil, puerro, habas, lechuga, nabiza, nabo, acelga,\
   apio, alcaucil, espárrago, frutilla, frambuesa, cereza, arándano, manzana, naranja, palta, ananá, banana, frutilla, limón."
  
  ["Otoño-Invierno"]="Las frutas y verduras correspondientes a la estación de Otoño-Invierno son: aceitunas, acelga, achicoria, apio, batata, berro, brócoli, cardo, coliflor,\
  cebolla de verdeo, chaucha, escarola, espinaca, hinojo, nabo, nabiza, puerro, rábano, radicheta, remolacha, repollo, repollitos de Bruselas, zanahoria, zapallo, calabaza, banana,\
  ciruela, durazno, limón, mandarina, melón, membrillo, naranja, palta, pelón, pera, pomelo."
  
  ["Verano"]="Las frutas y verduras correspondientes a la estación de Verano son: zapallo, calabaza, rabanito, tomate, espárrago, morrón, cebolla, chauchas,\
  pepino, acelga, berenjena, choclo, frambuesa, mora, manzana, sandía, uva, limón, pelón, pera, arándanos, frutilla, higo, mamón, melón, naranja, ananá, ciruela, cereza, damasco, durazno."
)

Y para eso utilizamos los datos encontrados en este enlace.

Más tarde vamos a usar esta información como respuesta a una función.

Se pude notar que la distinción es por medio de tres conjuntos: “Primavera”, “Verano” y “Otoño-Invierno”. Esto es igual que en el sitio donde encontramos los datos.

Luego utilizamos el comando “date” en la variable local “mes_actual” para conocer el mes en el que se encuentra del sistema.

En base a ese número, la función “determinar_temporada” nos permite descubrir el mes en el que nos encontramos y presentar en la terminal las hortalizas pertenecientes a ese rango.

# Funcion para encontrar la temporada segun el mes del sistema usando "Date"
determinar_temporada() {
  local mes_actual=$(date +%m)
  local temporada=""

  case $mes_actual in
    09|10|11|12)
      temporada="Primavera"
      ;;
    01|02|03)
      temporada="Verano"
      ;;
    04|05|06|07|08)
      temporada="Otoño-Invierno"
      ;;
    *)
      echo "Ese número no corresponde a ninguna temporada"
      return
      ;;
  esac

  echo "${temporada_productos[$temporada]}"
}

En esta función llamada “determinar temporada” estamos usando el comando “case” para encontrar coincidencias.

Ante el primer patrón encontrado que sea igual a la variable “mes_actual”, case ejecuta alguna de las clausulas propuestas.

La segunda parte del programa implica la posibilidad de buscar un producto por separado, para saber cuándo es su temporada. Sabiendo esto vamos a poder conseguir productos más frescos y económicos.

Primero creamos unos array que contienen cada producto de cada estación, sin separación entre palabras:

# Declarar array para buscar palabra con el contenido de cada temporada
declare -a temporadas=(
 "Primavera:remolacha zapallito radicha perejil puerro habas lechuga nabiza nabo acelga apio alcaucil esparrago frutilla frambuesa cereza arandano manzana naranja palta anana banana frutilla limon"
  
 "Verano:zapallo calabaza rabanito tomate esparrago morron cebolla chauchas pepino acelga berenjena choclo frambuesa mora manzana sandia uva limon pelon pera arandanos frutilla higo mamon melon naranja anana ciruela cereza damasco durazno"
  
 "Otoño-Invierno:aceitunas acelga achicoria apio batata berro brocoli cardo coliflor verdeo chaucha escarola espinaca hinojo nabo nabiza puerro rabano radicheta remolacha repollo repollitos de Bruselas zanahoria zapallo calabaza banana ciruela durazno limon mandarina melon membrillo naranja palta pelon pera pomelo"
)

Luego necesitamos una función que contraste el argumento pasado con el comando. Si el valor coincide con alguno en el array, la aplicación nos dice a cuál.

# Función para revisar si la fruta se encuentra en la temporada
revisar_temporada() {
 local fruta="$1"
 local temporadas_encontradas=()

 for temporada_def in "${temporadas[@]}"; do
    IFS=':' read -r temporada_nombre frutas <<< "$temporada_def"
    if [[ "$frutas" =~ (^| )"$fruta"($| ) ]]; then
      temporadas_encontradas+=("$temporada_nombre")
    fi
 done

 if [ ${#temporadas_encontradas[@]} -eq 0 ]; then
    echo " '$fruta' no aparece entre los datos."
 else
    echo " '$fruta' pertenece a las temporadas de: ${temporadas_encontradas[*]}"
 fi
}

Y por último tenemos la implementación del programa para la terminal, lo que nos permite agregarle distintas opciones:

# Opciones para usar el comando en la terminal
case "$1" in
  -t)
    determinar_temporada
    ;;
  -b)
    # Revisar si un argumento fue pasado con el comando
    if [ $# -ne  2 ]; then
      echo "Opciones: ./script.sh [-b <fruta>] [-t]"
    else
      revisar_temporada "$2"
    fi
    ;;
  *)
    echo "Opciones: ./script.sh [-b <fruta>] [-t]"
    ;;
esac

La opción “-t” ejecuta la función que revisa automáticamente el mes en el equipo y nos da la información.

La opción “-b” nos permite acompañar el comando de una palabra de búsqueda, por ejemplo:

temporada -b tomate

Y si no utilizamos ninguna opción, el programa nos muestra las distintas alternativas:

"Opciones: ./script.sh [-b <fruta>] [-t]"

Se puede notar que mi programa tiene el nombre de “temporada”. Pero podemos darle cualquier nombre antes de otorgarle permiso de ejecución y de agregarlo al camino de programas ejecutables.

Posibles mejoras

Entre las posibles mejoras para el programa se me ocurre:

1- Agregar los datos de los productos de una forma diferente. Por ejemplo, la búsqueda puede realizarse dentro de un archivo de texto externo en lugar de utilizar directamente el código para guardar el nombre de las frutas y verduras.

2- Se pueden agregar excepciones para poder evitar errores al ingresar una variable de búsqueda.

3- También podríamos pedir el dato de búsqueda por medio de una pregunta. Sería una alternativa a tener que agregar la variable al momento de ejecutar el comando.

Seguramente hay otras muchas formas de mejorar el programa, muchas otras alternativas para volverlo algo más complejo.

Conclusión

Con esto le doy un cierre a este apunte práctico. Revisamos algunas posibilidades sobre un programa que nos permite conocer las frutas y verduras de estación utilizando el lenguaje de programación Bash.

Cualquier error que encuentres en el material, por favor decímelo para que pueda corregirlo.

Me gustaría conocer tus opiniones sobre el tema en los comentarios.

La seguimos en el próximo apunte.

Recursos:

Leave a Reply