Arnoldo Alvarez
Fredy Mendoza Vargas
Juan José Mamani Tarqui
Alvaro David Polanco P
eamedranoc1
Reinaldo Mendoza
Ignacio Bellucci
Rodrigo Corozo Salazar
KAYLEE DANAE PAEZ HOOKER
Jose Miguel Diaz
Edinson Padrón
freddy molleda
KAYLEE DANAE PAEZ HOOKER
Haward Rafael Tillero Jimenez
Marvin Javier Santos Fernández
Mario Alexander Vargas Celis
KAYLEE DANAE PAEZ HOOKER
Julian Lamadrid
DAVID EDUARDO BAEZ SANCHEZ
Hola. He modificado un poco el codigo original del profesos haciendo los siguientes cambios:
# ! /bin/bash # Programa para ejemplificar el uso del Break y Continue #Arnoldo Alvarez opcion=0 fechaActual=`date +%Y%m%d` #Esta es la funcion instalar PostGres instalar_postgres () { echo -e "\nVerificar si tenemos instalado PostGress..." sleep 3 verifyInstall=$(which psql) if [ $? -eq 0 ]; then echo "PostGres ya se encuentra instalado en el equipo " else read -s -p "Introduzca password de administrador " password read -s -p "Introduzca password a utilizar en PostGres " passwordPostgres echo "$password" | sudo -S apt update echo "$password" | sudo -S apt-get -y install postgresql postgresql-contrib sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{$passwordPostgres}';" echo "$password" | sudo -S systemctl enable postgresql.service echo "$password" | sudo -S systemctl start postgresql.service fi read -n 1 -s -r -p "Presione [ENTER] para continuar..." } #Esta es la funcion desinstalar PostGres desinstalar_postgres () { echo -e "\nVerificando si ya esta Desinstalado Postgres..." verifyInstall=$(which psql) if [ $? -eq 1 ]; then echo " PostGres NO se encuentra instalado en el Equipo " else read -s -p "Introduzca password de administrador " password echo -e "\n" echo "$password" | sudo -S systemctl stop postgresql.service echo "$password" | sudo -S apt-get -y --purge remove postgresql\* echo "$password" | sudo -S rm -r /etc/postgresql echo "$password" | sudo -S rm -r /etc/postgresql-common echo "$password" | sudo -S rm -r /var/lib/postgresql echo "$password" | sudo -S userdel -r postgres echo "$password" | sudo -S groupdel postgresql fi read -n 1 -s -r -p "Presione [ENTER] para continuar..." } #Esta es la funcion Sacar Respaldo sacar_respaldo () { echo "Listar las bases de datos..." sudo -u postgres psql -c "\l" read -p "Elegir la BD a respaldar: " bddRespaldo echo -e "\n" if [ -d "$1" ]; then echo "Establecer permisos directorio" echo "$password" | sudo -S chmod 755 $1 echo "Realizando respaldo..." sudo -u postgres pg_dump -Fc $bddRespaldo > "$1/bddRespaldo$fechaActual.bak" echo "Respaldo realizado Correctamente en la ubicacion: $1/bddRespaldo$fechaActual.bak" else echo -e "\nEl directorio $1 No Existe" echo -e "\n" read -n1 -p "Desea crear el directorio $1 (s/n)" respbdd if [ $respbdd = "s" ]; then sudo mkdir $1 echo "$password" | sudo -S chmod 755 $1 echo -e "\nRealizando respaldo..." sleep 3 sudo -u postgres pg_dump -Fc $bddRespaldo > "$1/bddRespaldo$fechaActual.bak" echo "Respaldo realizado Correctamente en la ubicacion: $1/bddRespaldo$fechaActual.bak" else echo -e "\nSaliendo sin realizar Respaldo..." sleep 3 fi fi read -n 1 -s -r -p "Presione [ENTER] para continuar..." } #Esta es la funcion Restaurar Respaldo restaurar_respaldo () { read -p "Ingresar el directorio donde se encuentran los respaldos " directorioBackup if [ -d $directorioBackup ]; then echo "Listando los archivos de Respaldos..." sleep 3 ls -la $directorioBackup read -p "Ingresar el archivo .bak a restaurar: " respaldoRestaurar #echo -e "\n" if [ -f "$directorioBackup/$respaldoRestaurar" ]; then read -p "Ingresar nombre BD destino: " bdDestino verifyBdd= $(sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -wq $bdDestino) if [ $? -eq 0 ]; then echo "Restaurando en la Base de Datos destino...$bdDestino" sudo -u postgres pg_restore -Fc -d $bdDestino "$directorioBackup/$respaldoRestaurar" echo "Listar Bases de datos..." sudo -u postgres psql -c "\l" else echo "La BD destino no se encuentra..." echo "Creando Base de Datos destino..." sleep 4 sudo -u postgres psql -c "CREATE DATABASE $bdDestino" sudo -u postgres pg_restore -Fc -d $bdDestino "$directorioBackup/$respaldoRestaurar" echo "Listar Bases de datos..." sudo -u postgres psql -c "\l" fi else echo "No se encuentra el archivo de Respaldo Ingresado" echo "Verifique nuevamente el nombre y vuelva a intentarlo..." fi else echo "No se encuentra el directorio de Respaldos ingresado..." echo "Verifique nuevamente el nombre y vuelva a intentarlo..." fi read -n 1 -s -r -p "Presione [ENTER] para continuar..." } lista_de_BD(){ echo -e "\Las Bases de Datos Actuales: " sudo -u postgres psql -c "\l" read -n 1 -s -r -p "Presione [ENTER] para continuar..." } while : do #Limpiar la pantalla clear #Desplegar el menu de opciones echo "----------------------------------------" echo "PGUTIL - Programa de Utilidades PostGres" echo "----------------------------------------" echo " MENU PRINCIPAL " echo "----------------------------------------" echo "1.Instalar Postgres " echo "2.Desinstalar Postgres " echo "3.Hacer un respaldo " echo "4.Restaurar respaldo " echo "5.Listar Bases de Datos Actuales " echo "6.Salir " #Leer los datos del Usuario - Capturar Opcion read -n1 -p "Ingrese una opcion [1-5]: " opcion #Validar la opcion ingresada case $opcion in 1) instalar_postgres #sleep 3 ;; 2) desinstalar_postgres #sleep 3 ;; 3) echo -e "\n" read -p "Indique Directorio: " directorioBackup sacar_respaldo $directorioBackup ;; 4) echo -e "\n" #read -p "Indique Directorio de Respaldos " directorioRespaldos restaurar_respaldo $directorioRespaldos ;; 5) lista_de_BD ;; 6) echo -e "\nSaliendo del programa...." exit 0 ;; esac done
Gracias Compañero!
Excelente amigo con tu codigo entendi mas esta ultima clase gracs
Lo que mas se agradece es que ya no volveré a escuchar "EL TEMA DE" por un largo tiempo, curso terminado. Como punto adicional y cosa que sinceramente no se si ocurre en platzi, los videos deberían ser revisados con mas rigor ya que el profesor se equivoca algunas ocasiones, sumado a la muletilla que se hace estresante y por ultimo el no explicar bien los comandos, tuve que recurrir a buscar, leer comentarios mirar otros tutoriales para algo que le tomaba al profesor 20 segundos.
Has descubierto ser autodidacta. No se sinceramente en que afecta que el profesor diga tema o no. De verdad me parece de mal gusto la burla generalizada cuando venimos es aprender. Si miras un poco mas allá te darás cuenta lo importante y valioso de este curso y el grado de dominio que tiene el docente.
Creo que se podría explicar mejor los comandos, pero parece que el tema no pasaba por ahi, sino que el tema era que el tema era otro tema
Basta de decir " EL TEMA DE "
Cuando la complejidad del script va en aumento, les recomiendo utilizar sus variables de la siguiente forma ${nombre_variable}, ya que así sabemos visualmente cuál es el nombre de la variable.
Ejemplo:
cp $directorio_respaldo/bak_file.txt /home/bak/ cp ${directorio_respaldo}/bak_file.txt /home/bak/
Al menos, bajo mi punto de vista, es más entendible a primera vista.
Felicidades si llegaste hasta aquí, has terminado el curso!
Me surge una duda: ¿Por qué utilizar una variable para verificar si psql esta instalado? No sería el mismo resultado que:
which psql | if [ $? -eq 0 ] ; then ... # comando a ejecutar fi
Yo sospecho que es un hack para evitar mostrar en la consola, lo que muestra el comando which. Mira mi comentario para una alternativa.
El truco está en aprovechar la información que genera el código de salida del pipe para validar un proceso combinado con la sentencia if ya que este código es igual a 0 si el ultimo pipe ejecutado fue exitoso de la contrario este código será igual a 1, si quieres saber información sobre otras utilizar este "código" indaga más sobre el tema.
Acá he encontrado la diferencia entre usar backtick y $() para asignación de variables en los scripts
https://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-commands
Y al parecer no hay diferencia como tal, se llaman command substitution y además de permitirnos asignar valores a variables, también nos permite hacer anidado de comandos
https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
Mi aporte
# !/bin/bash # Programa que permite manejar las utilidades de Postgres opcion=0 fechaActual=`date +%Y%m%d` #Funciòn para instalar Postgres instalar_Postgres () { clear echo "Verificando instalación de Postgres..." verifyInstall=$(which psql) if [ $? -eq 0 ]; then echo -e "\nPostgres ya se encuentra instalado en el equipo" else #Cuando se piden datos con read y se quiere usal salto de linea se usa $ y comillas simples read -s -p $'\nIngresar contraseña de sudo: ' pwdSudo read -s -p $'\nIngresar contraseña a ultilizar en Postgres: ' pwdPsql #Ejecutar comandos echo "$pwdSudo" | sudo -S apt update echo "$pwdSudo" | sudo -S apt-get -y install postgresql postgresql-contrib #Cambio de clave del usuario en Postgres sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{$pwdPsql}';" #Habilitar e iniciar servicio Postgres echo "$pwdSudo" | sudo -S systemctl enable postgresql.service echo "$pwdSudo" | sudo -S systemctl star postgresql.service fi #Solicitar que presionen una tecla para continuar read -n1 -s -r -p $'\nPresione [ENTER] para continuar' } #Función para Desinstalar Postgres desinstalar_Postgres () { clear echo "Iniciando proceso para Desinstalar Postgres..." read -s -p $'\nIngresar contraseña de sudo: ' pwdSudo echo -e "\n" echo "$pwdSudo" | sudo -S systemctl stop postgresql.service #Puede requerir este comando pero debe saber que versión tiene instalado #echo "$pwdSudo" | sudo -S pg_dropcluster --stop 14 main echo "$pwdSudo" | sudo -S apt-get -y --purge remove postgresql\* echo "$pwdSudo" | sudo -S rm -r /etc/postgresql echo "$pwdSudo" | sudo -S rm -r /etc/postgresql-common echo "$pwdSudo" | sudo -S rm -r /var/lib/postgresql echo "$pwdSudo" | sudo -S userdel -r postgres echo "$pwdSudo" | sudo -S groupdel postgresql read -n1 -s -r -p $'\nPresione [ENTER] para continuar' } #Función para hacer Backups sacar_Backup () { clear echo "Listar las BDD" sudo -u postgres psql -c "\l" read -p $'\nElegir la base de datos a respaldar: ' bddBackup echo -e "\n" if [ -d "$1" ]; then echo "Establecer permisos al directorio" echo "$pwdSudo" | sudo -S chmod 755 $1 echo -e "\nRealizando Backup..." sudo -u postgres pg_dump -Fc $bddBackup > "$1/bddBackup$fechaActual.bak" echo -e "\nBackup realizado Correctamente!" else echo "El directorio $1 no existe..." echo -e "\n" read -n1 -p "Desea crear el directorio $1? (s/n)" respuestaDir if [ respuestaDir = "s" ]; then sudo mkdir $1 echo "$pwdSudo" | sudo -S chmod 755 $1 echo -e "\nRealizando Backup..." sudo -u postgres pg_dump -Fc $bddBackup > "$1/bddBackup$fechaActual.bak" echo -e "\nBackup realizado Correctamente!" else echo -e "\nSaliendo sin realizar Backup..." fi fi read -n1 -s -r -p $'\nPresione [ENTER] para continuar' } #Función para Restaurar Backups restaurar_Backup () { echo "Listar Backups" ls -1 $1/*.bak read -p "Elegir el Backup a Restaurar: " backupRestore read -p $'\nIngrese el nombre de la BDD destino: ' bddDestino #Verificar si la BDD existe! verifyBdd=$(sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -wq $bddDestino) if [ $? -eq 0 ]; then echo "Restaurando en la BDD destino: $bddDestino" else sudo -u postgres psql -c "create database $bddDestino" fi #Verificar si el respaldo que se va restaurar existe if [ -f "$1/$backupRestore" ]; then echo "Restaurando Backup..." sudo -u postgres pg_restore -Fc -d $bddDestino "$1/$backupRestore" echo -e "\nListar la BDD" sudo -u postgres psql -c "\l" else echo -e "\nEl Backup $backupRestore no existe!" fi read -n1 -s -r -p $'\nPresione [ENTER] para continuar' } while : do #Limpiar la pantalla clear #Desplegar el menú de opciones echo "_________________________________________" echo "PGUTIL - Programa de Utilidad de Postgres" echo "_________________________________________" echo " MENÚ PRINCIPAL " echo "_________________________________________" echo "1. Instalar Postgres" echo "2. Desinstalar Postgres" echo "3. Hacer un Backup" echo "4. Restaurar un Backup" echo "5. Salir" #Leer los datos del usuario - capturar información read -n1 -p "Ingrese una opción [1-5]: " opcion #Validar la opción ingresada case $opcion in 1) instalar_Postgres ;; 2) desinstalar_Postgres ;; 3) clear read -p "Indique el Directorio de Backups: " directorioBackup sacar_Backup $directorioBackup ;; 4) clear read -p "Ingrese el Directorio donde se encuentran los Backups: " directorioRestaurar restaurar_Backup $directorioRestaurar ;; 5) echo -e "\n\nSalir del Programa..." exit 0 ;; esac done
Crear funciones en Bash para **sacar** y **restaurar respaldos** de una base de datos PostgreSQL es muy útil para automatizar tareas de mantenimiento. Aquí te muestro cómo definir dos funciones: una para hacer respaldos y otra para restaurarlos.
### Requisitos:
- Asegúrate de tener instalado el cliente de PostgreSQL (psql y pg\_dump).
- La base de datos debe ser accesible (credenciales y permisos correctos).
### 1. **Función para hacer respaldos:**
Para hacer un respaldo de una base de datos en PostgreSQL, puedes usar el comando pg\_dump. Aquí te dejo una función en Bash que permite realizar un respaldo:
hacer\_respaldo() {   local DB\_NAME=$1   local BACKUP\_DIR=$2   local DATE=$(date +'%Y%m%d\_%H%M%S')   local BACKUP\_FILE="$BACKUP\_DIR/$DB\_NAME-$DATE.sql"   if \[ -z "$DB\_NAME" ] || \[ -z "$BACKUP\_DIR" ]; then   echo "Uso: hacer\_respaldo nombre\_base\_datos directorio\_respaldo"   return 1   fi   echo "Realizando respaldo de la base de datos '$DB\_NAME' en '$BACKUP\_FILE'..."       pg\_dump -U postgres -F c -b -v -f "$BACKUP\_FILE" "$DB\_NAME"   if \[ $? -eq 0 ]; then   echo "Respaldo completado: $BACKUP\_FILE"   else   echo "Error al realizar el respaldo."   return 1   fi } \# Ejemplo de uso: \# hacer\_respaldo "mi\_base\_de\_datos" "/ruta/donde/guardar/respaldo"
#### Descripción:
- pg\_dump -U postgres -F c -b -v -f archivo nombre\_base:
- -U postgres: El usuario de PostgreSQL.
- -F c: Formato personalizado.
- -b: Incluir datos binarios.
- -v: Modo verboso (para ver más detalles del progreso).
- -f archivo: Archivo de salida donde se guardará el respaldo.
### 2. **Función para restaurar un respaldo:**
Para restaurar una base de datos desde un archivo de respaldo, puedes usar el comando pg\_restore. Aquí te muestro una función para restaurar el respaldo:
restaurar\_respaldo() {   local DB\_NAME=$1   local BACKUP\_FILE=$2   if \[ -z "$DB\_NAME" ] || \[ -z "$BACKUP\_FILE" ]; then   echo "Uso: restaurar\_respaldo nombre\_base\_datos archivo\_respaldo"   return 1   fi   echo "Restaurando base de datos '$DB\_NAME' desde '$BACKUP\_FILE'..."   \# Si la base de datos ya existe, se debe eliminar y crear nuevamente   psql -U postgres -c "DROP DATABASE IF EXISTS $DB\_NAME;"   psql -U postgres -c "CREATE DATABASE $DB\_NAME;"   \# Restaurar el respaldo   pg\_restore -U postgres -d "$DB\_NAME" -v "$BACKUP\_FILE"   if \[ $? -eq 0 ]; then   echo "Restauración completada."   else   echo "Error al restaurar la base de datos."   return 1   fi } \# Ejemplo de uso: \# restaurar\_respaldo "mi\_base\_de\_datos" "/ruta/al/archivo\_respaldo.sql"
#### Descripción:
- psql -U postgres -c "DROP DATABASE IF EXISTS nombre\_base;": Elimina la base de datos si existe.
- psql -U postgres -c "CREATE DATABASE nombre\_base;": Crea una nueva base de datos.
- pg\_restore -U postgres -d nombre\_base archivo\_respaldo: Restaura la base de datos desde el archivo de respaldo.
### 3. **Ejemplo de uso conjunto:**
Supón que tienes una base de datos llamada mi\_base\_de\_datos y deseas hacer un respaldo y luego restaurarlo.
#### Hacer el respaldo:
hacer\_respaldo "mi\_base\_de\_datos" "/ruta/donde/guardar/respaldo"
#### Restaurar el respaldo:
restaurar\_respaldo "mi\_base\_de\_datos" "/ruta/donde/guardar/respaldo/mi\_base\_de\_datos-20240921\_123456.sql"
### Consideraciones:
- **Autenticación**: Si estás ejecutando estos comandos desde un script, puedes configurar las variables de entorno para evitar que te pida la contraseña cada vez. Usa un archivo .pgpass o variables como PGPASSWORD:
```bash
export PGPASSWORD="mi_contraseña"
```
- **Usuarios y permisos**: Asegúrate de que el usuario tenga los permisos necesarios para crear y eliminar bases de datos.
Estas funciones automatizan el proceso de respaldo y restauración de bases de datos en PostgreSQL mediante Bash.
¿Cuál es la diferencia entre usar backtick en vez de $() para guardar valores en una variable?
#!/bin/bash # Este script muestra uso de funciones # Autor: Julian Lamadrid, jlamadrid, litocruz # Variables opcion=0 fechaActual=`date +%Y%m%d` # funciones instalar_postgres () { echo "Verificar Instalacion postgres.." verifypostgres=$(wich psql) # if [ which psql 1>2 2>/dev/null ]; then if [ $? -eq 0 ]; then echo -e "Psgress ya se encuentra instalado" else read -s -p "Ingresar contraseña ROOT: "password read -s -p "Ingresar contraseña postgres: "passwordpostgres echo "$password" | sudo -S apt update echo "$password" | sudo -S apt install postgresql postgresql-contrib sudo -u postgres psql -C "ALTER USER postgres WITH PASSWORD '{$passwordpostgres}';" echo "$password" | sudo -S systemctl enable postgresql.service echo "$password" | sudo -S systemctl start postgresql.service fi read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..." } desinstalar_postgres () { echo "Desinstalando postgres.." read -s -p "Ingresar contraseña ROOT: "password echo "$password" | sudo -S systemctl stop postgresql.service echo "$password" | sudo -S apt -y remove --purge postgresql\* echo "$password" | sudo -S rm -r /etc/postgresql echo "$password" | sudo -S rm -r /etc/postgresql-common echo "$password" | sudo -S rm -r /var/lib/postgresql echo "$password" | sudo -S userdel -r postgres echo "$password" | sudo -S groupdel postgresql read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..." } sacar_respaldo () { echo "Listar bases de datos postgres" sudo -u postgres psql -c "\l" read -p "Elegir la base de datos a respaldar" DBdump echo -e "\n" if [ -d "$1" ]; then echo "Establecer permisos de directorio" read -p -s "Ingresar contraseña ROOT: "password echo "$password" | sudo -S chmod 755 $1 echo "sacando respaldo.." sudo -u postgres pg_dump -Fc $DBdump > "$1/$DBdump$fechaActual.bak" echo "Respaldo realizado en $1/$DBdump$fechaActual.bak" else read -p -n 1 "El directorio $1 no existe, desea crearlo s/n?" crerdirectorio if [ $crerdirectorio = "s" ]; then mkdir $1 [ $? -eq 0 ] && echo "Directorio creado con exito. Vuelva a ingresar para realizar respaldo" || echo "error %?" fi fi read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..." } restaurar_respaldo () { echo "Listar respaldos" ls -la $1 read -p "Elegir el respaldo a restaurar: " respaldoRestaurar echo -e "\n" echo "Listar bases de datos postgres" sudo -u postgres psql -c "\l" read -p "Elegir la base de datos a respaldar" DBdump echo -e "\n" echo "restaurando respaldo.." sudo -u postgres pg_restore -Fc -d $DBdump "$1/$respaldoRpestaurar" read -n 1 -s -r -p "PRESIONE [ENTER] para continuar..." } while : do #Limpiar pantalla clear #Desplegar menu opciones echo "-----------------------------------------" echo "PGUTIL - Programa de utilidad de Postgres" echo "-----------------------------------------" echo " MENU PRINCIPAL " echo "1. Instalar Postgres" echo "2. Desinstalar Postgres" echo "3. Sacar un Respaldo" echo "4. Restaurar un Respaldo" echo "5. Exit" # Leer los datos del usuario - capturar info read -n1 -p "Ingrese opcion del [1-5]: " opcion echo -e "\n" #Validar opcion ingresada case $opcion in 1) instalar_postgres ;; 2) desinstalar_postgres ;; 3) read -p "Directorio Backup: " directoriobackup sacar_respaldo $directoriobackup ;; 4) read -p "Directorio Respaldo: " directoriorespaldo restaurar_respaldo $directoriorespaldo ;; 5) echo -e "\nSaliendo..." exit 0 ;; esac done
Muy potente