miércoles, 19 de diciembre de 2012

Tutorial bash medium scripting 1

Como les prometi hace un tiempo cuando termine el curso básico de bash basico, iba a comenzar los de avanced scripting en el futuro y lo hare,pero de momento no,ya que necesito poner primero la dificultad siguiente,ya que es así:

basic scripting

medium scripting

avanced scripting

core scripting

Bueno quien sabe si va así o le invente de mas :P

Pero así lo veremos aquí en tiempo de tux :D

Así que podemos tachar basic scripting

La verdad yo a penas voy en avanced scripting y si me equivoco en algo o hago mala practica comenten,ya que es bueno aprender de los demás.

Bueno este tutorial y los que siguen (9 mas) van a ser basados en los de antes,osea que ya deben saber basic scripting.

Como dije yo no se bien,bien he leído libros de red hat y tutoriales (en ingles) sobre scripting,y como dije no vendría mal una ayuda (comentarios, correcciones,etc),bueno.

Primer ejemplo:

Crear un archivo con un bucle que se copie a otro,pero con verificadores por si existe alguno de los dos y romper el bucle cuando existan los dos :D

Primero creamos una función,que usaremos para que no sea tan rápido el proceso:

function dormir {

echo "Aguarde un segundo..."; "sleep 1;

}

Aquí lo que cabe ver es que usamos (;) para no usar mas lineas,ya que es lo que indican los (;)

Asignamos el nombre de los dos ficheros.

: ${fichero_uno="hello.txt"}
: ${fichero_dos="HolaMundo.txt"}

Creamos el bucle(while) y verificamos si no existe el primero,ya que sin el primero no podemos crear el segundo:


while [[ ! -e '${fichero_uno}' ]]

do
                          
# Comandos aquí

done


Verificamos con ! -e (visto en basic scripting)

Y llenamos el bucle:



echo "No existe:"; echo "${fichero_uno}"

dormir

Mostramos que no existe,para demostrar mas los ; los use ya que se podía hacer así también el comando echo:


echo -e "No existe:\n""${fichero_uno}"


Luego llamamos la función dormir que creamos para esperar un poco a que inicie lo interesante:

Creamos una estructura if que vea si existe el archivo 2 y si existe copia el archivo 2 a 1 y rompe el bucle,si no existe lo crea y se repite el bucle,cuando regrese ya existirá y hará lo de if:

if [ -e "${fichero_dos}" ]; then  

echo "${fichero_dos} existe"

dormir

cp ${fichero_dos} $fichero_uno}

break

else

echo "$fichero_dos} no existe"; dormir 

touch ${fichero_dos}

fi; 


Cuando rompa el bucle mostraremos:


echo "Test completo."; echo "$fichero_uno} y ${fichero_dos} existen"


Y así queda el script completo:


#!/bin/bash

function dormir {

echo "Aguarde un segundo..."; sleep 1;

}

: ${fichero_uno="hello.txt"}
: ${fichero_dos="HolaMundo.txt"}

while [[ ! -e "${fichero_uno}" ]]

do
                          
if [ -e "${fichero_dos}" ]; then  

echo "${fichero_dos} existe"

dormir

cp ${fichero_dos} ${fichero_uno}

break

else

echo "${fichero_dos} no existe"; dormir 

touch ${fichero_dos}

fi; 

done

echo "Test completo."; echo -e "${fichero_uno} y ${fichero_dos} existen\n""Haciendo ls a tus txt en $PWD"
dormir
ls *txt

Ejecuten y vean lo grandioso del script :P

Crea el archivo hello.txt y desde ese crea el holamundo.txt,pero verifica primero si no existe hello.txt :D

Ejemplo 2:

