Intro-Tutorial Programación Bash Scripting

Publicado por Zero, Septiembre 23, 2013, 08:17:22 PM

Tema anterior - Siguiente tema

Zero

Hola Todos,

En esta oportunidad comparto con ustedes la primera parte de un tutorial en pdf de mi autoría, hubiese querido publicarlo en el foro directamente, pero debido al error que está presentando el mismo, con relación a algunas palabras entonces ni modo.
Este documento es algo así como una "edición especial" ya que en el original le había dado otro enfoque.

Tutorial Introduccion a la Programacion Bash Scripting Parte 1

Abrazos,



Lelouch
PDATA: Este tutorial puede que para el sysadmin promedio le parezca una completa pavada, pero está pensado para ser una guia para aquellos que recién ingresan a la programación en bash scripting.
Tutorial original: (cambia el enfoque): Aquí
En GNU/Linux formatear por cualquier cosa es de noobs, tu decides si eres uno...

firecold

Muy bueno amigo, la verdad me parece interesantisimo, he estado estudiando ultimamente esto y me servira mucho para repasar y aprender mas trucos, gracias amigo lelouch, Saludos

firecold

Gracias amigo Zero, gracias a tu Tutorial empeze a probar como hacer scripts, gracias a esto hice estos dos scripts, te muestro para ver si me puedes dar sugerencias:

Código (bash) [Seleccionar]
#!/bin/bash
clear
echo "|=====================================================================|"
echo ""
echo "       _            __  __  _____ "
echo "      | |          |  \/  |/ ____|"
echo "      | | ___   ___| \  / | |  __ "
echo "  _   | |/ _ \ / _ \ |\/| | | |_ |"
echo " | |__| | (_) |  __/ |  | | |__| |"
echo "  \____/ \___/ \___|_|  |_|\_____|"
echo ""
echo "+=====================================================================+"
echo "|                     ACTUALIZACION Raptor 1.04b                      |"
echo "|                            ;Debian 6 Y 7                             |"
echo "|                              64 bits                                |"
echo "+=====================================================================+"
echo ""
V='|------------------------------> V.64 <-------------------------------|'
ER='ERROR, su version de linux no es de 64 bits'
ER2='Use el script adecuado para su version'
P=`uname -m`
if [ $P = x86_64 ] ; then
  echo $V
else
  echo $ER
echo ""
  echo $ER2
echo ""
exit 0
fi
echo ""
echo Pulsa Enter para Acceder al Menu
read -n 0 -ers

COMANDO1=("CACHE_DIR /raptorcache/\nPLUGINS_DIR /etc/raptor/plugins/\nCACHE_LIMIT 90\nNO_DOMAIN1 youtube_mp4v\nNO_DOMAIN1 youtube_mp4a\n#-----------------------------------------------------------\n#Minimo y maximo tamaño de archivos en cache global\n#-----------------------------------------------------------\nMIN_OBJECT_SIZE 2048\n#-----------------------------------------------------------\n#Minimo y maximo tamaño de archivos en cache por Dominios\n#-----------------------------------------------------------\n#MIN_SIZE_YTIMG 2048\n#MAX_SIZE_YTIMG 0\n#-----------------------------------------------------------\n#Minimo y maximo tamaño de archivos en cache por Extensiones\n#-----------------------------------------------------------\nMIN_SIZE_JPG 2048\nMAX_SIZE_JPG 0\n#\nMIN_SIZE_JPEG 2048\nMAX_SIZE_JPEG 0\n#\nMIN_SIZE_PNG 2048\nMAX_SIZE_PNG 0\n#\nMIN_SIZE_GIF 2048\nMAX_SIZE_GIF 0\n#\nMIN_SIZE_FLV 2048\nMAX_SIZE_FLV 0\n#\nMIN_SIZE_CACHEPART 2048\nMAX_SIZE_CACHEPART 0\n#\nMIN_SIZE_MP3 2048\nMAX_SIZE_MP3 0\n#\nMIN_SIZE_MP4 2048\nMAX_SIZE_MP4 0\n#\nMIN_SIZE_SWF 2048\nMAX_SIZE_SWF 0\n#\nMIN_SIZE_EXE 2048\nMAX_SIZE_EXE 0\n#\nMIN_SIZE_BIN 2048\nMAX_SIZE_BIN 0\n#\nMIN_SIZE_DAT 2048\nMAX_SIZE_DAT 0\n#\nMIN_SIZE_TXT 2048\nMAX_SIZE_TXT 0\n#\nMIN_SIZE_DAT 2048\nMAX_SIZE_DAT 0\n#\nMIN_SIZE_DLL 2048\nMAX_SIZE_DLL 0\n#\nMIN_SIZE_CAB 2048\nMAX_SIZE_CAB 0\n#\nMIN_SIZE_MSI 2048\nMAX_SIZE_MSI 0\n#\nMIN_SIZE_MSP 2048\nMAX_SIZE_MSP 0\n#\nMIN_SIZE_MSU 2048\nMAX_SIZE_MSU 0\n#\nMIN_SIZE_PSF 2048\nMAX_SIZE_PSF 0\n#\nMIN_SIZE_DSTF 2048\nMAX_SIZE_DSTF 0\n#\nMIN_SIZE_XPI 2048\nMAX_SIZE_XPI 0\n#\nMIN_SIZE_ZIP 2048\nMAX_SIZE_ZIP 0\c")

