Está en la página 1de 39

Programación Aplicada

Clase 9: Funciones, variables y arreglos en BASH


Nombre unidad de aprendizaje: Introducción a los SCRIPTS

Escuela de
Informática y Telecomunicaciones
2008 Escuela de Informática y Telecomunicaciones, DuocUC
Escuela de Informática y Telecomunicaciones

Objetivos
 Objetivos de la clase

 Programa rutinas utilizando los diferentes tipos


de variables, constantes, operadores y
sentencias de control en lenguaje Bash.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 2
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Como en prácticamente todos los lenguajes de
programación, en el BASH de GNU/LINUX se
pueden utilizar funciones para agrupar trozos
de código o rutinas de una manera más lógica.
 Esto permitirá organizar un SCRIPT en
unidades lógicas de manera que sea más fácil
mantenerlo y programarlo (y entenderlo), sin
necesidad de estar repitiendo múltiples veces
una misma porción de código.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 3
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 El uso de FUNCIONES en BASH, nos va a
ayudar en:
•Tareas en las que debamos repetir cierto
número de veces lo mismo, sin necesidad de
duplicar líneas.
•Desglosar todo lo que vayamos a hacer, en
conjuntos de acciones, resolviendo cada
problema individualmente (programación
modular).
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 4
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Las FUNCIONES, a diferencia de los
SCRIPTS, se ejecutan dentro de la memoria
del propio proceso BASH, por lo que resultan
más eficientes que ejecutar SCRIPTS
separados, pero tienen el inconveniente de que
tienen que estar siempre cargadas en la
memoria del proceso BASH para poder
utilizarse.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 5
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Actualmente, debido a la gran cantidad de
memoria que tienen los computadores, el tener
FUNCIONES cargadas en la memoria de
BASH tiene un costo insignificante.
 Las funciones de BASH son una extensión de
las funciones que existen desde el BOURNE
SHELL.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 6
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Así, en BASH las funciones se pueden definir
básicamente de dos maneras:
 Al estilo del BOURNE SHELL:
function nombre_de_función(){
comandos_de_la_función
…..
}

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 7
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 O bien, al estilo del C SHELL:
nombre_de_función(){
comandos_de_la_función
…..
}
 NO existe diferencia entre ellos, y se utilizarán
indistintamente ambos formatos.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 8
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Para ejecutar una FUNCIÓN simplemente
basta escribir su nombre seguido de
argumentos, tal como si se tratará de un
comando.
 Los argumentos actúan como PARÁMETROS
DE LA FUNCIÓN.
 En caso de que sea necesario pasar varios
parámetros a la función, se especificaran uno
detrás de otro separados por espacios.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 9
Escuela de Informática y Telecomunicaciones

Desarrollo
Ejemplo de funciones en BASH
#!/bin/bash
#función para listar el directorio
function Listar(){
if test –d $1
then
ls –l $1
fi
}
#PRINCIPAL
clear
echo –e “Ingresar un Directorio: \c”
read dir
Listar $dir #Llamada a la función Listar
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 10
Escuela de Informática y Telecomunicaciones

Desarrollo
Ejemplo de funciones en BASH

#!/bin/bash
function Salir(){
exit
}
function Saludo(){
echo –e “Hola Mundo!!!…\n”
}
#PRINCIPAL
clear
Saludo #Llamada a la función Saludo
Salir #Llamada a la función Salir

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 11
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Las funciones en BASH, al igual que un
SCRIPT devuelven un valor, el que podemos
establecer con la sentencia exit.
 Las funciones en BASH pueden “retornar” un
valor por medio de la sentencia return, que se
usa de la misma manera que exit.
 La sentencia return solo sirve para retornar
enteros entre 0 y 255.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 12
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Veamos un ejemplo de FUNCIÓN que retorna
un valor:

#!/bin/bash
function suma(){
c=$(expr $1 + $2)
return $c
}

#PRINCIPAL
suma 100 150
echo –e “suma=$?\n”
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 13
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Podemos definir funciones en la línea de
ordenes, de la siguiente manera:
[alumno@localhost ~]$ function saludo(){
> echo hola
>}
[alumno@localhost ~]$ function salir(){
> exit
>}
[alumno@localhost ~]$ declare –f
declare –f salir
declare –f saludo
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 14
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Notar que para “entrar” las líneas de la función
se debe presionar <CTRL> + <RETURN>.
 Podemos ver que funciones tenemos definidas
en una sesión usando el comando declare –f.
El SHELL imprime las funciones, y su
definición, ordenadas alfabéticamente.
 Si preferimos sólo el nombre de las funciones
