Secciones

sábado, 21 de noviembre de 2015

Guia de scripting bash para GNU/Linux I, introducción


La shell es el interprete de comandos, la consola o terminal de toda la vida, la capa más básica para comunicar al usuario con el kernel del sistema. Con ella podemos hacer potentes scripts para automatizar tareas que de por si son aburridas, triviales y costosas en tiempo humano. Sacrificando algo de tiempo en automatizarlas te ahorrará gritones de horas a tu yo del futuro, aunque para ello tendrás que sacrificar algo de  tiempo de tu yo presente.

Rendimiento respecto tiempo invertido

Para este tutorial me voy a basar en esta guia, comenzaré con unos conceptos básicos:
  • Como usar variables
  • Como imprimir información por pantalla
  • Uso básico de if, while y for

Para los ansiosos, teneis todo el código de este tutorial aqui. En próximos tutoriales ampliaré información y al final resolveré el problema de tener varios ficheros con texto no deseado para editarlos automáticamente.

Para los más pacientes, parto de la base de que no sois expertos en el tema aunque si sabeis algo de programar en general, dejaré todo extensamente comentado y bien tabulado para que no te pierdas en el proceso (vamos, como hago siempre).

Script bash coloreado en Atom

Puedes usar tu editor de texto favorito para hacer los scripts, yo usaré atom porque es multiplataforma, opensource, y colorea la sintaxis.

Crea el fichero "myfirstscript.sh" en la ruta que quieras. No olvides que a cada fichero que crees hay que darle permisos de ejecución, escritura y lectura, bien para cada usuario:
chmod +rwx myfirstscript.sh
O bien solo para el creador:
chmod u+rwx myfirstscript.sh
Y para ejecutarlo el clásico
./myfirstscript.sh
Conceptos básicos e importantes:

1.- Variables:
  • Tipo int, se asigna valor con nombre=value, siendo value un número.
  • Tipo string, se asigna el valor con nombre="value", siendo value caracteres
  • Tipo undefined, si no existe una variable, es NULL, y no se imprime
2.- Imprimir información:
  • Se usa el comando echo "mensaje"
  • El contenido de una variable se imprime ${nombre}
  • Si la variable (undefined) no existe no aparecerá nada.
3.- Comprobación if, manual, comparations.
  • Se usa la sintaxis if[condición]
  • then para el codigo que se debe ejecutar si es cierto
  • elif para más condiciones
  • else para los casos restantes
Ejemplo:
if [ -z "${var}" ] # Check if exist, z option true if size is zero
then
   echo "var no existe"
else
   echo "var si existe"
fi
 4.- Bucle while, manual, comparations.
  • Se usa la sintaxis while [ CONDICIÓN ]
  • do para el código que se debe ejecutar mientras sea cierta
  • El script saldrá del bucle si se deja de cumplir la condición, o se ejecuta un break
  • En caso contrario quedaría atrapado hasta que se mate el proceso con kill o se mate el actual en consola con Control+C
Ejemplo:
counterwhile=0
while [ ${counterwhile} -lt 5 ]
    do
    echo "Hola iteración: ${counterwhile}"
    let counterwhile=counterwhile+1 # Forward
    #break
done
Nota: Si descomentas el break, saldrá en la primera iteración, sino imprimirá de la 0 a la 4.

5.- Bucle for, manual.
  • Se usa la sintaxis for NOMBRE in LISTA
  • do para el código que se debe ejecutar en cada iteración, al terminar done
  • El script termina al acabar la llista, o se ejecuta un break
  • Siempre acaba.
Ejemplo:
  for name in {1..5}
  do
      echo "  Variable name is: ${name}"
      #break
  done
Nota: Si descomentas el break, saldrá en la primera iteración, sino imprimirá de la 1 a la 5.

Ahora si, copia el código del snippet, pegalo en myfirstscript.sh, y ejecutalo. Se debería crear las carpetas input y output, y dar como salida:
------- My first script begins execution...
--------------------------------------------
  If you want to print a special character use \ before, # is not, $ is a special characters
  Variable with type int intvariable, ${intvariable} contains 5
  Variable with type string inputpath, ${inputpath} contains ./input
  Variable with type string outputpath, ${outputpath} contains ./output
  An unassigned variable no exist, so ${unassigned} = NULL =
  Check if exist input path...
  Creating input folder...
  Check if exist output path...
  Creating output folder...
  Check if exist file: myfile, with extension dat, full name is: myfile.dat
  File: myfile.dat not found, creating...
  List with files in ./output:
  Filename 0: myfile_0.dat   -    full: ./output/myfile_0.dat
  Filename 1: myfile_1.dat   -    full: ./output/myfile_1.dat
  Filename 2: myfile_2.dat   -    full: ./output/myfile_2.dat
  Filename 3: myfile_3.dat   -    full: ./output/myfile_3.dat
  Filename 4: myfile_4.dat   -    full: ./output/myfile_4.dat
  ls show a list of all of them too:
myfile_0.dat  myfile_1.dat  myfile_2.dat  myfile_3.dat    myfile_4.dat
------- My first script end now!
---------------------------------
Para cualquier duda, google es tu amigo, y sino busca ayuda en stackoverflow después de leerte las normas.

No hay comentarios:

Publicar un comentario