COMANDO2=("http.*\.googlevideo\.com.*videoplayback\v")

##############################
# Genera un menú de opciones #
##############################
clear;
while [ "$OPCION" != 7 ]
do
echo "####################################################################"
echo "[1] Actualizar Debian"
echo "[2] Instalar actualizacion de Raptor 1.04b a Debian 6"
echo "[3] Instalar actualizacion de Raptor 1.04b a Debian 7"
echo "[4] Eliminar y editar el contenido de Raptor.conf"
echo "[5] Reiniciar Servicios Raptor y Squid"
echo "[6] Agregar Plugins y Regex Googlevideo y Youtube"
echo "[7] Salir"
echo "####################################################################"
read -p "Elija_una_opción:" OPCION
case $OPCION in
1) sudo apt-get update && sudo apt-get upgrade;clear;
echo "ACTUALIZACION DEL SISTEMA REALIZADA";;
2) sudo wget http://www.raptorcache.com/install/update/bin64/raptor_104b_64_d6.tar.gz && sudo rm -rf /usr/sbin/raptor && sudo mv raptor_104b_64_d6.tar.gz /tmp && sudo tar -xzvf /tmp/raptor_104b_64_d6.tar.gz -C / && sudo chmod a+x /usr/sbin/raptor;;
3) sudo wget http://www.raptorcache.com/install/update/bin64/raptor_104b_64_d7.tar.gz && sudo rm -rf /usr/sbin/raptor && sudo mv raptor_104b_64_d7.tar.gz /tmp && sudo tar -xzvf /tmp/raptor_104b_64_d7.tar.gz -C / && sudo chmod a+x /usr/sbin/raptor;;
4) sudo rm /etc/raptor/raptor.conf && sudo touch /etc/raptor.conf;
sudo echo -e $COMANDO1 >> /etc/raptor/raptor.conf && sudo chmod 777 /etc/raptor/raptor.conf;;
5) sudo service raptor restart && sudo service squid3 restart;;
6) sudo wget http://www.raptorcache.com/install/update/plugins/64/googlevideo_youtube.tar.gz && mv googlevideo_youtube.tar.gz /tmp && sudo tar -xzvf /tmp/googlevideo_youtube.tar.gz -C / && sudo chmod 777 /etc/raptor/plugins/youtube.com.so && sudo chmod 777 /etc/raptor/plugins/googlevideo.com.so && sudo echo -e $COMANDO2 >> /etc/raptor/raptor.lst;;
7) clear; echo "Hasta Luego"; break;;
*) clear; echo "Opción ingresada invalida, intentelo de nuevo";;

