Scripts en Linux
Scripts en Linux
Scripts en Linux
INDICE
1- Que es el shell script?...........................................................................
3
2- Cmo ejecutar un script?......................................................................
3
3- Cdigo de un script.................................................................................
4
Ejemplos....................................................................................... 5
3.1- Depuracin............................................................................ 6
3.2- Estructuras condicionales...................................................... 6
3.3- Operaciones algebricas........................................................ 9
4- Bucles FOR..............................................................................................
11
5- Bucles WHILE..........................................................................................
13
5.1- Comando test........................................................................ 13
5.2- While..................................................................................... 15
5.3- Until...........................................................................................................
17
6- Parametros posicionales........................................................................
18
7- IFS Delimitador.......................................................................................
19
8- Arrays.....................................................................................................
20
9- Funciones...............................................................................................
21
10- Leer un fichero.......................................................................................
23
11- Creacin de demonios...........................................................................
24
11.1- Ejecutar un demonio o script sin contrasea.....................
27
12- Uso del Cron........................................................................................... 27
13- Colores en la consola.............................................................................
29
Explicacin
Nmero mximo de caracteres que puedes introducir por
teclado
Opcin
Explicacin
Muestra por pantalla una frase para tu saber que debes
-p frase
introducir
Especificas cual va a ser el delimitador, es decir si dices
que el delimitador sera ; pues todo lo que venga antes
-d delimitador de un ; lo coger una variable y todo lo que venga
despus de ese delimitador hasta el prximo ; lo coger
otra variable.
Cuando queremos utilizar el valor de una variable en el cdigo, nos referiremos a
ste como:
$nombre_variable
EJEMPLOS 1
Estos son algunos de los ejemplos de esta primera parte. Para ejecutarlos slo
hay que crear un archivo .sh y copiar las letras negras, lo azul es la sugerencia
para el nombre del script.
A lo largo de los ejemplos se introducen algunos comandos bsicos de Linux.
HolaMundo.sh
#! /bin/bash
clear
echo Hola mundo ,este es mi primer script
ScriptUno.sh
#! /bin/bash
clear
nombre=Perico
apellidos=Palotes
echo Te llamas $nombre $apellidos
Fecha.sh
#! /bin/bash
clear
fecha=`date | cut -d -f 1,2,3`
hora=`date | cut -d -f 4`
echo Hoy es $fecha y son las $hora
OtroScript.sh
#! /bin/bash
clear
# IFS es una variable de entorno que determina el delimitador de
#campos
# (que por defecto vale ),en este script queremos
# cambiarlo a , para escribir por teclado nombre,apellidos
IFS=,
read -p Introduce el nombre,apellidos : nombre apellidos
echo El nombre es $nombre y los apellidos son $apellidos
3.1- Depuracin
Depuracin de programas es el proceso de identificar y corregir errores de
programacin.
En ingls se le conoce como debugging, ya que se asemeja a la eliminacin de
bichos (bugs), manera en que se conoce informalmente a los errores de
programacin. Se dice que el trmino bug proviene de la poca de las
computadoras de bulbos, en las cuales los problemas se generaban por los
insectos que eran atrados por las luces y estropeaban el equipo.
Depurar el cdigo sirve para ver como se ejecuta paso por paso el script, que
valores toman sus variables, si has cometido un fallo saber en que parte del
cdigo ha sido, etc. No es algo que se deba hacer obligatoriamente por cada script
realizado (sera demasiado pesado) pero te facilita mucho a la hora de buscar el
problema que te surja.
Hay dos formas :
1. En la lnea #! /bin/bash -x | -v
2. En el comando sh
SINTAXIS:
sh [OPCIONES] [nombre_script]
Opcin
Explicacin
-x Para saber donde se produce un error en nuestro script. Muestra
Opcin
-n
-e
-v
Explicacin
las instrucciones antes de ejecutarlas por consola y sustituyendo
las variables
Chequea la sintaxis de nuestro script, (no lo ejecuta).
Obliga a finalizar el script en caso de que algun comando falle.
Muestra las lneas de entrada segn se leen sin sustituir las
variables.
if condicion
then
instrucciones
elif condicion
then
instrucciones
elif condicion
then
instrucciones
fi
Ahora lo que hace es evaluar la condicin, si es verdadera entra por el
then, pero si no y se da el caso de otra condicin entrara por el elif, los
elif no se cierran, solamente el fi final corresponde a la apertura del if.
La condicin es cualquier cosa que de un return (que devuelva) algo
que sea 0 o verdadero.
Notese el uso del archivo /dev/null como archivo vaco para comprobar
algunascondicionales.
Vemos como podemos hacer un script para comprobar que realmente
la ruta es un directorio.
CompruebaDirectorio.sh
#! /bin/bash
clear
if `cd /tmp/prueba/ >/dev/null`
then
echo Pues si, es un directorio y contiene
ls -l
else
echo Pues no, no es un directorio
fi
Este script es un claro ejemplo de como comprobar si un usuario y un
grupo existen en el sistema, vemos tambin el uso que se le da al elif.
ExisteGrupoUsuario.sh
#! /bin/bash
clear
read -p Introduce usuario user
read -p Introduce grupo group
if `grep -e ^$user:.* /etc/passwd >/dev/null`
then
if `grep -e ^$group:.* /etc/group >/dev/null`
then
echo Usuario y grupo ya existen en el sistema
fi
elif `grep -e ^$group:.* /etc/group >/dev/null`
then
echo usuario no existe, grupo si!!
else
echo Ni grupo ni usuario existen
fi
Condicionales case
En esta estructura se compara palabra con caso1, caso2, etc., hasta encontrar la
que coincida, en la que se ejecutarn las instrucciones del caso. Si no se
encontrara ninguna, se pasara a la seccin *), que es opcional. Esta estructura
puede irnos muy bien cuando, por ejemplo, queramos que un determinado script
realice unas acciones u otras segn el parmetro que le pasemos. Los parmetros
los podemos referenciar a partir de $1 para el primero, $2 para el segundo y as
consecutivamente. Para los bucles podemos utilizar alguna de las siguientes
estructuras:
case palabra in
caso1)
instrucciones ;;
caso2)
instrucciones ;;
*)
instrucciones
esac
Para aquellos que sepan de programacin, funciona igual que los switch,
esta estructura sirve para dependiendo de la expresin se cumple un
determinado caso, es decir, segnsea el valor de esa expresin se har un
caso u otro. Esto se ve mejor con un ejemplo:
tecla.sh
#! /bin/bash
clear
read -n 1 -p Pulsa una tecla tecla
case $tecla in
[a-z,A-Z]) echo Ha introducido una letra ;;
[0-9]) echo Ha introducido un numero ;;
*) echo Ha introducido un caracter especial ;;
esac
Este script sirve para comprobar que tecla has pulsado, primero pide por
teclado la tecla que ser guardada en la variable tecla, y se usa en el case.
Si la tecla es una letra se har todos los comandos que hayan en el caso [ az,A-Z ]( ya que una letra puede ser cualquiera, hace falta abarcar a todas las
posibilidades por eso se pone el intervalo de a-z y A-Z ), si la tecla es un
nmero se har todos los comandos que haya en el caso [0-9 ]( ya que
puede ser cualquier nmero, hace falta abarcar a todas las posibilidades por
eso se pone el intervalo de 0-9 ) y si la tecla no es un nmero ni una letra, se
ejecutan todos los comandos del caso *.
break
done
case $opcion in
1) exit 1 ;;
2) exit 2 ;;
*) echo No has introducido ni un dos ni un uno ;;
esac
3.3-
Operaciones algebraicas
ExprEjemplo.sh
#! /bin/bash
clear
PS3=Introduce Opcin:
select opcion suma resta
do
break
done
read -p Introduce dos nmeros num1 num2
case $opcion in
suma)
echo La suma de $num1 y $num2 es `expr $num1 + $num2` ;;
resta)
echo La resta de $num1 y $num2 es `expr $num1 - $num2` ;;
esac
2.Operaciones con cadenas:
.
expr length cadena > N de caracteres de esa cadena
expr substr cadena posicin n_caracteres > Extrae de una cadena una
subcadena de la cadena indicada a partir de esa posicin y de longitud
ese nmero de caracteres.
ExprEjemplo4.sh
#! /bin/bash
clear
read -n 9 -p Introduce tu NIF (FORMATO: 00000000A) nif
echo El DNI de $nif es `expr substr $nif 1 8`
echo La letra del $nif es `expr substr $nif 9 1`
Instrucciones iterativas (Bucles)
Los bucles son procesos de repeticin iterativa Los bucles son un tipo de
estructuras de programacin (algoritmos) tremendamente tiles, que realizan
una serie de comportamientos repetitivos (iterativos) mientras o hasta que se
cumpla la condicin. Esto hace que ahorremos muchas lneas de cdigo,
entre otras cosas: orden, estructuracin, etc.
Esta tcnica tambin es denominada rizo o looping. Su homologo en
MSDOS seria el GOTO y sus etiquetas, que cumplira la misma funcin, con
la nica diferencia es que el GOTO por lo normal esta mal visto en la
programacin estructurada, debido a que se "pierde" la estructuracin
secuencial del algoritmo del programa. En Linux contamos con verdaderas
sentencias de control para el uso de bucles , son las siguientes:
Bucles for
El bucle se ejecuta para cada uno de los valores que toma la variable en esa
lista.
for variable in valor1 valor2 valorN
do
comando1
[ break | continue ]
Done
Break: Rompe el bucle y no da ms opcin a que la variable se ejecute.
Continue: Salta al siguiente valor de la lista.
Planetas.sh
#! /bin/bash
clear
for planeta in "Jupiter 10" "Venus 30" "Saturno 15" "Mercurio 1" Luna Tierra
do
if [ "$planeta" = Tierra ]
then
break
elif [ "$planeta" = Luna ]
then
continue
else
echo "El planeta "$planeta"0.000.000 Km del Sol"
fi
done
echo "fin del script"
Y su ejecucin sera:
El planeta Jpiter 100.000.000 Km del Sol
5- BUCLES WHILE
Antes de aprender a hacer un script utilizando los bucles while, debemos
conocer el funcionamiento del comando test, pues es muy usado en este tipo
de bucles.
5.1- Comando test
Este comando sirve para expresar condiciones y evaluarlas, si son correctas
origina cdigos de salida = 0 y si son falsas = 1
El comando pretende abreviar un poco en algunos casos, por eso se suele
utilizar su forma corta:
test expresiones > [ expresin ]
Comprobacin de cadenas:
cadena = cadena2
-z cadena
-n cadena
cadena != cadena2
= OR
= AND
= NOT
BuscaFich.sh
#! /bin/bash
clear
read -p "Introduce directorio a buscar... " direct
read -p "Nombre de fichero a buscar... " nombre
if [ ! -d $direct ]
then
echo "$direct no existe"
else
find $direct -name "$nombre"
fi
5.2- While
Las instrucciones se realizaran mientras (la condicin se cumpla). Cuando
se deje de cumplir, el bucle se saldr y finalizara. La condiciones que se
pueden poner en el while son con el comando test , poniendo un true
( poniendo un true en el while se crea un bucle infinito) o poner un comando
do
instruccin1
instruccin2
.....
break
done
La estructura until se usa para repetir un conjunto de comando hasta que se
cumpla la condicin, cuando se cumple el script sale del until. Las
condiciones y el break es lo mismo que en el while, si se usa una variable
en el until se debe declarar antes.
until.sh
#!/bin/bash
cont=5
until [ $cont -lt 1 ];
do
echo Vuelta numero : $cont
let cont=cont-1
done
Este script recorre un contador desde 5 hasta 1, indicando en cada
iteracin, en la vuelta que nos encontramos.
Vuelta
Vuelta
Vuelta
Vuelta
Vuelta
numero
numero
numero
numero
numero
:
:
:
:
:
5
4
3
2
1
listar_for.sh
#!/bin/sh
#
echo "---------- BUCLE TIPO FOR -----------"
var=1
for f in $(ls /etc/*.conf)
do
echo linea de salida $var: $f
var=`expr $var + 1`
done
Este script lista el directorio, utilizarlo como entrada y mostrarlo lnea a lnea.
mibackup.sh
#!/bin/sh
#
echo "---------- Captura fecha -----------"
fecha=$(date +%Y%m%d)
#
echo "---------- Haciendo Tar -----------"
tar cvf backup$fecha.tar $HOME/Documentos $HOME/Descargas
#
echo "----------- Comprimiendo -----------"
zip backup$fecha.tar.zip backup$fecha.tar
#
echo "---------- Envindolos a zip -------"
cp ./backup$fecha.tar.zip tmp/
#
echo "----------- Limpiando --------------"
rm -f ./backup$fecha.tar
rm -f ./backup$fecha.tar.zip
#
echo "----------- Final
-------------"
Este script realiza un backup de solo ciertos directorios (Documentos y
Descargas), luego los comprime usando zip y los envia a un area de
almacenamiento (unidad previamente montada en /mnt/zipdrive, unidad de
RED previamente montada en /mnt/red, etc), y adems con que el nombre
del archivo contenga la fecha del da
6- PARMETROS POSICIONALES
Se denominan parmetros posesinales porque preceden y son gestionados
de acuerdo a su posicion.
Forma de ejcutar los parmetros posicionales
$ ./Script valor1 valor2 ... valorN
Los parmetros posicionales son valores que se le pasan al script desde la
lnea de comandos cuando se ejecuta y que le permite al programa operar
con ellos. Se numeran en orden del 1 al 12, pero a partir del 10 hay que
encerrarlo entre llaves, ej. ${11}
VariablesParametros.sh
echo
echo
echo
echo
echo
echo
"Parametro 1: $1"
"Parametro 2: $2"
"Parametro 3: $3"
"Todos los parmetros pasados son: $*"
"El numero de parmetros pasados es: $#"
"El nombre del script (parmetro 0) es: $0"
Ejecutemos con
./VariablesParametros.sh Medellin Antioquia Colombia
Dentro del script podramos operar con estos parmetros puesto que son
almacenados en variables del tipo: $n . Con lo que la variable $1 devolvera
el primer parmetro dado al script, Medellin, $2 daria Antioqiuia, y $3
Colombia.
Variables-Parametoros
Variables-Parametoros
Opcin
Explicacin
$1-$9 Parametros posesinales. Muestra el contenido de las variables
$* Recupera todos los parametros pasados.
$# Recupera el numero total de parmetros que se le pasan al script.
$0 Recupera el nombre del script.
BorrarFicheroParametros.sh
#! /bin/bash
# Al ejecutar como 1 parmetro un directorio, 2 como fichero a
borrar
clear
if [ $# -ne 2 ]
then
echo "Debes ejecutarlo asi: $0 directorio nombreFichero";
exit 65
elif [ ! -d $1 ]
then
echo "El parmetro 1 no es un directorio!! "; exit 65
elif [ ! -f $1/$2 ]
then
echo "El parmetro 2 no es un fichero!"; exit 65
else
echo "Borrando el fichero... "
rm -fi $1/$2
fi
8 nueve 10 11 doce
nueve 10 11 doce
10 11 doce
11 doce
doce
8- ARRAYS
Las arrays de los script funcionan de la misma forma que los
arrays de cualquier lenguaje de programacin. Una array es un conjunto o
agrupacin de valores cuyo acceso se realiza por ndices, en un script se
puede almacenar en un mismo array todo tipo de cosas, nmeros, cadenas,
caracteres, etc.
En las arrays el primer elemento que se almacena lo hace en la posicin 0
(en el ejemplo seria Paco). En los script no hace falta declarar el tamao de
la array, puedes insertar tantos valores como desees. Para declarar una
array es:
declare -a nombre_array
declare -a nombres
La opcin -a sirve para decir que lo que vas a declarar es una array.
Para darle valores se puede hacer de dos formas:
1. Darle valores posicin por posicin.
nombre_array[posicion]=valor
nombres[3]=Manolo
2.Darle todos los valores de golpe ( aunque tambin se puede decir la
posicin deseada en la que quieres guardar uno de los valores ).
nombre_array=( valor1 valor2 valor3 [posicion]=valor4 .... valorN )
nombres=( Maria Alberto Rodrigo [7]=Paco )
${#nombre_array[*]}
${#nombres[*]}
Para recuperar todos los elementos de una array:
${nombre_array[*]}
${nombres[*]}
A continuacin un ejemplo de arrays:
arrays.sh
#! /bin/bash
clear
contador=0
declare -a usuario=( Alberto John Roberto Laura Sergio Cristian
Dani )
for valor in ${usuario[*]}
do
echo "El usuario $contador vale $valor"
contador=`expr $contador + 1`
done
9- FUNCIONES
En el mbito de la programacin, una funcin es un tipo subalgoritmo, es el
trmino para describir una secuencia de rdenes que hacen una tarea
especfica de una aplicacin ms grande.
Es la forma en la que ms me gusta programar, modulando todo en partes
pequeas para despus obtener una mayor, con lo cual el programar algo se
hace fcil y divertido.
function nombreFuncion (){
comando1
comando2 .........
[ return codigoSalida ]
}
Tambin se especifica sin poner function, pero puede llegar a dar problemas
as que se recomienda ponerlo.
#! /bin/bash
clear
function suma() {
local resultado
resultado=`expr $1 + $2`
return $resultado
}
#Cuerpo del script
read -p "Introduce el primer numero: " num1
read -p "Introduce el segundo numero: " num2
echo "Llamo a la funcion suma"
suma $num1 $num2
echo "El resultado es $?"
0;30
0;34
0;32
0;36
0;31
0;35
0;33
0;37
1;37
Gris
Azul
Verde
Cyan
Rojo
Purpura
Amarillo
oscuro
claro
claro
claro
claro
claro
1;30
1;34
1;32
1;36
1;31
1;35
1;33
Los colores ms intensos empiezan por cero: [0-9];xx , al igual que los
colores que son x;x[0-9] esto solo es una pequea demostracin de colores.
Sin embargo la cadena de intensidad de colores tiene una pequea
curiosidad:
0
1y6
2y8
3
4
es intenso
es normal
es color de fondo de la bash (oculto)
negativo
inverso
5
7
parpadeante
intercambio de foreground por background
subrayado
tachado
inverso
oculto