0 calificaciones0% encontró este documento útil (0 votos)
45 vistas32 páginas
Scripts
En este documento encontrara una gra informacion de como crear, aprender, implementar y desarrollar scripts para la shell (Interprete de comandos) en el sistema operativo Linux
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
0 calificaciones0% encontró este documento útil (0 votos)
45 vistas32 páginas
Scripts
En este documento encontrara una gra informacion de como crear, aprender, implementar y desarrollar scripts para la shell (Interprete de comandos) en el sistema operativo Linux
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Está en la página 1/ 32
Documentos Aula SUN UCM
CREACION DE SCRIPTS
EN LINUX
26 Mayo 2008
Autores:
Sergio VelascoAula gis
7
SCRIPTS EN LINUX
INDICE
1. zQue es el shell seript 3
2 ,Cémo ejecutar un seript?. 3
3+ Cédigo de un Script....csesenietsnenseunanenenenaninensenenassnessee A
Ejemplos. 5
Bele Depuracion...cccscnseennensnenennananensueniansanenensneess 6
6
9
1
a2. ied
3.3- Operaciones algebraicas.....
4 Bucles FOR.
5 Bucles WHILE
13Aula gis
Sun
SCRIPTS EN LINUX
oe
CREACION DE SCRIPTS EN LINUX
Definicién de Script: Un seript es un archivo que incluye un conjunto de comandos.
Son ejecutados desde la primera linea hasta la iitima (de forma secuencial).
{QUE ES EL SHELL SCRIPT?
Un Shell Script es un script para la shell de comandos (terminal). Para crear un script
vasta con un editar un fichero nuevo y en el nombre poner .s# Ejemplo: HolaMundo.sh
Un vez creado, empezamos a editarlo, Se puede utilizar un editor de textos grafico
como gedit o un editor en terminal como vim, nano o emacs.
En la primera linea del script se debe indicar que shell que vas a usar ( /bin/bash/ , jusr/
binjperl , ete) Aungue da igual la que uses lo importante es el contenido:
4! /bin/bash
#1 Se conoce con el nombre de Sha Bang.
Se denomina “sha-bang” a la secuencia #! con la que se inician los seripts. Su funcién
es indicarle al sistema que se trata de un conjunto de comandos para que sean
interpretados. En realidad, es un miimero magico de dos bytes. El mimero magico es un
‘marcador especial para indicar el tipo de archivo, en este caso, indica que se trata de un
script de shell ejecutable,
Para introducir comentarios se debe poner #. Por cada linea que deseéis poner un
comentario, lo primero que debe tener es #. Es importante afadir comentarios
comentando la utilidad del script o las variables que se crean,
2 COMO EJECUTAR UN SCRIPT?
Antes de poder ejecutarlo, debemos darle permisos de ejecucién. (+x) por ello, haremos
uso del comando chmod y damos permisos de ejecucién, si se desea, se pueden dar a
todos los usuarios y grupos.
chmod 755 /ruta_dei_script Para el usuario propietario
chnod 777 /ruta_del_seript Para cualquier usuario
‘Una vez hecho todo lo anterior, usaremos:
Jnombredelscript.shSCRIPTS EN LINUX
Pero también podemos usar si es un shell script:
sh nombredelscript.sh
CODIGO DE UN SCRIPT
Ya tenemos el script creado, le hemos puesto la cabecera y le hemos cambiado los
permisos, ya solo falta meter el cédigo.
Vamos a empezar desarrollando lo esencial para ir desarrollando estructuras mas
complejas:
Lo primero es saber cémo dar valor a una variable. Es tan sencillo como poner:
nombre_variable=valor
Si deseas guardar la salida de un programa solo tienes que ponerlo entre tildes
invertidas:
nombre_variable="comando*
Tambien hay un comando que lee por teclado las variables ( read ). Para ponerlo es:
zead [opciones] nombre variablel nombre_variable? nonbre_variableN
ejemplo:
read -p “Introduce el nombre y los apellidos” nombre apellides
Tiene un montén de opciones pero estas son las mas importantes y usadas:
-n num_ear ; Numero maximo de caracteres que puedes introducir por teclado
-p “frase” : Te muestra por pantalla una frase para tu saber que debes introducir
d “delimitador” : Especificas cual va a ser el delimitador, es decir si dices que el
delimitador sera “;” pues todo lo que venga antes de un “;” lo cogera una variable y todo
Jo que venga después de ese delimitador hasta el préximo *;” lo coger otra variable.
Cuando queremos utilizar el valor de una variable en el cédigo, nos referiremos a éste
como:
Snombre_variableSCRIPTS EN LINUX
EJEMPLOS 1
Estos son algunos de los ejemplos de esta primera parte, Para ejecutarlos s6lo 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 basicos de Linux.
HolaMundo. sh
4! bin/bash
clear
echo “Hola mundo ,este es mi primer script”
ScriptUno.sh
a! /bin/bash
clear
nombre="Perico”
apellides="ealotes”
echo “Te llamas Snombre $apellidos”
Fecha. sh
i! /bin/oash
clear
fecha=*date | cut -d * ” -f 1,2,3°
hora="date | cut -d." " -f 4°
echo “Hoy es $fecha y son las Shora”
otroscript.sh
a! /bin/bash
clear
4 1PS es una variable de entorno que determina el delimitador de
campos
# (que por defecto vale * ”),en este script queremos
4 cambiarlo a “,” para escribir por teclado nombre, apellidos
rFs=",”
read -p “Introduce el nombre,apellidos : “ nombre apellidos
echo “El nombre es Snombre y los apellidos son Sapellidos”SCRIPTS EN LINUX
3.1. Depuracién
Depuracién de programas es el proceso de identificar y corregir errores de
programacién.
En inglés se le conoce como debugging, ya que se asemeja a la eliminacién de
bichos (bugs), manera en que se conoce informalmente a los errores de programacién,
Se dice que el término bug proviene de la época de las computadoras de bulbos, en las
cuales los problemas se generaban por los insectos que eran atraidos por las luces y
estropeaban el equipo.
Depurar el cédigo 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 cédigo ha
sido, etc. No es algo que se deba hacer obligatoriamente por cada script realizado (seria
demasiado pesado) pero te facilita mucho a la hora de buscar el problema que te surja.
Hay dos formas
10 bien en la_—itinea’ = #!—fbinvbash =x Jw
-x > Te muestra las instruceiones antes de ejecutarlas por consola y sustituyendo
las variables
-v > Te muestra todo pero sin sustituir las variables
2.0 Mediante set
Cambiando las opciones de ejecucién de la shell a lo largo del seript, también con
las opciones -x
3.2- Estructuras condicionales
La estructura basica de una condicién seria:
if condicién
then
comando2
else
comando2
fi
‘Como veis la condicién si (if) se cierra con su correspondiente fi que al parecer un juego
de palabras es facil de recordar.
Entonces si la condicién se cumple entraria por el then, en caso de que no, por el else.
Pero este es un método simple, luego tenemos uno mas complejo con if anidados, seria:SCRIPTS EN LINUX
if condicion
then
‘comandot
elif condicien
then
comande
elif condicién
then
i
Ahora lo que hace es evaluar la condicién, si es verdadera entra por el then, pero
sino y se da el caso de otra condicién entraria por el elif, los elif no se cierran,
solamente el fi final corresponde a la apertura del if
La condicién es cualquier cosa que de un return (que devuelva) algo que sea 0 0
verdadero,
Notese el uso del archivo /dev/null como archivo vaefo para comprobar algunas
condicionales.
Vemos como podemos hacer un script para comprobar que realmente la ruta es un
directorio.
CompruebaDirectorio.sh
4! /bin/bash
clear
if ‘ed /tmp/prueba/ >/dev/null”
then
echo “Pues si, es un directorio y contiene.
is -1
else
echo “Pues va a ser que no es un directorie”
f
Este script es un claro ejemplo de como comprobar si un usuario y un grupo existen en
cl sistema, vemos también el uso que se le da al elif.
ExisteGrupoUsuario.sh
#1 bin/bash
clear
read ~p “Introduce usuario. " user
ead -p “Introduce grupo. ” group
if grep -e “*Suser:.*” /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 “*Sgroup:.*” /etc/group >/dev/null
then
echo “usuario no existe, grupo sil!”
else
echo “Ni grupo ni usuario existen”
fhSCRIPTS EN LINUX
Condicionales case
Se estructuran de la siguiente forma:
case expresion in
casol) comandes 7;
caso?) comandos ;
*) comandos +;
Para aquellos que sepan de programacién, funciona igual que los switch, esta estructura
sirve para dependiendo de la expresién se cumple un determinado caso, es decir, segin
sca el valor de esa expresi6n se hard un caso u otro, Esto se ve mejor con un ejemplo:
tecla.sh
i! /bin/bash
clear
read -n 1 -p “Pulsa una tecla ” tecla
case Stecla in
[a-z,A-Z]) echo “Ha introducido una letra” ;;
(0-9]) echo “Ha introducido un numero”
*) echo “Ha introducido un caracter especial” 7;
Este script sirve para comprobar que tecla has pulsado, primero pide por teclado
la tecla que ser guardada en a variable tecla, y se usa en el case. Si la tecla es una letra
se hard todos los comandos que hayan en el caso { a-7,A~7 }( 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 ), sila tecla es un nimero se hard todos los comandos que haya en el caso
[0-9 1( ya que puede ser cualquier numero, hace falta abarcar a todas las posibilidades
por eso Se pone el intervalo de 0-9 ) y si la tecla no es un nimero ni una letra, se
ejecutan todos los comandos del caso *
Se pone el * cuando no se va a cumplir el resto de casos. Es muy importante
saber que las dobles comas ( ;; )se pone obligatoriamente al final de cada caso ya que
marcan el final de ese caso, sino el programa no funcionaré. Cuando hagais una
condicional debéis poner al final el esac ya que es el cierre del case. Se suele utilizar
‘mucho esta estructura para mostrar un ment al usuario. Ejemplo:
‘ejmploMenu.sh
a1 bin/bash
clear
echo “1-Ejemplo de menu uno”
echo “2.Ejemplo de ment dos”
read -n 1 -p “Introduce una opcion” opcion
case Sopcion in
2) exit 1 is
2) exit 247
*) echo “No has introducido ni un dos ni un uno” 3;SCRIPTS EN LINUX
Tener que poner tantos echo es bastante molesto, por eso hay un comando que
te ahorra hacer ese esfuerzo (select):
select variable in “caso 1" “caso 2" “co:
do
break
done
case $variable in
"case 1") comandos 7;
"caso 2") comandos ;
"caso N") comandos;;
El break sirve para que solo te muestre una vez el ment, Cuando usas select no hace
falta pedir que introduzcas nada, ya que eso lo hace automaticamente. El prompt que te
muestra select es #? pero se puede cambiar, poniendo otro valor a PS3. Por iiltimo
‘veamos el ejemplo anterior con select:
‘ejemploMenu. sh
#1 /bin/bash
clear
PS3="Introduce una opeion”
select opcion in “1.Ejemplo de menu uno” “2.njemplo de menu dos”
done
case $opcion in
1) exit 1 is
2) exit 247
*) echo “No has intreducide ni un dos ni un une” i;
3.3 Operaciones algebraicas
En este post veremos el uso de expr el cual utilizaremos en multitud de
‘ocasiones para hacer operaciones aritméticas, u operaciones con cadenas y un sinfin de
cosas...
expr operacién_a_evaluar
1 Operaciones numéricas:
expr num1 + num2—> Devuelve la suma de num + num2
expr num1 - num2—> Devuelve la resta de num| - num2
expr num1 * num2—> Devuelve el producto de num! * num2
expr num1 / num? > Devuelve la divisién de num! / num2
expr num{ >= num2 —> Devuelve (true) si num1 >= num2
expr num1 > num2—> Devuelve 0(true) si numl > num2
expr num1 <= num? —> Devuelve O(true) si num1 Devuelve 0(true) si num! Devuelve 0(true) si numl es distinto de num2
ExprEjemplo.sh
#! bin/bash
clear
PS3-"Introduce Opeién:
select opcion “suma’” “resta”
do
break
done
read -p “Introduce dos nimeros...
case $opcion in
summa)
echo “La suma de $numl y Snum2 es .. “expr $num] + Snum2> ” 5;
resta)
echo “La resta de $numl y $num2 es .. “expr $numl - $num2> "77
” numl num2
2.Operaciones con cadenas:
expr length cadena -> N° de caracteres de esa cadena
expr index cadena_donde_busca eadena_a_buscar > Devuelve la posicién
donde encuentra los caracteres a buscar dentro de la cadena, si no, devuelve un 0
ExprEjemplo2.sh
#1 Pbin/bash
clear
frase=“Buenos dias, estamos aprendiendo a programar”
echo “La longitud de la cadena es.. “expr length $frase
read -p “Introduce alguna cadena que buscar ” buscar
if [ | -2 Sbuscar J
then
echo “Los caracteres $buscar se encuentran en la pos “expr index
Sfrase $buscar’”
fi
3.expr match eadena_donde_busea patrn_caracteres_buscar —> Funciona igual
que el index pero los caracteres pueden ser una expresién regular
ExprEjemplo3.sh
4! /bin/bash
clear
frase="Buenos dias, estamos aprendiendo a programar”
echo “La longitud de la cadena es.. ‘expr length $frase
read -p “Introduce alguna cadena que buscar ” buscar
if [ | -2 Sbuscar ]
then
echo “Los caracteres $buscar se encuentran en la pos “expr match
Sfrase [a-z,A-Z]*$buscar’ de la frase”
fiSCRIPTS EN LINUX
expr substr cadena posicién n_caracteres > Extrae de una cadena una
subcadena de la cadena indicada a partir de esa posicién y de longitud ese nimero
de caracteres
ExprEjemplo4.sh
#1 /bin/bash
clear
read -n 9 -p “Introduce tu NIF (FORMATO: 00000000A).. ” nif
echo “El DNI de S$nif es “expr substr Snif 1 8
echo “La letra del Snif es “expr substr Snif 9 1°"
BUCLES FOR
for variable in valorl valer? ... valorN
do
comandel
[ break | continue ]
done
El bucle se ejecuta para cada uno de los valores que toma la variable en esa lista.
Break: Rompe el bucle y no da mas opcién a que la variable se ejecute.
Continue: Salta al siguiente valor de la lista.
Planetas.sh
4! /bin/bash
clear
for planeta in “Jupiter 10" "Venus 30" “Saturno 15" "Mercurio 1" Luna
Tierra
do
if [ “Splaneta” = Tierra ]
thea
break
elif [ “S$planeta” = Luna
then
continue
else
echo “sl planeta §planeta 0.000.000 Kn del Sol”
f
done
echo “fin del script”
Y su ejecucién seria:
B1 planeta Jupiter 10 0.000.000 Km del Sol
El planeta Venus 30 0.000.000 Km del Sol
El planeta Saturno 15 0.000.000 Km del Sol
EL planeta Mercurio 1 0.000.000 Km del Sol
fin del scriptCe
Sun
SCRIPTS EN LINUX
ON es
En continue puedes especificar el bucle en el que quieres que la variable salte,'
hablo de bucles anidados. Por defecto, poner continue es como poner continue 1, la
variable del actual bucle salta al siguiente valor, veamos un ejemplo de ello:
PlanetasBacteria.sh
a! /bin/bash
clear
for planeta in Venus Saturno Jupiter Tierra Luna Sol Marte
do
for bacterias in Pepito Anemo Coli Streptos
do
if [ “$planeta” = “tierra” ]
then,
exit 45
elif [ “Sbacterias” = “Pepito” )
then
continue 2
else
echo “El planeta planeta tiene la bacteria ..., $bacterias”
fi
done
done
El resultado de su ejecucién seria:
Bl planeta Venus tiene la bacteria .... Pepito
B] planeta Saturne tiene la bacteria .... Pepito
Bl planeta Jupiter tiene la bacteria .... Pepito
tra de las particularidades de este bucle es que puede ejecutarse a la forma de un bucle
en java
(( valores ))
fer(( variable=valor; condicién; incremente )}
co
comando
[ break | continue ]
done
Es igual que en java pero con doble paréntesis.
Contador. sh
a! /bin/bash
clear
read -p “Introduce un numero” numero
for(( a=0; a <= Smumero; a++ ))
do
echo -e “Sa \n"
doneSCRIPTS EN LINUX
HacerPing.sh
a! bin/bash
clear
read ~p “zCual es el némero de sunny (31,32, 33,35,37)? ” aula
if [ Saula -ne 31 -o Saula -ne 32 -o Saula -ne 35 -o aula -ne 37 }
then
echo “Valor incorrect”
exit 1
else
for(( equipo:
do
ping -c 1 192.168.Saula-$equipo | grep “0% lost” >/dev/null/
done
fi
; equipo <= 16; equipot+ ))
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 evaluatlas, si son correctas origina
cédigos 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 —> [ expresién |
Hay que tener en cuenta que la forma es:
( (espacio) expresién (espacio) )
‘Ya que sino se ponen los espacios en blanco daria lugar a error.
Un ejemplo de su uso:
test -f /home/alumno &% echo “Existe directorio”
La salida sera:
Bxiste Directeric
En la forma resumida se puede escribir:
( -£ /home/albertjh/googleearth | && echo “fichero existe..”
fichero existe.SCRIPTS EN LINUX
Como vemos es lo mismo.
Expresiones test
Estas son algunas de las mas comunes:
Comprobacién directorios:
-f /ruta/nombre > Comprueba si es un fichero normal
-I [ruta/nombre > Comprueba si es un enlace suave
-d /ruta/—> Comprueba que existe el directorio
-x /ruta/nombre —> Comprueba si es un ejecutable
-u /ruta/nombre —> Comprueba si tiene activados los permisos suid
-g /ruta/nombre > Comprueba si tiene activados los permisos sgid
-s /ruta/nombre —> comprueba que su tamaiio es mayor a 0
Comprobacién de cadenas:
“cadena” = “cadena2” -> Comprueba si son iguales
-z cadena —> Comprueba si est vacia
“cadena” != “cadena2” —> Comprucba que son diferentes
Comprobacién de expresiones numéricas:
exp -eq exp2 > Comprueba si son iguales
exp -ge exp? > Comprueba si exp >= exp2
exp -ne exp2 —> Comprueba si exp distinto de exp2
exp -gt exp2 > Comprueba si exp > exp2
exp -le exp2 > Comprueba si exp <= exp2
exp -It exp2 —> Comprueba si exp < exp?
Para concatenar expresiones a evaluar:
Algunos ejemplos del uso de test
ted
Sun
UCM @suSCRIPTS EN LINUX
numeros.sh
a! /bin/bash
clear
read -d“," -p “Introduce dos nimeros separades por comas
if ( -z $numl -o -2 Snum2 ]
then
echo “Debes introducir dos nimeros, por favor”
elif [ $numl -eq $numz |
then
echo “Los nimeros son iguales”
elif [ $numl -gt $num2 |
then
echo “El Snuml > que $num2”
fi
BuscaFich.sh
a! /bin/bash
clear
read -p “Introduce directorio a buscar.. " direct
read -p “Nombre de fichero a buscar.. ” nombre
if [ | -d “dizect J
then
echo “Sdizect no existe”
else
find $direct -name “*.Snombre” -exee 1s -1 ‘(}" \y
fi
5.2 While
El while se estructura de la siguiente forma:
while condicion
uml num2
While se usa para repetir un conjunto de comandos/instrucciones dependiendo
de si se cumple o no la condicién. 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 con comillas invertidas. El break se pone solo si quieres
salir bruscamente del bucle. Veamos tres ejemplos(el primero se podria haber echo con
un select, por si alguien quiere probarl
Calculadora.sh
4! /bin/bash
clear
opcion=2
while [ Sopeien -ne 5 }
do
echo "1.suma"
echo "2.resta"
echo "3.multiplicacién"
echo "4.divisién"SCRIPTS EN LINUX
echo "S.salir"
read -n 1 -p "Introduce una opeien " opcion
case Sopcion in
1) read -p “Intreduce el 1 numero " numerol
read -p “Introduce el 2 numero " mumero2
echo "El resultado es “expr Snumerol + Snumero2""
2) read -p “Introduce el 1 numero " numero
ead -p "Introduce el 2 numero " numero?
echo "El resultado es ‘expr Snumerol - Smumero2°" 77
3) read -p “Intreduce el 1 numero " numerol
read -p “Introduce el 2 numero " numero2
echo "El resultado es “expr Snumerol '*' Snumero2°" ;;
4) read -p “Introduce el 1 numero " numerol
read -p "Introduce el 2 numero " numero?
echo "El resultado es ‘expr Snumerol '/' Snumero2°" ;;
Este script funciona como una calculadora, posee 5 opciones ( suma, resta,
‘multiplicacién, divisin y salir ), nos interesa que podamos realizar tantas veces como
queramos cualquier céleulo hasta que pulsemos un 5 por lo tanto es necesario una
estructura repetitiva, El 5 es para salir por lo tanto el bucle se repetiré hasta que la
variable opeion valga 5 ( es decir, cuando introduzeas por teclado un 5 ) por eso hay
que usar el comando fest ( [ Sopcion -ne 5 } ) , cuando eso ocurra ya no se cumple la
ion del while y el programa finaliza.
Si en el while vas a poner una variable, debe declararse antes ya que sino no
entra, darle cualquier valor. Si no se le da valor antes, la variable no valdré nada (en el
ejemplo anterior hubiera fallado ya que estis diciendo que se hace el bucle mientras ””
no sea igual a 5, sin embargo al dar valor a la variable opcién antes del while, entra)
BucleInfinito.sh
#! /oin/bash
clear
while
do
ead -p "Introduce la palabra fin para salir del bucle " fin
if [ "Sfin” = "fin"
then
exit 27
fi
done
Este script es un ejemplo de como hacer un bucle infinito, hasta que no escribas
un “fin, no saldra del programa,
Con el while se puede leer linea por linea un fichero, para ello lo ‘nico que hay
que hacer es poner un redireccionamiento de entrada en el done con la ruta del fichero
que queremos leer ( esto es muy itil, ya que puedes crear usuarios a partir de un fichero,
ete. Tan solo tenéis que poner done < /ruta_fichero ).SCRIPTS EN LINUX
LecturaFichero.sh
#! /oin/bash
clear
pumLinea=0
linea="nada"
while [ ! -z "$linea" ]
do
ead Linea
if [ ! -z "§linea" }
thea
pumlinea=expr $numbinea + 1°
echo "SnumLinea. $linea"
fi
done < /ete/passnd
La funcién de este script es enumerar las lineas del fichero /ete/passwd, leerd
linea por linea hasta que encuentre una linea que esté vacia, cuando la encuentre dejaré
de leer el fichero, a pesar de que haya 0 no mas lineas después de la linea en blanco
(aunque como es el fichero de los usuario registrados en el sistema, la iinica linea en
blanco que habra sera la tiltima del fichero ). Se debe tener en cuenta que antes del bucle
se ha inicializado la variable linea.
5.3- Until
La estructura repetitiva until es de la siguiente forma:
until condicion
do
break
done
La estructura until se usa para repetir un conjunto de comando hasta que se
cumpla la condicién, cuando se cumple el script sale del until. Las condiciones y el
break cs lo mismo que en el while, si se usa una variable en el until se debe declarar
antes.
Ejemplo:
BorrarFicheros.sh
#1 /bin/bash
clear
directori
until ‘ed Sdizectorio 2> /dev/null”
do
clear
read -p "Introduce un directorio
done
echo “borrado fichero"
xm -i Sdirectorio/*
wale.
" directorioCe
Sun
SCRIPTS EN LINUX
ON es
Este script comprueba si el directorio existe, si el directorio que
introduces no existe te volverd a pedir la ruta, una vez introduzcas una ruta que existe,
entonces saldré del until y borrara todos los ficheros de su interior
PARAMETROS POSICIONALES
{Qué es un parimetro posicional?
Son valores que se le pasan al script desde la linea de comandos cuando se
ejecuta, se numeran en orden del | al 12.
Pero a partir del 10 hay que encerrarlo entre llaves, ej. $/11}
$ ./Script valori valor? .. valorw
/Script = valor
Para ver el contenido de las variables se utiliza el SNumPardmetro
El conjunto de todos los parametros se puede recuperar de golpe con $*
El mimero de pardmetros que se le pasan al script esta definido como $#
BorrarFicheroParametros..sh
4 Al ejecutar como 1° parémetro un directorio, 2° como fichero a
borrar
clear
if [ $# -ne 21
then
echo “Debes ejecutarlo asi: $0 directorio nombreFichero"; exit 65
elif [ ! -d sl)
then
echo “El pardmetro 1 no es un directorio!! “; exit 65
elif [ | -£ S1/$2 )
then
echo “El parametro 2 no es un fichero!; exit 65
else
echo “Borrando el fichero..
zm -£i $1/32
i
Vamos comprobando poco a poco si es un directorio correcto, si lo es, pasamos
a comprobar el fichero, y si lo es lo borramos.
BorrarFicheroParametrosBucle.sh
#! bin/bash
clear
[ ! -d $1 ] && (echo “Directorio no existe”; exit 65) || exit 65
for fichero in “1s $1
do
[ -f $fichero ] && rm -£ gfichero
doneSCRIPTS EN LINUX
Shift: Este comando desplaza elementos a la izquierda machacando el primero’
y se pierde, un ejemplo:
ParametrosBucleshift.sh
#! /bin/bash
clear
waile [ "SL"
do
echo “$1 $2 $3 $4 $5 $6 $7 $8 $9 $(10) ${11) $12)"
shift
done
El resultado es curioso, seria el siguiente:
-/ParametrosBucleShift.sh 1 des tres 45 seis siete 8 nueve 10 11
doce
1 dos tres 45 seis siete 8 nueve 10 11 doce
dos tres 45 seis siete & nueve 10 11 doce
tres 45 seis siete 8 nueve 10 11 doce
45 seis siete 8 nueve 10 11 doce
5 seis siete 8 nueve 10 11 doce
seis siete & mueve 10 11 doce
siete 8 nueve 10 11 doce
@ nueve 10 11 doce
nueve 10 11 doce
10 11 doce
Ll doce
doce
Por tiltimo me queda hablar de set, aunque no tiene mucha utilidad a esta funcién,
set [ -$variable ] [~comando"]
Si aparece cambia el valor de los parimetros posicionales o por el contenido de una
variable o por el resultado de la ejecucién de un comando.
7 IFS Delimitador
IFS= delimitador (Input File Separator)
Sirve para cambiar el delimitador por defecto, que es “” , asi puedes evitar decir:
read -d“;”
Pero ojo, en todo el script se usara como separador un “;” si tu IFS=; asi que cuidadoSCRIPTS EN LINUX
8- ARRAYS
Las arrays de los script funcionan de la misma forma que los arrays de
cualquier lenguaje de programacién, Una array es un conjunto 0 agrupacién de valores
cuyo acceso se realiza por indices, en un script se puede almacenar en un mismo array
todo tipo de cosas, nimeros, cadenas, caracteres, etc.
Paca Luis Maria
ao 1 2
En las arrays el primer elemento que se almacena lo hace en la posicién 0 (en el
ejemplo seria Paco ). En los seript no hace falta declarar el tamafio de la array, puedes
inserfar tantos valores como desees. Para declarar una array es:
declare -a nombre_array
declare ~a nombres
La opcién -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 posicién por posicién.
nombre _azvay[posicion}-valoz
nombres [3]=Manolo
2.Darle todos los valores de golpe ( aunque también se puede decir la posicién
deseada en la que quieres guardar uno de los valores ).
nombre_array=( valorl valor2 valor3 [posicion]=valor4 ...... valorN )
nombres=( Maria Alberto Rodrigo [7)=Paco }
ion:
Para ver el contenido de la array en una posi
${nombre_array[posicion]}
{nombres [0] }
Para saber cuantos elementos contiene la array
${#nombre_arzay(*])
3(#rombres[*]}SCRIPTS EN LINUX
Para recuperar todos los elementos de una array:
${nombre_array[*])
S{nombres(*]}
‘A continuacién un ejemplo de arrays
arrays.sh
4! Jesn/pash
clear
contador=0
declare -a usuario=( Alberto John Roberto Laura Sergio Cristian
Dani}
for valor in ${usuario(*)}
ao
echo "Sl usuario Scontador vale $valor"
contador="expr Scontador + 1°
sone
FUNCIONES
En el 4mbito de la programacién, una funcién es un tipo subalgoritmo, es el término
para describir una secuencia de érdenes que hacen una tarea especifica de una
aplicacién més grande,
Es la forma en la que mas me gusta programar, modulando todo en partes pequefias para
después obtener una mayor, con lo cual el programar algo se hace féeil y divertido,
function nombreFuncion ()(
comandol
comando2
[ return codigoSalida ]
}
‘También se especifica sin poner function, pero puede llegar a dar problemas asi
que se recomienda poner,
El cédigo de salida especificado por un retum es el cédigo de salida del
resultado de la ejecucién de todos los comandos en la funcién. Si no se especifica un
retum devolverd el de la itima salida de esa funcién.
Dentro de una funcién se pueden definir variables locales (solo reconocidas por
esa funcién) y se especifican asi:
local nombreVariableSCRIPTS EN LINUX
Importante, las funciones se declaran al principio de los scripts!
sumaFuncion.sh
#! bin/bash
clear
function suma() (
local resultado
read -p “Introduce el primer numero:
read -p “Introduce el segundo numero:
resultado="expr Snuml + $num2*
return Sresultado
)
#—-Cuezpo del _script—
echo “ilamo a la funcion suma”
echo “El resultado es $2”
pul
nun?
En el paso de parmetros en una funcién no se pueden definir como en otros
lenguajes las variables que le pasas dentro de los paréntesis, sino que se pasan los
valores poniéndolos a continuacién del nombre de la funcién:
nombreFuncion valorl valor? valor 3
Dentro de una funcién esos valores se recogen como:
valorl=$1 valor2=S2 ...
sumaFuncionParametros. sh
#! /oin/bash
clear
function suma() {
local resultado
resultado= expr $1 + $2°
return Sresultado
}
#--Cuerpo del scrip:—
read -p “Introduce el primer numero:
read -p “Introduce e1 segundo numero
echo “Llama a la funcion suma”
suma Snuml $num
echo “El resultado es $2”
pum
“oun,SCRIPTS EN LINUX
10- LEER UN FICHERO
Para leer un fichero es necesario un bucle en la primera linea mas un EOF (End Of File)
y redireccionar la entrada para ese bucle:
while condicién
do
read linea
comandes,
done < /ruta/fichero
Esto se ver mejor con un ejemplo:
‘Tenemos el siguiente fichero en /imp/ejemplo_texto y contiene:
En un Lugar de la Mancha
de cuyo nombre no quiero acordarme
y mucho mas...
‘Vamos a hacer un pequefio seript que nos cuente el nimero de Tineas que tiene el
fichero, como lo hace we:
LeerFichero.sh
4! /bin/bash
clear
linea="algo"
while [ ! -z “$linea” ]
do
read Linea
pum_linea=‘expr Snum_linea + 1°
if [ | -z “$linea” J
then
echo
i
done < /tmp/ejemplo_texto
echo “Total lineas: “expr Snum_linea - 1°”
“ta linea numero: $num_linea del fichero es. $linea”
Y como resultado tendriamos:
§ ./leexPichero.sh
La linea numero: 1 del fichero es.. En un Lugar de la Mancha
La linea numero: 2 del fichero es.. de cuyo nombre no quiero
acordarme
La linea numer:
Total linea:
3 del fichero es.. y mucho mas.
3Aula gis
Sun
SCRIPTS EN LINUX
ON es
11- CREACION DE DEMONIOS
La verdad es que el echo de habilitar un demonio no tiene nada que ver con
hacer un script, pero es muy atl saber como lanzarlo como demonio
Un proceso demonio es un proceso que lanza INIT (el padre de los procesos) al
iniciar el pe en un determinado runtevel (es el nivel de ejecucién del sistema) y lo lanza
en segundo plano 0 BACKGROUND y esta siempre atento a la llamada del usuario (el
usuario puede lanzar ese proceso cuando quiera y tantas veces quiera, para entenderlo
mejor, son programas que al iniciarse el pe se ejecutan enseguida).
En linux hay 6 niveles de ejecucién del sistema, y segin sea el nivel init lanza
‘unos determinados programas que se encuentran en /ete/rentimero_ejecucion.d (Ej; /ete!
re5.d) Los programas que hay dentro se Ilaman de la siguiente forma:
SNameroNombrePrograma -----> S01AreaSwap
La § significa START, son los que INIT lanzara y el nimero es la prioridad con que los
lanzaré, Si el nimero es muy pequefio, sera de los primeros que se lancen, y si es muy
‘grande, es de los iltimos.
Los niveles que hay son:
0
Apagado sistema
| --> Monousuario, sin entorno grafico, sin soporte de red
2.—> Multiusuario, sin entomo grifico, sin soporte de red
3 ---> Multiusuario, sin entomo grafico, con soporte de red
4
RESERVADO
5 ---> Multiusuario, con entomno grifico, con soporte de red ( se lanza por defecto )
> Reinicia sistemaSCRIPTS EN LINUX
Los pasos para crear un demonio son:
1 Situarse en /ete/init.d y copiar en esa situacién el archivo que haremos demonio.
ca Jetc/init.d
ep /CreaDenonios.sh .
2. Situarte en /ete/re5.d (no hay mucha gente que inicie el PC sin entomo grafico )
y crear un enlace suave ("soft link". ) con el nombre
SnumeroPrioridadNombrePrograma, pero la prioridad debe ser una que no no esté
repetida.
cd fete/rcS.d
In -s /ete/init.d/CreaDemonios.sh ./8098CreaDemonios
3. Por iltimo —reiniciamos_—para_—aplicar_—los-_—cambios.
init 6
El siguiente ejemplo ejecuta todos estos pasos
id
2
3.
4.declare -a array!
: i
8,
if [ "Gusuario" = "root" ]
. if [o£ tes:
9. chen
10. zm -£ /ete/reS.d/README
-@/RSADME J
Mgt
Introduce la ruta del archivo
Sarchive ]
vther
16. echo "BL fichero $archivo no existe”
17, exit 3
8.else
21. ep Sarchive .
22. chmod 700 ./*basename Sarchivo
23. cd /ete/res.d
ficheros in ‘1s
26, nombreFichero-"hasename SZicheros*
27. prioridad="expr substr $ficheros 2 2Ce
Sun
SCRIPTS EN LINUX
Ona - a7
28, arrayPr
29,
30,
31. contador=1
32. for interiorArray in ${arrayPrioridades[*])
33.
34. Af [ "Scontador" != "S(farrayPrioridades[*]}" ]
35, ther
36, condicion="e:
SinteriorArray”
37. if [ $condicion -gt 1]
38, then
39. £ [ SinteriorArray -1t 10]
40, then
4 prioridad-‘expr $interiorArray + 1°
42. In -s /ete/init.d/‘basename Sarchivo
-/S0Sprioridad$nombreArchive && echo "Se ha creado el demonic
corzectanente”
43. chnod 700 ./s0$prioridadSnonbre!
44, creado="DEMONIO"
45, break
46, else
41, prioridad= ‘expr $interiorArray = 1°
48, in -3 /
1/S$prioridadSnombrearchivo && echo
corzectamente”
49. chmod 700 ./s0$priorida:
50. creado="DEMONTO"
Sl. break
52. fi
53. ca
55. ai
56. contador="expr Scontador + 1
57. done
38
59,
60.F4
61.if [ "$creado" = "DEMONIO"
62.then
oridades [Scontador]=Spriori
tador + 1°
tader="expr
pr $(arrayPrioridades[Scontador]} -
/init.d/*basename Sarchive
Se ha creado el demonic
brearchivo
63. read -n 1 -p "gDesea reiniciar el ordenador para aplicar los
cambios ? " respuesta
64. is [ "Srespuesta" = "s" J
65. then
66. init 6
67, fi
68. fiAula gis
SCRIPTS EN LINUX B77
One So
69.else
70, echo "No eres e1 root,no puedes ejecutar este script”
meet
Otra forma de crear un demonio:
Esta vez solo se necesitan un par de Iineas.
1.Tenemos nuestro script preparado y funcionado, en este ejemplo lo lamaremos
demonio.sh
2.Le damos permisos 755, sudo chmod
3.Lo movemos a /etc/init.d
4,Por ultimo lo convertimos sudo update-rc.d demonio.sh defaults
95 demonic. si
Esto es todo, mas simple pero de la otra forma se puede ver lo que realmente hace este
comando.
update-re.d actualiza automaticamente los enlaces a los scripts de init tipo System V
que se encuentran en /ete/re{nivel_de_ejecucién].d/NNnombre y que apuntan a los
script etc/init.d/nombre.
Cuando se ejecuta con una o varias de las opciones defaults, start, o stop,
update-rc.d crea los enlaces /ete/re{nivel_de_ejecucién].d/[SK|NNnombre apuntando
al script /etc/init.d/nombre.
Si se usa la opcién defaults entonces update-re.d crear enlaces para arrancar
los servicios en los niveles de ejecucién 2345 y parar los servicios en los niveles de
ejecucién 016.En ver de usar defaults, los niveles de ejecucién en los que se arranca 0
se para un servicio pueden ser especificados explicitamente mediante un conjunto de
argumentos:
Cada uno de estos conjuntos empieza con un argumento start o stop para especificar
cuando se van a crear enlaces para arrancar o parar el servicio.
1L.1-
-cutar un demonio o script sin contrasefia
Muchas veces necesitamos ejecutar un script en el cual se requiere cambiar de usuario 0
gjecutarlo con derechos de sudo. Para ello, haremos lo siguiente:
En el /etc/sudoers
usuario ALL = NOPASSWD: /ust/local/bin/script1,
Después, el usuario puede hacer sudo /ust/local/bin/scriptl y va a correr como root.SCRIPTS EN LINUX
12-- USO DE CRON
Digamos que el cron se compone basicamente de dos "partes" el daemon y el
fichero de configuracién, El daemon se llama crond y es el encargado de leer el fichero
de configuracién ete/crontab.
Lo hace cada 60 segundos, en busca de cambios en dicho fichero e incorporar asi
tareas al sistema,
Nosotros no vamos a entrar en el deamon, ya que bastara que lo marqueis para
que se ejecute al iniciar vuestro sistema, esto lo podeis hacer con la herramienta que
traiga vuestra distribucién sino, siempre podeis recurrir al modo texto con: chkconfig.
Bien, una vez. editado dicho fichero encontraremos esto:
SHELL=/hin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
¥run-parts
01 * * ** root run-parts /ete/eron.hourly
02 4 * ** root run-parts /etc/cron.daily
224 * * 0 root run-parts /etc/eron.weekly
42 41 ** root run-parts /etc/cron.monthly
El primer campo, como bien veis, es el entomno donde se ejecutaran las Srdenes,
podeis dejarlo asi por defecto, a menos que useis otra shell.
El segundo campo esté claro, es el valor de la variable PATH, si las ordenes que
ejecutard la tarea no se encuentran en dicho PATH, no teneis mas que afiadirlo.
El ercero, manda los outputs del cron al root, 0 a quien queramos.
Si queremos que no se envie nada s6lo debemos dejar la variable asi:
MAILTO="",
Los /ete/eron.hourly, daily...son fichero que usa cron para su gestién interna y los lanza
cada dia.
Bien, ahora queremos agregar una tarea a nuestro sistema, ze6mo se hace?.
Debemos saber cémo funcionan los campos del /ete/crontab.
El primer campo son los minutos.SCRIPTS EN LINUX
El segundo campo son las horas
El tercer campo es el dia.
El cuarto es el dia de la semana.
El quinto es la orden a ejecutar.
Es decir, para el crontab el fichero es asi
‘minute hour day month dayofweek command
Hay que destacar que los minutos deben ser enteros de entre 0-59.
Las horas, enteros de 0-23,
Dias, 1-31. (Para meses que los tengan, claro.)
Meses, 1-12, también se pueden usar nombres cortos, (en inglés) jan, feb...(se aconseja
usar niimeros).
Dias de la semana, se usan enteros 1-7 (al igual que en los meses, se puede usar el
hombre corto, pero tambien lo desaconsejamos, en favor de los mimeros.)
Y por iltimo la orden, por ejemplo puede ser: Is -h > /home/manssson/ls.txt.
Con esto ya deberiamos ser capaces de crear y hacer funcionar cualquier tarea,
pero cron tiene alguna més utilidades que conviene saber.
Por ejemplo, si ponemos un asterisco (*) en algin campo, por ejemplo el mes,
esto hard que se ejecute la orden todos los meses, y luego respetard los demas valores,
tales como el dia o la hora.
Si queremos indicar un rango de enteros, lo haremos con un guién ().
Si queremos indicar enteros separados, se harén con comas (,), por ejemplo: 7, 2, 3.
Podemos concretar o excluir valores usan la barra (/), es decir, si queremos que
una orden se ejecute durante los 0-59 minutos de una hora menos en el minuto 15, pues
lo marcaremos haciendo:0-59/15.
También podemos hacer que una orden que se ejecute en un determinado
minuto, haciendo:*/25. Esto hard que nuestra tarea se ejecute siempre en el minuto 25.
El uso de la barra (/) y el asterisco (*) puede emplearse en todos los campos. Si
{queremos que una tearea no sea ejecutada s6lo debemos comentar esa linea al principio
con la “almohadilla" (#): #30 18 8 * * root rm -f /var/cache/apt/archives/* xpm.
Otra opcién es copiar el script en alguna de las carpetas por defecto cron.*Aula gis
Sun
Ona
SCRIPTS EN LINUX
Por ejemplo, si queremos una periodicidad diaria, lo copiaremos ent
Jetc/eron.daily
Con todo esto ya podremos
incorporar tareas a nuestro sistema de forma automatica,
13- COLORES EN LA CONSOLA
Tenemos varios tipos de colores, se distinguen por background (el fondo) y
foreground (las letras). Esto se puede hacer metiendolo en variables o a mano
Segiin la secuencia de eseape ANSI, podemos cambiar el color del background
con \033[x;4xm y el foreground con \033[x;3xm.
1033 indica la marca de escape ANSI y lo siguiente es la secuencia de colores.
La lista de los posibles colores varia segiin la terminal y el entorno grafico, pero por
defecto son:
Negro 330
Azul Azul 1734
Verde Verde 1332
cyan cyan 1736
Rojo. Rojo 1331
Purpura Purpura 1735
Marzon 0733 Amarille 1333
blanco 1;37
Los colores mas intensos empiezan por cero: (0-9];xx , al igual que los colores que son
x;x[0-9] esto solo es una pequefia demostracién de colores. Sin embargo la cadena de
intensidad de colores tiene una pequefia curiosidad:
O es intenso
Ty 6 es normal
2y 8 es color de fondo de la bash (oculto)
3 negativo
4 inverso
5 parpadeante
7 intercambio de foreground por background
Pero en consolas grificas:
Ly 4 subrayado
6 tachado
7 inverso
8 ocultoCe
Sun
Ona
SCRIPTS EN LINUX
Existe el problema de que cuando se pone un color, al terminar lat
secuencia todo lo demas se queda de ese color si no se sustituye por otro, para que esto
no ocurra podemos recurrir a poner al final del todo un: \033[0m asi quedara el color de
Ja consola inicial,
Asi pues sabiendo esta tabla de valores, podemos eseribir un par de lincas:
§ PSl="\[\033 [17 34m\] [\u@\h: \w] 8\ [\033(Om\]
usuario@sunny02:~1$
Como puedes ver se ha cambiado el prompt por el color azul. Pero también se puede
combinar con el fondo de esta manera:
§ PSl="\[\033 (4471; 31m\] [\u@\h: \w] $\ [\033 (Om\]
De esta forma podemos poner las letras rojas y el fondo azul. Utilizando esto,
podemos crear scripts con colores y que queden muy vistosos.
Recordar que para hacer echo’s poniendo las secuencias de escape, deberéis utilizar la
opeién -e
‘Un ejemplo muy curioso, que combina colores con un sleep, para hacer creer al usuario.
que esta cargado algo y que sale ok:
clear; echo “CARGANDO, ESPERE POR FAVOR”;echo ““;for (( J=17 3<=10;
J#+ 1); do echo -e “EUBMPLO $] \c” ;for (( 1-0; i<=30; i++ ));do echo
we *\033[0734m.\c"ssleep 0.05;done; echo ~e “\c";echo ~e “\t\033(0;32m
[0K] \033[0m";done; echo "\033[0;32mCARGADO CON EXIT0\033[0m"
CARGANDO, PSPERE POR FAVOR
EJEMPLO 1 (ox)
EJEMPLO 2 (0K)
EJEMPLO 3 [oK)
EJEMPLO 4 (0K)
BJEMPLO 5 (ox)
EJEMPLO 6 (0K)
EBJEMPLO 7 [ox]
EJEMPLO 8 (0K)
EJEMPLO 9 (0K)
EJEMPLO 10 (0K)
CARGADO CON &xT"T0
Nota: Algunos de los ejemplos de este documentos han sido extraidos de “Diario de un
Linuxero”Ce
Sun
SCRIPTS EN LINUX
UCM @ a