esac
done
exit 0


Código (bash) [Seleccionar]
#!/bin/bash
clear
echo "|=====================================================================|"
echo ""
echo "       _            __  __  _____ "
echo "      | |          |  \/  |/ ____|"
echo "      | | ___   ___| \  / | |  __ "
echo "  _   | |/ _ \ / _ \ |\/| | | |_ |"
echo " | |__| | (_) |  __/ |  | | |__| |"
echo "  \____/ \___/ \___|_|  |_|\_____|"
echo ""
echo "+=====================================================================+"
echo "|                    AGREGAR DISCOS DUROS CON LVM2                    |"
echo "|                     Debian, Ubuntu y Derivados                      |"
echo "|                       Cualquier Arquitectura                        |"
echo "|                            Alterserv.com                            |"
echo "+=====================================================================+"
echo ""
echo Pulsa Enter para Acceder al Menu
read -n 0 -ers
##############################
# Genera un menú de opciones #
##############################
clear;
function main_menu()
{
while :
do
echo "####################################################################"
echo "[1] Instalar Lvm2"
echo "[2] Identificacion y Creacion de Particion Lvm2"
echo "[3] Crear Grupos y Volumenes para Lvm2"
echo "[4] Formato de Particion Lvm2 en Ext4"
echo "[5] Edicion de Fstab, Creacion y Elecion de Carpeta a Montar Particion"
echo "[6] Montar Particion"
echo "[7] Agregar Mas de un DD a Thunder o Raptor - Sub-Menu"
echo "[8] Salir"
echo "####################################################################"
read -p "Elija_una_opción:" OPCION
case $OPCION in
1) sudo apt-get install lvm2;;
2) sudo fdisk -l | grep Disco;
echo "Elegir el Disco Duro a Crear con Lvm2 - Ej: /dev/sdb1";
read DD1;
sudo fdisk $DD1;;
3) sudo pvcreate $DD1 && sudo vgcreate /dev/vg0 $DD1 && sudo vgdisplay;
echo "Asignar Tamaño de Particion - Ej: 931,51GB:" | grep 931,51GB;
read TAM;
sudo lvcreate -L $TAM -n lv0 /dev/vg0;
echo "Creados el Grupo y el Volumen para Lvm2";;
4) sudo mke2fs -t ext4 /dev/vg0/lv0;
echo "TERMINADO EL FORMATO A PARTICION";;
5) echo -e "Elegir Carpeta a Montar - Ej: /thunder o /raptorcache:" | grep -e "/thunder" -e "/raptorcache";
read CARPETA;
sudo mkdir -p $CARPETA;
sudo chmod 777 -Rf $CARPETA;
sudo echo >> /etc/fstab;
sudo echo -e /dev/mapper/vg0-lv0   $CARPETA    ext4    noatime,async,nosuid   0      0 >> /etc/fstab;;
6) sudo mount $CARPETA;;
7) sub_menu ;;
8) clear; echo "Hasta Luego"; exit 0;;
*) clear; echo "Opción ingresada invalida, intentelo de nuevo";;
esac
done
}

function sub_menu()
{
while :
do
echo "####################################################################"
echo "[1] Identificacion y Creacion de Particion Lvm2"
echo "[2] Grupos y Volumenes que se Sumaran"
echo "[3] Aumentar al Tamaño Final"
echo "[4] Volver al Menu Principal"
echo "[5] Salir"
echo "####################################################################"
read -p "Elija_una_opción:" OPCION
case $OPCION in
1) sudo fdisk -l | grep Disco;
echo "Elegir el Disco Duro a Crear con Lvm2 - Ej: /dev/sdb1";
read DD2;
sudo fdisk $DD2;;
2) sudo pvcreate $DD2 && sudo vgextend vg0 $DD2 && sudo vgdisplay;
echo "Asignar Tamaño que se Sumara a la Particion - Ej: 931,51GB:" | grep 931,51GB;
read TAM1;
sudo lvextend -L +$TAM1 /dev/mapper/vg0-lv0;
echo "Agregados Grupos y Volumenes a Lvm2";;
3) sudo resize2fs /dev/mapper/vg0-lv0;;
4) main_menu;;
5) clear; echo "Hasta Luego"; exit 0;;
*) clear; echo "Opción ingresada invalida, intentelo de nuevo";;
esac
done
}