Un momento no es tan grandioso :(

Porque si ya existe hello.txt no crea holamundo.txt.

Como se soluciona esto?

Si solo lo ejecutan y hasta ahi no pasa nada,de hecho esperaría a que comentaran el error,pero el hecho no es que usen los ejemplos que aprendan,es que usen lo que aprendan con los ejemplos y si basan este algoritmo en otra cosa es cuando va a dar error :(

Lo solucionamos solamente haciendo una comparacion dual,en el bucle while usando una coma (,):

#!/bin/bash

function dormir {

echo "Aguarde un segundo..."; sleep 1;

}

: ${fichero_uno="hello.txt"}
: ${fichero_dos="HolaMundo.txt"}

while [[ ! -e "${fichero_uno}","${fichero_dos}" ]]

do
                          
if [ -e "${fichero_dos}" ]; then  

echo "${fichero_dos} existe"

dormir

cp ${fichero_dos} ${fichero_uno}

break

else

echo "${fichero_dos} no existe"; dormir 

touch ${fichero_dos}

fi; 

done

echo "Test completo."; echo -e "${fichero_uno} y ${fichero_dos} existen\n""Haciendo ls a tus txt en $PWD"
dormir
ls *txt


Y listo :D

Ejemplo 3:

Definir nuestros propios archivos:

#!/bin/bash

function dormir {

echo "Aguarde un segundo..."; sleep 1;

}

echo -n "Nombre fichero uno: "
read fichero_uno
echo -n "Nombre fichero dos: "
read fichero_dos

echo "Se creara el fichero dos del uno:"; dormir

while [[ ! -e "${fichero_uno}","${fichero_dos}" ]]

do
                          
if [ -e "${fichero_dos}" ]; then  

echo "${fichero_dos} existe"

dormir

cp ${fichero_dos} ${fichero_uno}

break

else

echo "${fichero_dos} no existe"; dormir 

touch ${fichero_dos}

fi; 

done

echo "Test completo."; echo -e "${fichero_uno} y ${fichero_dos} existen\n""Haciendo ls en $PWD"
dormir
ls *txt

Esto de que sirve?

Como el ejemplo es claro y sin objetivo, para nada,pero si usan este algoritmo sirve para muchas cosas,implementando mas comandos,funciones y bucles,por ejemplo para clonar un archivo/carpeta a otro y verificar que existan ambos,por si ya existen y no cometer un error.

Ejemplo 4:

No molestes :D

Como estos ejemplos son sucios podemos automatizar el borrado de toda la basura que estamos dejando con los archivos que estamos creando.

Primero creamos una carpeta,pero no lo haremos simple,usaremos el algoritmo de arriba(verificar y no dañar):


function carpeta {

echo -n "Crearemos una carpeta escriba el nombre que dese : "

read carpeta
mi_carpeta=`echo $carpeta`
}

carpeta

while [ 0 ]; do

if [ ! -d "${mi_carpeta}" ]; then

mkdir "${mi_carpeta}" && cd "${mi_carpeta}"

echo "Directorio actual $PWD"

break

else

echo "Ya existe la carpeta y puede contener algo importante,elije otro nombre"

carpeta

fi

done


Ahora agregamos el script anterior


#!/bin/bash

function dormir {

echo "Aguarde un segundo..."; sleep 1;

}

function carpeta {

echo -n "Crearemos una carpeta escriba el nombre que dese : "

read carpeta
mi_carpeta=`echo $carpeta`
}

carpeta

while [ 0 ]; do

if [ ! -d "${mi_carpeta}" ]; then

mkdir "${mi_carpeta}" && cd "${mi_carpeta}"

echo "Directorio actual $PWD"

break

else

echo "Ya existe la carpeta y puede contener algo importante,elije otro nombre"

carpeta

fi

done


echo -n "Nombre fichero uno: "
read fichero_uno
echo -n "Nombre fichero dos: "
read fichero_dos

echo "Se creara el fichero dos del uno:"; dormir

while [[ ! -e "${fichero_uno}","${fichero_dos}" ]]

do
                          
if [ -e "${fichero_dos}" ]; then  

echo "${fichero_dos} existe"

dormir

cp ${fichero_dos} ${fichero_uno}

break

else

echo "${fichero_dos} no existe"; dormir 

touch ${fichero_dos}

fi; 

done

echo "Test completo."; echo -e "${fichero_uno} y ${fichero_dos} existen\n""Haciendo ls en $PWD"
dormir
ls 

Y por ultimo agregamos un comprobado y un eliminador:


function adios {

echo -e "Directorio acual $PWD\n""Listando..."; ls $PWD 

echo -n "Borrar todo lo que se creo? n/s : "

read respuesta

case ${respuesta} in

s|S)

echo "Borrando archivos..."; dormir
rm "${fichero_dos}" && rm "${fichero_uno}"

echo "Borrando carpeta..."; dormir
cd ..; rmdir ${mi_carpeta}
exit 1;
;;
n|N)

echo "Buena eleccion ;P "; dormir; exit 1;
;;
*)

echo "Ok"; exit 1;
;;

esac

}

Y lo agregamos,pero primero incluimos también clear para un trabajo limpio

Y si queremos podemos añadir este, digamos "snipett" también:

function autodestruccion {

echo -n "Borrar este script tambien: "

read opcion

case ${opcion} in

s|S)

echo "Adios :("; rm $0
;;
n|N)

echo "Buena elección :)"; exit 1;
;;
*)
echo "Ok"; exit 1;
;;
esac

}

Y así queda el script


Enlace



Así es el medium scripting,bueno como dije no se si exista el medium scripting pero tenemos que ir poco a poco,porque esto que hicimos en el avanced scripting no es nada y menos en el core,ya que usamos:

sed,awk,perl,flujos estándares,cut, parámetros de desplazamiento,etc

Pero vamos bien :D

Eso es todo

3 comentarios:

  1. Se ve bien para empezar,pero los regex

    59206C6F732068657861646563696D616C6573 una pregunta ¿(^-^)? cuanto te tomo hacer este tutorial ya no explicaste bien lo ultimo

    Deberías hablar de desplazamiento de parámetros y de expresiones regulares

    ResponderBorrar
    Respuestas
    1. No soy fan de las regex de shell,si necesito un filtrado especial uso perl,y son de avanced scripting.

      Y si,no explique bien lo ultimo,porque ya esta explicado en basic scripting,lo único fue, que lo combine para realizar acciones mas avanzadas,no me tarde tanto pero ya me estaba aburriendo y en parte por eso ya no explique bien :P

      De desplazamiento de parámetros si voy a escribir :D

      Borrar
    2. De una vez lo hice :D

      http://www.itimetux.com/2012/12/desplazamiento-de-parametros-en-bash.html

      Borrar

Los comentarios serán revisados antes de ser publicados.