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.