main_menu

exit 0


Saludos

Zero

Buen aporte filecold, recomendaciones tengo 2:
1. Usa funciones
2. las variables COMANDO# son muy largas (no tiene nada de malo, pero dificulta el mantenimiento y la lectura)

En lo personal no soy muy amigo de usar tantos && en la misma línea.

No hay necesidad de crear un script de 32 y otro de 64, te dejo un ejemplo de instalador/desinstalador:

PDTA: En un rato veo el segundo ;)

#!/bin/sh
addon_name="GurenMK I v1(ALPHA3.7)"
icon_file=""
info_file=""
file_32="http://goo.gl/8WBBm"
file_64="http://goo.gl/Fqrpq"
file_struct="http://dl.dropbox.com/u/60088540/addons/guren/guren.tar.gz"
index_file="http://goo.gl/XH9Bw"

iconf_name=""
info32_name=""
file32_name="guren.bfw"
info64_name=""
file64_name="guren.bfw64"
file_struct_name="guren.tar.gz"
index_name="index.cgi"

open_mnt() {
   [ -n "$(mount | grep "/mnt")" ] && is_mount=true || is_mount=false
   [ "$is_mount" = "false" ] && mount /dev/boot /mnt -t vfat >/dev/null 2>&1
}

close_mnt() {
   [ "$is_mount" = "false" ] && umount /mnt >/dev/null 2>&1
}

getfile(){
   echo "Downloading $2 ..."
   wget -U "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090405 Firefox/12" $1 -O $2 >/dev/null 2>&1
}

fn_download(){
   if [ "$(uname -m)" = "i686" ]; then
       getfile "$icon_file" "$iconf_name"
       getfile "$info_file" "$info32_name"
       getfile "$file_32" "$file32_name"
       getfile "$file_struct" "$file_struct_name"
   else
       getfile "$icon_file" "$iconf_name"
       getfile "$info_file" "$info64_name"
       getfile "$file_64" "$file64_name"
       getfile "$file_struct" "$file_struct_name"
   fi
}

mv_files(){
   if [ "$(uname -m)" = "i686" ]; then
       mv $iconf_name $info32_name $file32_name /mnt
       . /lib/system-functions
       extract /mnt/$file32_name >/dev/null 2>&1
   else
       mv $iconf_name $info64_name $file64_name /mnt
       . /lib/system-functions
       extract /mnt/$file64_name >/dev/null 2>&1
   fi
}

fn_create(){
   if [ -d "/partition/guren" ]; then
       [ ! -d "/partition/data" ] && mkdir /partition/data
       echo "Structure exist, skiping..."
       echo "Do you want to try update the index.cgi file? (Y/N)"
       echo "(This will be destroy previus changes)"
       read downindex
       [ "$downindex" = "Y" -o "$downindex" = "y" ] && { echo "Update index file"; getfile "$index_file" "$index_name"; mv $index_name /partition/guren/www/; } || echo "No update index file."
   else
       tar -zxvf /guren.tar.gz -C /partition
   fi
}

fn_cron(){
   if [ ! "$(grep "gurenmk" /etc/brazilfw/cron.cfg)" ]; then
       echo -e "\n1 0 * * * gurenmk createlist\n0 */2 * * * gurenmk block" >> /etc/brazilfw/cron.cfg
       /etc/init.d/cron reload >/dev/null 2>&1
       backup
   else
       echo "Gurenmk entry found..."
       backup
       /etc/init.d/cron reload >/dev/null 2>&1
   fi
}

fn_delpkg(){
   echo "Deleting guren package from mnt partition..."
   [ -f "/mnt/guren.bfw64" ] && rm /mnt/guren.bfw64
   [ -f "/mnt/guren.bfw" ] && rm /mnt/guren.bfw
}