podemos usar el comando declare –F.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 15
Escuela de Informática y Telecomunicaciones

Desarrollo
Funciones en BASH
 Si una función tiene el mismo nombre que un
SCRIPT o ejecutable, la FUNCIÓN tiene
preferencia.
 Para borrar una FUNCIÓN podemos usar el
comando unset –f nombre_función.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 16
Escuela de Informática y Telecomunicaciones

Desarrollo
Los PARÁMETROS POSICIONALES
 Los PARÁMETROS POSICIONALES son los
encargados de recibir los argumentos de un
SCRIPT y los PARÁMETROS DE UNA
FUNCIÓN.
 Los nombres de los PARÁMETROS
POSICIONALES son 1, 2, 3, etc. por lo que
para acceder a ellos utilizaremos $1, $2, $3,
etc.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 17
Escuela de Informática y Telecomunicaciones

Desarrollo
Los PARÁMETROS POSICIONALES

#!/bin/bash
function impParam(){
echo –e “Nombre del SCRIPT : $0”
echo –e “Primer parámetro : $1”
echo –e “Segundo parámetro : $2”
echo –e “TODOS los parámetros : $*”
}

#PRINCIPAL
clear
impParam hola a todo el mundo

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 18
Escuela de Informática y Telecomunicaciones

Desarrollo
Los PARÁMETROS POSICIONALES
 Además, se tiene el PARÁMETRO
POSICIONAL 0 que almacena el nombre del
SCRIPT donde se ejecuta.
 Los valores de los PARÁMETROS
POSICIONALES no es posible modificarlos,
sólo se pueden leer, si se intenta asignarles un
valor se produce un error.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 19
Escuela de Informática y Telecomunicaciones

Desarrollo
Variables locales y globales
 Por defecto, los PARÁMETROS
POSICIONALES son locales al SCRIPT o
FUNCIÓN y no se pueden acceder o modificar
desde otra FUNCIÓN.
A diferencia de los PARÁMETROS
POSICIONALES, el resto de variables que
definimos en un SCRIPT o FUNCIÓN son
globales, es decir, una vez definidas en el
SCRIPT son accesibles (y modificables) desde
cualquier FUNCIÓN.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 20
Escuela de Informática y Telecomunicaciones

Desarrollo
Variables locales y globales

#!/bin/bash
function impParam(){
echo –e “Nombre del SCRIPT : $0”
echo –e “Primer parámetro : $1”
echo –e “TODOS los parámetros : $*”
}

#PRINCIPAL
clear
impParam hola a todo el mundo
$1=hola

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 21
Escuela de Informática y Telecomunicaciones

Desarrollo
Variables locales y globales
 En el ejemplo anterior la sentencia marcada da
el siguiente mensaje de error:

./parametros: line 10: =hola: commnad not found

 Las variables por defecto son globales en


BASH, por lo que si queremos que una
variable sea local, tenemos que definirla como
local dentro de la función:

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 22
Escuela de Informática y Telecomunicaciones

Desarrollo
Variables locales y globales
func(){
var1=2 #Variable global
local var2=23 #define una variable local
}

 El modificador local sólo se puede usar dentro


de las funciones, NO en los SCRIPTS.
 Por último, las variables globales también se
pueden definir dentro de una FUNCIÓN.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 23
Escuela de Informática y Telecomunicaciones

Desarrollo
Variables locales y globales
#!/bin/bash
function f1(){
v1=25
local v2=57
}
function f2(){
echo –e “v1=$v1”
}
#PRINCIPAL
f1
f2
echo –e “v1=$v1”
echo –e “v2=$v2”
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 24
Escuela de Informática y Telecomunicaciones

Desarrollo
Las variables $*, $@ y $#
 La variable $# almacena el número de
argumentos o parámetros recibidos por el
SCRIPT o la FUNCIÓN.
 El valor almacenado en $# es de tipo cadena
de caracteres.
 Tanto $* como $@ nos devuelven los
argumentos recibidos por el SCRIPT o
FUNCIÓN.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 25
Escuela de Informática y Telecomunicaciones

Desarrollo
Las variables $*, $@ y $#

#!/bin/bash
function impParam(){
echo –e “Nombre del SCRIPT : $0”
echo –e “Primer parámetro : $1”
echo –e “TODOS los parámetros : $*”
echo –e “Cantidad de parámetros : $#”
}

#PRINCIPAL
clear
impParam hola a todo el mundo

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 26
Escuela de Informática y Telecomunicaciones

Desarrollo
Librería de FUNCIONES
 A la hora de programar SCRIPTS de SHELL
