#!/bin/bash FILE="./BANCO.txt" RE='^[0-9]+$' # Simple función para poder permitir al usuario leer la salida # de una acción antes de limpiar la pantalla pause() { read -p "Pulse enter para continuar: " } # Lista los movimientos y los ordena con sort por su # campo de fecha list() { FILE_CONTENTS="$(cat $FILE | sort -t ';' -k3)" if ! checkExists $FILE_CONTENTS; then formatear "Tu cuenta no tiene ningún movimiento!" return fi formatear "$FILE_CONTENTS" } # Método cómodo de imprimir mensajes más bonitos sin repetirse # mucho a uno mismo formatear() { TEXTO="$1" echo -e "\n----------------------------------" echo "$TEXTO" echo -e "----------------------------------\n" } # Comprueba si no existe el archivo y lo crea en caso de que # no exista fileCheck() { if [[ ! -f "$FILE" ]]; then touch ./BANCO.txt fi } # Algo no muy complicado, simplemente agarra entrada de usuario # y la redirige al archivo addMove() { read -p "Nombre: " NOMBRE FECHA=$(date -u +%Y-%m-%d_%H-%M-%S) IMPORTE= while [[ ! $IMPORTE =~ $RE ]]; do read -p "Importe: " IMPORTE done read -p "Descripción: " DESCRIPCION NUM_MOV=$(findFreeID) echo "$NUM_MOV;$NOMBRE;$FECHA;$IMPORTE;$DESCRIPCION" >> $FILE formatear "Movimiento exitosamente añadido!" } # Comprueba si la ID que le llegue por parámetro ya existe en la # base de datos checkExists() { CHECK_TARGET="$1" TARGET_CONTENTS=$(grep "^$CHECK_TARGET;*" $FILE) if [[ -z $TARGET_CONTENTS ]]; then return 1 fi } # Permite borrar un movimiento combinando sed con la anterior # función para primero comprobar si existe deleteMove() { DELETE_TARGET="$1" if ! checkExists $DELETE_TARGET; then formatear "Este movimiento no existe!" return fi formatear "$TARGET_CONTENTS" read -p "Desea borrar este movimiento? [y/N] " ELEC if [[ $ELEC != "y" ]]; then return fi sed -i "/^$DELETE_TARGET;/d" $FILE formatear "Movimiento exitosamente borrado!" } # Probablemente lo más interesante que ha salido de este script: # Una manera de poder buscar identificadores libres al crear nuevos # movimientos la cual es también compatible con identificadores de # entradas anteriormente borradas, muy útil, probablemente reutilizaré # esta lógica en el futuro con un lenguaje de verdad findFreeID() { COUNT=0 while true; do LINE=$(grep "^$COUNT;*" $FILE) if [ -z "$LINE" ]; then echo $COUNT break fi let COUNT++ done } # Busca un movimiento individual por ID searchMove() { SEARCH_TARGET=$1 if ! checkExists $SEARCH_TARGET; then formatear "Este movimiento no existe!" return fi formatear "$(grep "^$SEARCH_TARGET;*" $FILE)" } # Mini-función utilizada en main() para buscar y borrar # movimientos search() { read -p "ID de movimiento a buscar: " MOV echo $MOV } # Función utilizada para sumar los saldos de todos los # movimientos disponibles calcTotal() { TOTAL=0 CALC_COL=$(cut -d ";" -f 4 $FILE) while read -r v; do TOTAL=$(($TOTAL + $v)) done<<<$CALC_COL formatear "Tienes un total de $TOTAL€ en movimientos!" } status() { clear cat <<'END_CAT' +-----------------------------------------------------------------+ | MENU DEL BANCO | +-----------------------------------------------------------------+ | a - Añadir un movimiento bancario. | | b - Buscar un movimiento bancario por NUM_MOV. | | l - Listar todos los movimientos bancarios ordenados por fecha. | | t - Calcular el saldo total de la cuenta. | | d - Eliminar movimiento bancario. | | s - Salir del programa. | +-----------------------------------------------------------------+ END_CAT } # Función main, muy simplificada gracias a apoyarse en todas las # funciones anteriores main() { fileCheck while true; do status read -p "Opción: " OPT case "$OPT" in "a") addMove pause ;; "b") MOV=$(search) searchMove "$MOV" pause ;; "l") list pause ;; "t") calcTotal pause ;; "d") MOV=$(search) deleteMove "$MOV" pause ;; "s") exit ;; esac done } main