fn_delcron(){
   sed -i /'gurenmk'/d /etc/brazilfw/cron.cfg
}

fn_delfiles(){
   echo "Remove webadmin..."; rm -R /var/htdocs/webadmin/guren
   echo "Remove gurenmk..."; rm /usr/bin/gurenmk
   echo "Do you want delete the structure too? (Y/N)"
   echo "(This will be destroy files of you clients, changes in portal, etc. If you think reinstall it hit N key)"
   read destroyall
   [ "$destroyall" = "Y" -o "$destroyall" = "y" ] && { echo "Deleting files in partition"; rm -R /partition/guren; rm -R /partition/data; echo "Ready"; } || echo "Keep structure ."
}

if [ "$1" = "destroy" ]; then
   echo -e "\e[0;32m░░░░░░░░  estroy $addon_name from BrazilFW 3x  ░░░░░░░░\e[0m"
   echo "[+] Clear clients redirections..."
   gurenmk restore
   echo "ready."
   echo "[+] Destroy packages from BrazilFW $(uname -m) ...."
   open_mnt
   [ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to mount device\e[0m"; exit 1; } || fn_delpkg
   [ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to delete guren package from mnt (file exist?)\e[0m"; exit 1; } || close_mnt
   echo "Destroy guren from cron:"
   fn_delcron
   [ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to remove guren from cron, not entries (may be?)\e[0m"; exit 1; } || backup
   fn_delfiles
   echo "Ready. Noy you can reinstall guren "
   exit 0
fi

echo -e "\e[0;32m░░░░░░░░  $addon_name for BrazilFW 3x  ░░░░░░░░\e[0m"
echo "[+] Downloading packages for BrazilFW $(uname -m) ...."
fn_download
[ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to get files\e[0m"; exit 1; } || open_mnt
[ "$?" -ne 0 ] && { echo -e "\e[0;31mFailed to mount device\e[0m"; exit 1; } || mv_files
[ "$?" -ne 0 ] && { echo -e "\e[0;31mError moving or extracting packages\e[0m"; exit 1; } || close_mnt
[ "$?" -ne 0 ] && { echo -e "\e[0;31mError moving or extracting packages\e[0m"; exit 1; } || { echo "[+] Creating Structure..."; fn_create; }
[ "$?" -ne 0 ] && { echo -e "\e[0;31mError creating structure\e[0m"; exit 1; } || fn_cron
echo -e "\e[1;34m$addon_name installed successful, before use guren pls remember change the info,images, and style sheet (css) in /partition/guren/www directory and modify the guren.conf file with the correct ip server, then use the command /etc/init.d/011-guren start.\e[0m"
En GNU/Linux formatear por cualquier cosa es de noobs, tu decides si eres uno...

firecold

Cita de: Zero en Noviembre 14, 2013, 12:04:40 PM
Buen aporte filecold, recomendaciones tengo 2:
1. Usa funciones
2. las variables COMANDO# son muy largas (no tiene nada de malo, pero dificulta el mantenimiento y la lectura)

En lo personal no soy muy amigo de usar tantos && en la misma línea.

No hay necesidad de crear un script de 32 y otro de 64, te dejo un ejemplo de instalador/desinstalador:

PDTA: En un rato veo el segundo ;)

Gracias amigo por las recomendaciones, solo que en el primero solo puse de 64bits, ya que por el momento la actualizacion solo esta para 64bits y para que no se confundieran instalando 64bits en 32bits, ya que muchas veces muchos no prestan atencion a estos detalles o no saben la diferencia, en las variables COMANDOS, tienes razon pero no se me dio la cabeza como hacerlo de otro modo, pense que bash era mas sencillo pero resulto bastante dificil recordar tanta cosa, me podrias enseñar como se hacen las funciones con un ejemplo y lo de los colores, lo estuve leyendo pero no lo entendi bien y ya no segui probando y si sabes como aumentar el tamaño de la letra, para hacer mas grandes los menus, gracias amigo, Saludos