bash-exercises/class/scripts2/banco.sh

193 lines
4.3 KiB
Bash
Raw Normal View History

2025-01-15 19:52:08 +01:00
#!/bin/bash
FILE="./BANCO.txt"
RE='^[0-9]+$'
2025-01-16 21:49:39 +01:00
# Simple función para poder permitir al usuario leer la salida
# de una acción antes de limpiar la pantalla
2025-01-15 19:52:08 +01:00
pause() {
read -p "Pulse enter para continuar: "
}
2025-01-16 21:49:39 +01:00
# Lista los movimientos y los ordena con sort por su
# campo de fecha
2025-01-15 19:52:08 +01:00
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"
}
2025-01-16 21:49:39 +01:00
# Método cómodo de imprimir mensajes más bonitos sin repetirse
# mucho a uno mismo
2025-01-15 19:52:08 +01:00
formatear() {
TEXTO="$1"
echo -e "\n----------------------------------"
echo "$TEXTO"
echo -e "----------------------------------\n"
}
2025-01-16 21:49:39 +01:00
# Comprueba si no existe el archivo y lo crea en caso de que
# no exista
2025-01-15 19:52:08 +01:00
fileCheck() {
if [[ ! -f "$FILE" ]]; then
touch ./BANCO.txt
fi
}
2025-01-16 21:49:39 +01:00
# Algo no muy complicado, simplemente agarra entrada de usuario
# y la redirige al archivo
2025-01-15 19:52:08 +01:00
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!"
}
2025-01-16 21:49:39 +01:00
# Comprueba si la ID que le llegue por parámetro ya existe en la
# base de datos
2025-01-15 19:52:08 +01:00
checkExists() {
CHECK_TARGET="$1"
2025-01-16 21:49:39 +01:00
TARGET_CONTENTS=$(grep "^$CHECK_TARGET;*" $FILE)
2025-01-15 19:52:08 +01:00
if [[ -z $TARGET_CONTENTS ]]; then
return 1
fi
}
2025-01-16 21:49:39 +01:00
# Permite borrar un movimiento combinando sed con la anterior
# función para primero comprobar si existe
2025-01-15 19:52:08 +01:00
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!"
}
2025-01-16 21:49:39 +01:00
# 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
2025-01-15 19:52:08 +01:00
findFreeID() {
COUNT=0
while true; do
LINE=$(grep "^$COUNT;*" $FILE)
if [ -z "$LINE" ]; then
echo $COUNT
break
fi
let COUNT++
done
}
2025-01-16 21:49:39 +01:00
# Busca un movimiento individual por ID
2025-01-15 19:52:08 +01:00
searchMove() {
SEARCH_TARGET=$1
if ! checkExists $SEARCH_TARGET; then
formatear "Este movimiento no existe!"
return
fi
formatear "$(grep "^$SEARCH_TARGET;*" $FILE)"
}
2025-01-16 21:49:39 +01:00
# Mini-función utilizada en main() para buscar y borrar
# movimientos
2025-01-15 19:52:08 +01:00
search() {
read -p "ID de movimiento a buscar: " MOV
echo $MOV
}
2025-01-16 21:49:39 +01:00
# Función utilizada para sumar los saldos de todos los
# movimientos disponibles
2025-01-15 19:52:08 +01:00
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
}
2025-01-16 21:49:39 +01:00
# Función main, muy simplificada gracias a apoyarse en todas las
# funciones anteriores
2025-01-15 19:52:08 +01:00
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