no es que existan herramientas para declarar
librerías, pero se pueden simular de cierta
manera colocando el código de FUNCIONES
en archivos de SCRIPTS separados.
 El siguiente ejemplo corresponde a un ejemplo
de uso de librerías, usando un archivo con las
funciones que queremos “exportar”:

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 27
Escuela de Informática y Telecomunicaciones

Desarrollo
Librería de FUNCIONES
 Se graban en el archivo librería.sh las
FUNCIONES que se desean “exportar”.

[alumno@localhost ~]$ vi librería.sh


function saludar(){
echo –e “Hola\n”
}
function salir(){
exit
}

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 28
Escuela de Informática y Telecomunicaciones

Desarrollo
Librería de FUNCIONES
 Se incluye el archivo librería.sh en el SCRIPT
en donde deseemos ocupar las FUNCIONES
“importadas”.

#!/bin/bash

#libreria.sh contiene las funciones a ser utilizadas


source librería.sh

…..

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 29
Escuela de Informática y Telecomunicaciones

Desarrollo
Arreglos en BASH
 En BASH es posible definir arreglos (arrays),
pero únicamente unidimensionales.
 En BASH no hay un limite máximo en el
tamaño de un arreglo, ni es necesario
que los miembros de un arreglo se indexen de
forma contigua.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 30
Escuela de Informática y Telecomunicaciones

Desarrollo
Arreglos en BASH
 En BASH las variables de tipo arreglo se
declaran por medio de:

declare –a nombre_arreglo[tamaño]

 En esta definición tamaño hace referencia a la


cantidad de elementos del arreglo.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 31
Escuela de Informática y Telecomunicaciones

Desarrollo
Arreglos en BASH
 En BASH podemos asignar datos o valores a
un arreglo de la siguiente forma:

nombre_arreglo[índice]=valor

 En esta definición índice hace referencia a la


posición que el valor ingresado tendrá dentro
del arreglo.
© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 32
Escuela de Informática y Telecomunicaciones

Desarrollo
Arreglos en BASH
 En BASH es posible referenciar los datos del
arreglo a través de la expresión:

${nombre_arreglo[índice]}

 Es posible referenciar a TODOS los datos del


arreglo de una sola vez por medio de la orden:

${nombre_arreglo[*]}

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 33
Escuela de Informática y Telecomunicaciones

Desarrollo
Arreglos en BASH
 El total de elementos del arreglo se puede
determinar usando:

${nombre_arreglo[@]}

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 34
Escuela de Informática y Telecomunicaciones

Desarrollo
Ejemplos de uso de arreglos en BASH

#Función para colocar datos en


#el arreglo
function LLenar_arreglo(){
local i=1
while test $i –le 5
do
echo –e “Numero: \c”
read A[$i]
i=$(expr $i + 1)
done
}

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 35
Escuela de Informática y Telecomunicaciones

Desarrollo
Ejemplos de uso de arreglos en BASH

#Función para mostrar los datos


#del arreglo
function Mostrar_arreglo(){
local i=1
while test $i –le 5
do
echo –e “A[$i]=${A[$i]}\n”
i=$(expr $i + 1)
done
}

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 36
Escuela de Informática y Telecomunicaciones

Desarrollo
Ejemplos de uso de arreglos en BASH

#PRINCIPAL
#!/bin/bash
clear
declare –a A[5]
LLenar_arreglo
Mostrar_arreglo

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 37
Escuela de Informática y Telecomunicaciones

Resumen
 Resumen de la clase

 Como en prácticamente todos los lenguajes de programación, en el


BASH de GNU/LINUX se pueden utilizar funciones para agrupar trozos
de código o rutinas de una manera más lógica, de manera que sea mas
fácil mantenerlo, programarlo y entenderlo, sin necesidad de estar
repitiendo múltiples veces una misma porción de código.
 En BASH las funciones se pueden definir básicamente de dos maneras:
al estilo del BOURNE SHELL o bien al estilo del C SHELL.
 Las funciones en BASH, al igual que un SCRIPT devuelven un valor, el
que podemos establecer con la sentencia exit, y también pueden
“retornar” un valor por medio de la sentencia return, que se usa de la
misma manera que exit.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 38
Escuela de Informática y Telecomunicaciones

Resumen
 Resumen de la clase

 En BASH es posible definir arreglos, pero únicamente unidimensionales.


 Las operaciones con arreglos en BASH son las usuales de cualquier otro
lenguaje de programación: se pueden ingresar datos al arreglo, se
pueden leer datos del arreglo, se puede hacer referencia a un dato en
particular del arreglo, etc.

© 2007 Cisco Systems, Inc. Todos los derechos reservados. Cisco Public 39

También podría gustarte