0% encontró este documento útil (0 votos)
191 vistas49 páginas

t3 Practica

Practica

Cargado por

Manolo Barea
Derechos de autor
© © All Rights Reserved
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, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
191 vistas49 páginas

t3 Practica

Practica

Cargado por

Manolo Barea
Derechos de autor
© © All Rights Reserved
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, TXT o lee en línea desde Scribd

BLOQUE I: ADMINISTRACIN BSICA DE S.O.

LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Prctica 3 (0,25 Puntos)


Programacin Shell-script en Linux

Fundamentos de Aplicaciones y Servicios Telemticos


2 Curso Grado en Ingeniera de Tecnologas de Telecomunicacin
Departamento de Ingeniera Telemtica (DIT)
Universidad de Sevilla

Curso 2012/2013
Fco. Javier Muoz Calle
Francisco Jos Fernndez Jimnez
Jos ngel Gmez Argudo
Ignacio Campos Rivera

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-I-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

NDICE

Objetivos y alcance (5 minutos) ...................................................................................................... 1


1.1 Introduccin............................................................................................................................. 1
1.2 Objetivo de la prctica ............................................................................................................. 3
1.3 Planificacin de la prctica...................................................................................................... 3
1.4 Documentacin de apoyo ........................................................................................................ 3

Estructura bsica de shell-scripts. Invocacin (15 minutos) ........................................................... 4

Sintaxis de Shell-scripts (60 minutos)............................................................................................. 8


3.1 Funcionamiento general del shell (2 minutos) ........................................................................ 8
3.2 Entrecomillado y carcter de escape (5 minutos) .................................................................... 9
3.3 Parmetros y variables (10 minutos) ..................................................................................... 10
3.3.1 Variables ..................................................................................................................... 11
[Link] Variables del shell .......................................................................................... 12
3.3.2 Parmetros posicionales.............................................................................................. 12
3.3.3 Parmetros especiales ................................................................................................. 12
3.3.4 Exportacin de variables............................................................................................. 13
3.4 Expansiones y sustituciones (5 minutos) ............................................................................... 16
3.4.1 Expansin de ~ ........................................................................................................... 16
3.4.2 Expansin de parmetros y variables ......................................................................... 17
3.4.3 Sustitucin de comando .............................................................................................. 18
3.4.4 Expansin aritmtica .................................................................................................. 18
3.4.5 Expansin de ruta ....................................................................................................... 19
3.5 Comandos del shell (5 minutos) ............................................................................................ 20
3.5.1 Comandos simples ...................................................................................................... 20
3.5.2 Tuberas ...................................................................................................................... 21
3.5.3 Listas AND-OR .......................................................................................................... 21
3.5.4 Listas........................................................................................................................... 22
[Link] Listas secuenciales ......................................................................................... 22
[Link] Listas asncronas ............................................................................................ 22

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-II-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

[Link] Listas mixtas................................................................................................... 22


3.5.5 Listas compuestas ....................................................................................................... 22
3.6 Comandos compuestos o estructuras de control (25 minutos) .............................................. 23
3.6.1 Secuencial. Agrupacin de comandos. ....................................................................... 23
3.6.2 Condicional: if-elif-else .............................................................................................. 24
[Link] Comando test .................................................................................................. 25
3.6.3 Condicional: case ........................................................................................................ 27
3.6.4 Bucles incondicionales: for......................................................................................... 28
3.6.5 Bucles condicionales: while y until ............................................................................ 30
3.6.6 Ruptura de sentencias de control ................................................................................ 31
3.7 Funciones (5 minutos) ........................................................................................................... 32
3.8 Uso de comandos y aplicaciones (15 minutos) ..................................................................... 33
3.8.1 Comandos internos ..................................................................................................... 33
[Link] Salida del proceso shell actual, exit................................................................ 34
[Link] Entrada estndar a un shell-script, read .......................................................... 36
[Link] Construccin de comandos en tiempo de ejecucin: eval .............................. 37
3.8.2 Comandos externos..................................................................................................... 38
4

Depuracin de shell-scripts (5 minutos)........................................................................................ 38

Propuesta de aplicacin de la prctica (90 minutos) ..................................................................... 40

Ejemplo de Test (5 minutos) ......................................................................................................... 43

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-III-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 Objetivos y alcance (5 minutos)


1.1 Introduccin
El intrprete de comandos o shell es un programa que permite a los usuarios interactuar con el sistema,
procesando las rdenes que se le indican. Los comandos invocables desde el shell pueden clasificarse
en internos (corresponden en realidad a rdenes interpretadas por el propio shell) y externos
(corresponden a ficheros ejecutables externos al shell). Adems de comandos, los shells ofrecen otros
elementos para mejorar su funcionalidad, tales como variables, funciones o estructuras de control. El
conjunto de comandos internos y elementos disponibles, as como su sintaxis, depender del shell
concreto empleado.
Adems de utilizar el shell desde la lnea de comandos (basada en el prompt como la indicacin del
shell para anunciar que espera una orden del usuario), puede emplearse para la interpretacin de shellscripts. Un shell-script o guin de rdenes es un fichero de texto que contiene un conjunto de
comandos y rdenes interpretables por el shell.
En los S.O.s Unix existen mltiples implementaciones de shell1. Atendiendo al shell del que proceden
y a su similitud sintctica (incluyendo sus comandos internos), los shells de Unix pueden clasificarse
en dos grandes familias2 (dentro de los shells de una misma familia tambin existen diferencias, pero
gran parte de su sintaxis es comn):
a) sh (Bourne Shell3): este shell fue usado desde las primeras versiones de Unix (Unix Versin
7). A raz de l han surgido mltiples shells, tales como zsh (Z shell), ash (almquist shell),
bash (Bourne again shell), dash (Debian almquist shell) o ksh (Korn shell). Por su
mayor uso pueden destacarse:

1
2

bash: fue desarrollado para ser un superconjunto de la funcionalidad del Bourne Shell
(en la que incluye funcionalidades de ksh y csh), siendo el intrprete de comandos
asignado por defecto a los usuarios en las distribuciones de Linux, por lo que es el shell
empleado en la mayora de las consolas de comandos de Linux. Se caracteriza por una
gran funcionalidad adicional a la del Bourne Shell. Como ficheros personales de los
usuarios emplea $HOME/.bashrc y .bash_profile.

dash (Debian almquist shell), derivado directo de ash, se caracteriza por ser mucho ms
ligero (depende de menos bibliotecas) y rpido que otros shells, tales como bash, aunque
con menos caractersticas funcionales. El fichero personal del usuario es
$HOME/.profile.

ksh (Korn shell): destaca por sus funciones avanzadas para manejar archivos, pudiendo
competir con lenguajes de programacin especializados tales como awk o perl.

En Windows, el equivalente seran los programas [Link] o [Link].


Existen algunos shell adicionales, de uso residual, como scsh (Scheme Shell) o fish, quese saldran de esta
clasificacin.
Recibe ese nombre por su desarrollador, Stephen Bourne, de los Laboratorios Bell de AT&T.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-1-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Bourne Shell ha llegado a convertirse en un estndar de facto de tal modo que todos los
sistemas Unix tienen, al menos, una implementacin del Bourne Shell (o un shell compatible
con l), ubicada en /bin/sh. En el caso concreto de los S.O.s UNIX Linux, no existe
ninguna implementacin del Bourne Shell, mantenindose la entrada /bin/sh (as como su
manual man sh) como un enlace simblico a una implementacin de shell compatible. En
concreto:

En la prctica totalidad de [Link] Linux se enlaza a /bin/bash.

En Debian, desde Debian Lenny 5.0 (en Ubuntu desde la versin 6.10) se enlaza a
/bin/dash: de este modo, estas distribuciones pretenden hacer uso de:
dash: para los shell scripts empleados en el arranque del sistema (cuyo shebang
tradicionalmente siempre ha sido #!/bin/sh), aprovechando la mayor rapidez de este
intrprete.
bash: en las consolas de comandos y scripts de servicios de los usuarios, de modo que
stos puedan aprovechar la mayor funcionalidad que ste intrprete ofrece.

b) csh (C shell): caracterizado por presentar una sintaxis muy parecida a la del lenguaje de
programacin C. Como shell derivados destaca tcsh. Estos shell cuanto con un nivel de uso
muy inferior respecto a los de la familia Bourne Shell.
Para intentar homogeneizar esta diversidad de shells, el IEEE defini un estndar de intrprete de
comandos bajo la especificacin POSIX 1003.2 (tambin recogida como ISO 9945.2). La creacin de
dicho estndar se bas en la sintaxis que presentaban mltiples shells de la familia Bourne shell (el
propio Bourne Shell de Unix Versin 7, implementaciones en UNIX System V y BSD, as como ksh).
Esto ha llevado a que la gran mayora de los shells derivados del Bourne Shell, tales como bash, dash
o ksh, den soporte a este estndar POSIX (mientras que los derivados del csh no). En concreto:

bash: respeta completamente el estndar POSIX, sobre el que aade un nmero considerable
de extensiones (estructura select, arrays, mayor nmero de operadores, ...).

dash: conforme al estndar POSIX IEEE 1003.24, slo ampliado con algunas extensiones
Berkeley.

De forma precisa, tal como indica el manual del intrprete dash de su sistema (man dash), la lnea de
desarrollo de dash pretende que ste satisfaga el estndar POSIX de shells IEEE 1003.2, propsito casi
logrado en la actualidad (slo presenta algunas caractersticas faltantes, como la variable $LINENO).

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-2-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 Ejecute en su sistema Debian el comando ls -l /bin/sh, y compruebe como


efectivamente corresponde a un enlace simblico al intrprete /bin/dash. Asimismo,
consulte el manual man sh, comprobando como efectivamente obtiene el manual del
intrprete dash.

TAREAS

2 Ejecute los comandos ls -l /bin/dash y ls -l /bin/bash para


comprobar como efectivamente dispone de dichos shells en su sistema. Puede obtener las
versiones instaladas mediante dpkg -s dash y bash version.
3 La mayora de los shell-scripts implicados en el proceso de arranque del sistema se
encuentran en la carpeta /etc/init.d/. Por ejemplo, mire el contenido del fichero
/etc/init.d/rc (encargado del arranque de los servicios) y compruebe como la
primera lnea de dicho script es #!/bin/sh, lo que indica que es interpretado por el
shell /bin/dash.
4 Analice el fichero /etc/passwd y compruebe como los usuarios afast y
root tienen asignado el shell bash. Abra una consola de comandos con el usuario
afast y ejecute el comando ps ax | grep bash, comprobando como el
proceso del intrprete de comandos usado efectivamente corresponde al shell bash
(proceso -bash). Abra una sesin con el usuario root y realice la misma prueba,
comprobando como igualmente se est usando bash.

1.2 Objetivo de la prctica


El objetivo de esta prctica es introducir al alumno en el uso del lenguaje de programacin de shellscripts. Consecuentemente, en esta prctica nos centraremos en la sintaxis de shell propuesta por el
estndar POSIX IEEE 1003.2 lo que, conforme a lo antes indicado, se traduce en que todo lo visto
aqu podr ser utilizado en dash, bash y cualquier otro shell que satisfaga dicho estndar. Sobre la base
de esta prctica podr profundizarse analizando las funcionalidades adicionales aadidas por cada
shell, siendo de especial inters, dado su uso, las aportadas por bash.

1.3 Planificacin de la prctica


Sesiones de Prcticas de este Tema

Apartados a realizar de esta memoria

Sesin 1

1, 2, 3, 4

Sesin 2

5 (Aplicacin Prctica), 6 (+ Test Prctica)

1.4 Documentacin de apoyo

Estndar de intrprete de comandos de la especificacin POSIX (IEEE Standard 1003.1


2004/ISO 9945.2): [Link]

The Linux Command Line (Openbook). E. William, Jr. Shotts. San Francisco, 2011.

"Linux bible". Christopher Negus. Indianapolis, IN. Wiley, 2011. ISBN: 9780470929988.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-3-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

"Pro Linux System Administration". James Turnbull, Peter Lieverdink, Dennis Matotek.
Berkeley, CA. Apress, 2009. ISBN: 978-1-4302-1912-5.

"Linux Network Administrator's Guide (Openbook)". Olaf Kirch, Terry Dawson. O'Reilly,
2000. ISBN: 1-56592-400-2

Web oficial de Dash: [Link]

Manual de referencia de Bash: [Link]

2 Estructura bsica de shell-scripts. Invocacin (15 minutos)


En su forma ms bsica, un shell-script puede ser un simple fichero de texto que contenga uno o varios
comandos. Para ayudar a la identificacin del contenido a partir del nombre del archivo, es habitual
que los shell scripts tengan la extensin ".sh", por lo que seguiremos este criterio a lo largo de la
prctica (pero recuerde que es algo meramente informativo y opcional). Por ejemplo, el siguiente
fichero sera un shell-script:
[Link]
echo "Contenido carpeta personal de afast:"
ls /home/afast/

DESCARGA DE LOS SHELL-SCRIPTS DE ESTA PRCTICA


Como ir observando, esta prctica se basa en el uso de mltiples scripts. de usuario. Para que no
tenga que escribir dichos scripts a mano, y le d tiempo a terminar la prctica, puede descargarse
dichos scripts ya escritos. Para ello, realice los siguientes pasos:
1 Acceda a la pgina Web de la Asignatura en Enseanza Virtual (acceda usando la mquina
Virtual) y vaya a la mima carpeta en la que se encuentra la memoria de esta prctica. En dicha
carpeta encontrar el fichero "[Link]". Descrguelo a su mquina local,
dentro del directorio "/home/afast/".
2 Con el usuario "afast", ejecute los siguientes comandos para descomprimir el archivo:
mkdir /home/afast/scripts/
cd /home/afast/
tar xfvz ./[Link]

A partir de ese momento, dispondr de los distintos scripts en la carpeta


"/home/afast/scripts/".

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-4-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

ADVERTENCIA SOBRE LA HERRAMIENTA "COPIAR-PEGAR"


Bien con el enunciado de esta prctica o con otros manuales que pueda encontrar, en ocasiones
puede resultar til la herramienta de "Copiar y Pegar" para hacer uso de los comandos o scripts
escritos en un documento y as evitarse tener que escribirlos a mano. En caso de hacer uso de dicha
herramienta, tenga en cuenta que con frecuencia la herramienta "Copiar y Pegar" cambia
determinados caracteres (tales como los guiones "-" o las comillas) por otros de similar aspecto,
pero que son otros caracteres en realidad, por lo que el intrprete podra dar errores de sintaxis. Si
aprecia este comportamiento, revise dichos caracteres en su comando o script.

TAREAS

1 Entre a la carpeta "/home/afast/scripts/" y ejecute "ls -l" para comprobar que estn los
scripts que se usarn en esta prctica. En concreto, compruebe que est el archivo
"[Link]" u que su contenido coincide con el del ejemplo de shell-script antes mostrado.
2 Compruebe que el fichero "[Link]" tiene permisos de ejecucin generales (si no los
tuviese, para asignrselos bastara ejecutar "chmod +x [Link]").
3 Invoque el script para que sea interpretado, usando por ejemplo el comando:
cd /home/afast/scripts/; ./[Link]

RECUERDE
La carpeta "/home/afast/scripts/" ser usada a lo largo de toda la prctica para contener
todos los ficheros de scripts que se le vayan proponiendo. Consecuentemente, cada vez que se le
solicite que cree un script, no se le indicar el directorio donde hacerlo. Hgalo siempre en este
directorio.

Adems de comandos, los shell-scripts pueden contener otros elementos, aportados por el shell para
mejorar la funcionalidad de los scripts. De forma resumida, la estructura bsica de un shell-script es la
siguiente:
script_ejemplo.sh
#!/bin/dash
# Esto no se interpreta
echo Hola
ps w
echo "Proceso lee el script: $$"

<-- Shebang
<-- Comentarios (no interpretados)
<-- Contenido del script

Como contenido del script pueden utilizarse mltiples elementos (comandos, variables, funciones,
estructuras de control, comentarios,...) que se analizarn en el siguiente apartado.
El "shebang" permite especificar el intrprete de comandos con el que deseamos que sea interpretado
el resto del script. La sintaxis de esta lnea es la secuencia "#!" seguida del ejecutable del shell
deseado, sobre lo que deben realizarse la siguientes advertencias:

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-5-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Es imprescindible que sea la primera lnea del script, ya que, en caso contrario, sera
interpretado como un comentario (comienza con el carcter "#").

No debe haber ningn espacio entre "#!" y el ejecutable del "shell".

El shebang no es obligatorio (si no se indica, se intentar usar el mismo tipo de shell


desde el que se ha invocado el script).

SINTAXIS ESTRICTA
La sintaxis de los shell-scripts se caracteriza por ser bastante estricta en su escritura, especialmente
en lo que se refiere a la insercin u omisin de espacios en blanco entre las palabras especiales.
Tenga esto muy en cuenta a la hora de escribir los scripts que se proponen en esta prctica.

La utilizacin del shebang est condicionada por la forma en que sea invocado el shell-script,
existiendo 3 opciones:

Explcita: escribiendo explcitamente que shell se desea invocar para leer el script, cargndose
en memoria un nuevo proceso para dicho shell (subshell o proceso shell hijo del shell padre
responsable de la lnea de comandos desde la que se ha invocado el script). En este caso se
omite el shebang.

Implcita: invocando al script como si fuera un ejecutable, lo que requiere asignar permisos de
ejecucin al script. Se lee el shebang para determinar que shell deber usarse para leer el
script, cargndose en memoria un proceso hijo (subshell) para dicho shell (si el script no
presenta shebang, para el subshell se utilizar el mismo tipo de shell que el encargado de la
lnea de comandos desde la que se ha hecho la invocacin). Tenga en cuenta que los shellscripts son ficheros de texto ledos por el intrprete de comandos, esto es, se interpretan, NO
se ejecutan. La asignacin del permiso de ejecucin a un shell-script es una utilidad del
sistema de ficheros para acelerar la invocacin de scripts, pero cuyo funcionamiento interno es
cargar un nuevo proceso de shell (subshell) para que ste interprete el script.

Implcita con ".": el script ser interpretado por el mismo proceso del shell responsable de la
lnea de comandos desde la que se est invocando el script (luego aqu no se abre ningn
subshell). Consecuentemente, en este caso tambin se omite el shebang.

En los casos en los que se crean subshells, salvo que se fuerce lo contrario (con "su -c" por
ejemplo), el subshell pertenecer al mismo usuario al que perteneca el shell padre que lo ha creado. El
usuario al que pertenece el proceso shell que interpreta un script condiciona las operaciones que se
podrn hacer desde dentro del script (por ejemplo, si el shell pertenece al usuario "afast", el script
no podr modificar el fichero "/etc/passwd", mientras que si el shell pertenece al superusuario
"root", s podr hacerlo). Tenga en cuenta este aspecto para determinar que operaciones puede
realizar dentro de un script, y con qu usuario debe invocarlo.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-6-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 En una consola de comandos con el usuario "afast" (ofrecida por el shell "bash"),
compruebe que el fichero "script_ejemplo.sh" se encuentra en su carpeta
"/home/afast/scripts/". Asegrese que se encuentra en dicha carpeta:
cd /home/afast/scripts/
Ejecute el comando "ps w" y localice el proceso asociado al shell responsable de la lnea
de comandos desde la que est trabajando.

TAREAS

2 Invoque dicho script mediante los distintos mtodos de invocacin. Para cada uno de ellos,
analice la salida obtenida para determinar en cada caso cual es el proceso shell que est
interpretando el script, el usuario al que pertenece dicho proceso y si se ha abierto un
subshell o no:

Explcita:
/bin/sh
/bin/dash
/bin/dash

Implcita con "." mediante cualquiera de las dos invocaciones siguientes:


.

script_ejemplo.sh
script_ejemplo.sh
script_ejemplo.sh

script_ejemplo.sh

Implcita: compruebe el script tiene permiso de ejecucin y ejectelo con:


./script_ejemplo.sh

Modifique el script eliminando el shebang, y vuelva a ejecutarlo. Analice si hay alguna


diferencia respecto a la ejecucin anterior.

Conforme se ha indicado en la introduccin, si bien tanto bash como dash siguen el estndar POSIX,
especialmente bash aade mltiples extensiones particulares, no soportadas por otros shells como
dash. Consecuentemente, cada vez que diseemos un script deberemos tener en cuenta el shell o shells
que lo soportan, asegurando que sea invocado por uno de ellos. Para que se haga una idea de la
importancia de este aspecto, considere los dos scripts siguientes, basados en el uso de la estructura
"for" (que se usar ms adelante):
script_estandar.sh
#!/bin/sh
for VAR in 0 1 2 3
do
echo $VAR
done

script_bash.sh
#!/bin/bash
for ((VAR=0 ; VAR<4 ; VAR++ )) ; do
{
echo $VAR
}
done

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-7-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Ambos scripts realizan la misma funcionalidad, pero "script_estandar.sh" est escrito bajo la
sintaxis POSIX, mientras que "script_bash.sh" utiliza una sintaxis no estndar soportada por
bash.

TAREAS

1 Invoque el guin "script_estandar.sh" (recuerde que debe disponer de ellos ya creados en


"/home/afast/scripts/") mediante los siguientes comandos, debiendo comprobar
que todas funcionan correctamente y con igual resultado (la primera y segunda llamada
realmente son la misma, usando el shell "dash"):
/bin/sh
/bin/dash
/bin/bash

script_estandar.sh
script_estandar.sh
script_estandar.sh

2 2 Ahora invoque el guin "script_bash.sh" mediante los siguientes comandos:


/bin/dash
/bin/bash

script_bash.sh
script_bash.sh

Podr comprobar cmo, debido a la sintaxis no estndar del script, la segunda invocacin
funciona, pero la primera (que emplea dash) da un error de sintaxis.

3 Sintaxis de Shell-scripts (60 minutos)


En este apartado se describe el lenguaje de comandos shell definido en el estndar POSIX. Veremos el
funcionamiento general del shell, as como su sintaxis. Puede encontrar la descripcin detallada del
estndar POSIX en la siguiente direccin:
[Link]
En esta prctica se resumen las caractersticas ms utilizadas. Se recomienda acudir al estndar para
obtener una descripcin ms detallada y exhaustiva.

3.1 Funcionamiento general del shell (2 minutos)


El lenguaje shell es un lenguaje interpretado, en el que se leen lneas de texto (terminadas en \n), se
analizan y se procesan. Las lneas a interpretar son ledas de:

La entrada estndar (teclado por defecto). En este caso el shell se dice que es un shell
interactivo.

Un fichero shell-script.

Usando la opcin -c cuando se ejecuta el shell. Ejemplo: bash c ls l

Con las lneas ledas, el shell realiza los siguientes pasos (en este orden):

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-8-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Se dividen las lneas en distintos elementos: palabras y operadores. Los elementos se separan
usando espacios, tabuladores y operadores. El carcter # sirve para incluir un comentario,
que se elimina del procesamiento.

Se distingue entre comandos simples y comandos compuestos.

Se realizan distintas expansiones y sustituciones (ver ms adelante). Se detecta el comando a


ejecutar y los argumentos que se le van a pasar.

Se realizan las redirecciones de entrada/salida y se eliminan los elementos asociados a las


redirecciones de la lista de argumentos. Las redirecciones de entrada/salida ya se han
explicado en un tema anterior.

Se ejecuta el elemento ejecutable, que podra ser una funcin, un comando interno del shell,
un fichero ejecutable o un shell-script, pasando los argumentos como parmetros posicionales
(ver ms adelante).

Opcionalmente, se espera a que termine el comando y se guarda el cdigo de salida.

ADVERTENCIA
A lo largo de la memoria se utilizar la palabra ejecutar para referirse a la ejecucin de un
programa binario (un programa compilado, por ejemplo), al inicio de la interpretacin de un script o
a la invocacin de una funcin o comando interno. Se considerarn, por tanto, elementos
ejecutables, programas binarios y scripts (con el permiso de ejecucin), comandos internos y
funciones.

TAREAS

Cuando se escriben comandos desde el teclado y se intenta introducir un elemento que est formado
por ms de una lnea, una vez que teclee la primera lnea y pulse Intro, el shell mostrar el indicador
secundario de peticin de orden > (en lugar del prompt), solicitndole que contine escribiendo el
elemento. Cuando el intrprete d por concluida la introduccin del elemento, la interpretar,
volviendo a mostrar el prompt de la lnea de comandos. Si utiliza el cursor para intentar ver el
comando introducido, en general ver como el shell ha rescrito la entrada para aplicarle la sintaxis con
la que todo el elemento es escrito en una sola lnea. Si desea cancelar la introduccin de una lnea (o
lneas) sin necesidad de borrar lo que lleva escrito, puede pulsar Ctrl-C.

Escriba el contenido del script script_estandar.sh visto en el apartado 2 directamente


en una consola de comandos.

3.2 Entrecomillado y carcter de escape (5 minutos)


El shell tiene una lista de caracteres que trata de manera especial (operadores) y una serie de palabras
reservadas (palabras que tienen un significado especial para el Shell). Puede ver un listado de
caracteres especiales y palabras reservadas en los apartados 2.2 y 2.4 del estndar.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-9-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Cuando queremos utilizar un carcter especial del shell o una palabra reservada del lenguaje sin que
sea interpretada como tal o prevenir una expansin o sustitucin indeseada (las expansiones y
sustituciones se vern en un apartado posterior) es necesario indicrselo al shell mediante las comillas
(simples o dobles) o el carcter de escape. Por ejemplo, para escribir el nombre de un fichero que
contenga espacios, para pasar el smbolo < como argumento a un programa o para utilizar if
como nombre de un fichero (if es una palabra reservada del shell).

El carcter de escape [\]: indica que el siguiente carcter debe preservar su valor literal. El
carcter de escape se elimina de la lnea una vez procesado. Si aparece al final de una lnea,
significa continuacin de lnea e indica que el comando contina en la siguiente lnea
(puede ser utilizado para dividir lneas muy largas).

Comillas simples [' ']: todo texto entrecomillado con comillas simples mantendr su valor
literal, no se producir ninguna expansin ni sustitucin y ser considerado como una nica
palabra.

Comillas dobles [" "]: es equivalente a usar comillas simples, salvo que en este caso si se
hacen extensiones y sustituciones (todas menos la extensin de tilde y sustitucin de alias que
veremos ms adelante).

El entrecomillado de una cadena vaca ('' o "") genera una palabra vaca (palabra que no tiene
ningn carcter).
Vea el apartado 2.2 del estndar para obtener informacin detallada.

TAREAS

1 Desde la sesin del usuario "afast", ejecute los siguientes comandos en el terminal y
analice los resultados:
cd
echo $PWD
echo \$PWD
echo '$PWD'
echo "$PWD"
echo hola \> a y b
echo hola > a y b
ls
cat a
echo hola > a y b
ls
cat a\ y\ b

#se crea el fichero a


#se crea el fichero a y b

3.3 Parmetros y variables (10 minutos)


Como en cualquier lenguaje de programacin, en el lenguaje shell se pueden crear y utilizar variables,
que aqu se llaman parmetros. Existen varios tipos de parmetros:
a) Si el nombre es un nmero se denominan parmetros posicionales.
b) Si el nombre es un carcter especial se denominan parmetros especiales.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-10-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

c) El resto se denominan simplemente variables.


A continuacin se detallan cada uno de estos tipos. Vea el apartado 2.5 del estndar para obtener ms
informacin.

3.3.1 Variables
El shell permite realizar las siguientes operaciones bsicas con las variables:
Slo Definicin
Definicin y/o Inicializacin/Modificacin
Expansin (Acceso a Valor)
Eliminacin de la variable

VAR=""
VAR=valor
$VAR
${VAR}
unset VAR

Sobre ello deben realizarse las siguientes observaciones respecto a:


a) Definicin y uso: las variables siempre son:

Locales: slo existen en el proceso shell en que son definidas.

Slo accesibles desde el momento de su definicin hacia abajo del script, esto es, siempre
deben definirse primero e invocarse despus (no puede usarse una variable que es definida
ms adelante).

Al definir una variable sin inicializacin, su valor por omisin es la cadena nula, esto es, las
siguientes entradas son equivalentes:
VAR=
VAR=""
b) Nombrado: tngase en cuenta que Linux es case sensitive (sensible a maysculas y
minsculas) en general, lo que incluye el nombre de las variable. As, VAR y var sern
tomadas como dos variables independientes. Para el nombre de una variable puede usarse:

1er carcter: una letra o el carcter de subrayado _.

2 y posteriores caracteres: una letra, dgito o el carcter de subrayado.

c) Inicializacin/Modificacin del valor de una variable:

Es importante no incluir ningn espacio ni antes ni despus del signo =. Si se hace, el


shell intentar interpreta el nombre de la variable como un comando (Recuerde que la
sintaxis del shell es especialmente estricta en lo que a espacios se refiere).

El valor de una variable siempre es tomado por el shell como una cadena de caracteres.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-11-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Si el valor de una variable contiene caracteres especiales, espacios, u otro elemento que
pueda ser malinterpretado por el shell tendr que ir entrecomillado o deber incluir el
carcter de escape donde sea necesario.

d) Expansin de una variable: el uso de las llaves {} slo es necesario si justo tras el nombre
de la variable se desean escribir ms caracteres, sin aadir ningn espacio antes. Se ver ms
adelante con ms detalle.
Mire el contenido del script "script_variables.sh", que deber contener lo siguiente:

TAREAS

script_variables.sh
echo "Variable mal definida, error de orden no encontrada":
VAR = 1
echo "Variables bien definidas:"
VAR=1
VAR1=2
var=3
echo "Variables: $VAR $VAR1 $var"
echo "Variable VAR: $VAR"
echo "Variable VAR1: $VAR1"
echo "Variable VAR seguida de 1 (requiere llaves): ${VAR}1"
echo "Comillas dobles: $VAR"
echo 'Comillas simples: $VAR'
echo "Valor: $VAR-1"
Compruebe que dispone del permiso de ejecucin general. Invquelo y analice su
funcionamiento.

[Link]

Variables del shell

Existe un conjunto de variables que afectan al funcionamiento del shell. Muchas ya han sido
analizadas en temas anteriores, por ejemplo: HOME, PATH, LANG,... Puede volver a ver una
descripcin de ellas en el apartado 2.5.3 del estndar.
Aqu vamos a destacar la variable IFS (Input Field Separators). El valor de esta variable es una lista de
caracteres que se emplearn en el proceso de divisin de campos realizado tras el proceso de
expansin (que se ver ms adelante, en el apartado 3.4) y por el comando read (ver el apartado
3.8.1 de comandos internos).

3.3.2 Parmetros posicionales


Son los parmetros de la lnea de comandos con la que se ha invocado al script. Estn denotados por
un nmero y para obtener su valor se emplea $X o ${X} para los parmetros del 1 al 9 y ${X} para
parmetros mayores (nmeros de ms de un dgito). Se pueden modificar con el comando set.

3.3.3 Parmetros especiales


Son parmetros identificados por un carcter especial creados por el Shell y cuyo valor no puede ser
modificado directamente. En el siguiente cuadro se recopilan los parmetros especiales definidos en el
estndar:
FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-12-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Parmetro especial

Valor

$*

Se expande a todos los parmetros posicionales desde el 1. Si se usa dentro


de comillas dobles, se expande como una nica palabra formada por los
parmetros posicionales separados por el primer carcter de la variable IFS
(si la variable IFS no est definida, se usa el espacio como separador y si
est definida a la cadena nula, los campos se concatenan).

$@

Se expande a todos los parmetros posicionales desde el 1, como campos


separados, incluso aunque se use dentro de comillas dobles.

$0

Nombre del shell o shell-script que se est ejecutando.

$- (guion)

Opciones actuales del shell (modificables con el comando set).

$#

N de argumentos pasados al script (no incluye el nombre del script).

$?

Valor devuelto por el ltimo comando, script, funcin o sentencia de control


invocado.

$$

PID del proceso shell que est interpretando el script.

$!

PID del ltimo proceso puesto en segundo plano.

Mire el contenido del script "script_var-[Link]", que deber contener lo siguiente:

TAREAS

script_var-[Link]
#!/bin/sh
echo \$@=$@
echo \$*=$*
echo \$0=$0
echo \$1=$1
echo \$2=$2
echo \$-=$echo \$#=$#
echo \$?=$?
firefox &
ps w
echo \$$=$$
echo \$!=$!
Compruebe que dispone del permiso de ejecucin. Invquelo mediante el comando:
cd /home/afast/scripts/;

./[Link] arg1 arg2

Analice el resultado.

3.3.4 Exportacin de variables


Cuando un proceso (proceso padre, como por ejemplo el shell) ejecuta otro proceso (proceso hijo, otro
programa o script), el proceso padre le pasa un conjunto de variables de entorno al proceso hijo. Las
variables de entorno pasadas pueden ser utilizadas por el proceso hijo para modificar su
comportamiento. Por ejemplo, un programa en C puede usar la funcin getenv declarada en

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-13-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

biblioteca estndar stdlib.h para obtener dichas variables (puede obtener ms informacin
ejecutando man getenv).
El comando interno del Shell export permite que una variable (previamente definida o no) sea
configurada para que su valor sea copiado a los procesos hijos que sean creados desde el shell actual
(por ejemplo otros shell). Presenta la sintaxis:
export VAR
export VAR=valor
En este ltimo caso, s es posible aadir un espacio antes o despus del signo =.
Debe advertirse que exportacin significa paso de parmetros por valor, esto es, en el proceso hijo
se crear una variable de igual nombre que en el shell padre, y con igual valor, pero sern variables
independientes (esto es, la modificacin de valor de la variable en el proceso hijo no afectar al valor
de la variable en el shell padre).

TAREAS

Mire el contenido de los siguientes scripts en su sistema (como siempre, carpeta


"/home/afast/scripts/"):

script_padre.sh
#!/bin/bash
export VAR=a
echo $VAR
ps w
./script_hijo.sh
echo $VAR

script_hijo.sh
#!/bin/sh
echo $VAR
VAR=b
echo $VAR
ps w

Compruebe que dispone del permiso de ejecucin. Ejecute el comando:


cd /home/afast/scripts/;

./script_padre.sh

Analice el resultado.
No debe confundirse la exportacin con la invocacin de shell-scripts mediante el mecanismo
implcito basado en .. En este caso no hay ninguna copia de variables por valor, simplemente el
script invocado es interpretado por el mismo shell.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-14-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Mire el contenido de los siguientes scripts en su sistema:

TAREAS

[Link]

[Link]

#!/bin/bash
VAR=a
echo $VAR
ps w
. [Link]
echo $VAR

#!/bin/sh
echo $VAR
VAR=b
echo $VAR
ps w

Compruebe que dispone del permiso de ejecucin general. Ejecute el siguiente commando y
analice el resultado:
cd /home/afast/scripts/;

./[Link]

En los S.O.'s Linux suele ser habitual encontrar scripts que se dedican exclusivamente a contener la
inicializacin de un conjunto de variables, o la definicin de un conjunto de funciones. Otros scripts
del sistema hacen uso del mecanismo de invocacin implcito basado en ., para cargar o importar
las variables o funciones definidas en dichos scripts.
script_sistema.sh
#!/bin/sh
. /dir/cont_var.sh
. /dir2/cont_fun.sh
fun1 $VARb

cont_var.sh
#!/bin/bash
VARa=1
VARb=2
...

cont_func.sh
#!/bin/bash
fun1(){...}
fun2(){...}
...

Por ejemplo, visualice el contenido del script del sistema encargado del arranque de los
servicios "/etc/init.d/rc". Observe como contiene las lneas:

TAREAS

.
.

/etc/default/rcS
/lib/lsb/init-functions

Visualice el contenido de esos archivos "rcS" e "init-functions" y compruebe como


slo contienen definiciones de variables5 y funciones (la sintaxis para la definicin de las
funciones se analizar ms adelante en esta prctica), respectivamente. Por ejemplo, observe
como:

La variable "VERBOSE" es inicializada en "rcS" y luego es usada por "rc".

La funcin "log_failure_msg()" es definida en "init-functions" y luego


es usada por "rc".

De hecho, todos los ficheros de la carpeta "/etc/default/" son scripts dedicados exclusivamente a contener la
inicializacin de variables, siendo importadas desde otros scripts del sistema.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-15-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

3.4 Expansiones y sustituciones (5 minutos)


Como se vio en el apartado de funcionamiento general del shell (apartado 3.1), en un paso previo a la
ejecucin del elemento ejecutable se realizan una serie de expansiones y sustituciones. En este
apartado se describe cules son y cmo se realizan. Puede ver una descripcin detallada en el apartado
2.6 del estndar.
Existen los siguientes tipos de expansiones y sustituciones (que desarrollaremos ms adelante):
a) Expansin de ~ (virgulilla o tilde de la ).
b) Expansin de parmetros o variables.
c) Sustitucin de comando.
d) Expansin aritmtica.
e) Expansin de ruta.
Aparte de estas expansiones est el concepto de alias (ver apartado 2.3.1 del estndar) que se utiliza
para crear sinnimos de comandos y slo se realiza en el elemento ejecutable de la lnea antes de
cualquier otra expansin o sustitucin. Puede ver los alias definidos usando el comando alias.
Puede ver ejemplos de definicin de alias en el fichero ~/.bashrc.
El orden de ejecucin de estas expansiones es el siguiente:
a) Primero se hacen en orden las siguientes expansiones: expansin de tilde, expansin de
parmetros, sustitucin de comando y expansin aritmtica.
b) Los campos generados en el primer paso son divididos utilizando como separadores los
caracteres de la variable IFS. Si la variable IFS es nula no se produce la divisin. Si la variable
est declarada pero no tiene ningn valor, se utilizan por defecto los caracteres espacio,
tabulador y nueva lnea.
c) Se realiza a continuacin la expansin de ruta.
d) Por ltimo, se eliminan las comillas simples o dobles que existan y se utilicen como tal (no se
eliminan las comillas que hayan perdido su significado especial, por ejemplo usando el
carcter de escape).

3.4.1 Expansin de ~
Las apariciones de la virgulilla (o tilde de la ) dentro de una lnea, que no se encuentren
entrecomilladas, se expanden de la siguiente manera:

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-16-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Variables
~

TAREAS

~login

Valor
Se expande al valor de la variable HOME
Si login es un nombre de usuario del sistema, se expande a la ruta
absoluta del directorio de inicio de sesin de ese usuario. Si no, no se
expande.

Comente la lnea del script "script_var-[Link]", visto en el apartado 3.3, donde


aparece la palabra firefox. Ejecute los siguientes comandos observando el valor de las
variables posicionales:
cd /home/afast/scripts/; ./script_var-[Link] ~ ~root
./script_var-[Link] ~noexiste ~afast

3.4.2 Expansin de parmetros y variables


El formato general para incluir una expansin de variables o parmetros, como se ha visto en
apartados anteriores es:
${PAR}
Las llaves pueden omitirse, salvo cuando se trate de un parmetro posicional con ms de un dgito o
cuando se quiera separar el nombre de la variable de otros caracteres. Por ejemplo:
echo $VAR
echo ${10}
${VAR}TEXTO

#puede omitirse
#no puede omitirse
#no se omite para no confundir con $VARTEXTO

Si la expansin de parmetros ocurre dentro de comillas dobles, sobre el resultado no se realizar la


expansin de ruta ni la divisin de campos (pasos b y c). En el caso del parmetro especial @, se hace
la divisin de campos siempre.1
Aparte de este formato general, se pueden utilizar otros formatos que permiten establecer valores por
defecto, comprobar si la variable est definida, eliminar sufijos y prefijos, contar el nmero de
caracteres, etc. Puede ver la lista de formatos junto con ejemplos en el apartado 2.6.2 del estndar. Por
ejemplo, los siguientes:
${VAR:-alternativo}

Valor de la variable. Si la variable no tiene ningn valor, la


construccin se sustituye por el valor alternativo.

${VAR:=alternativo}

dem al anterior, pero asignando el valor alternativo a la


variable.

Los siguientes scripts muestran un posible ejemplo de ambas construcciones:

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-17-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

script_expansion1.sh

TAREAS

#!/bin/sh
VAR=1
echo $VAR
unset VAR
echo ${VAR:-2}
echo $VAR

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

script_expansion2.sh
#!/bin/bash
VAR=1
echo $VAR
unset VAR
echo ${VAR:=2}
echo $VAR

Mire el contenido de los scripts anteriores en su sistema, invquelos y analice los resultados.

3.4.3 Sustitucin de comando


Permite que la salida estndar de un programa se utilice como parte de la lnea que se va a interpretar.
Existen dos opciones, con el mismo funcionamiento
$(comando)
`comando`
En el segundo caso se est utilizando la tilde francesa o acento grave, que no debe confundirse con las
comillas simples. Para escribirla, hay que pulsar la tecla correspondiente a `y pulsar espacio.
El shell ejecutar comando, capturar su salida estndar y sustituir $(comando) por la salida
capturada. A continuacin la salida ser dividida en campos usando la variable IFS y se realizar la
expansin de ruta sobre el resultado. Si la sustitucin de comando est entre comillas dobles, no se
realizar ni la divisin ni la expansin de ruta.
Por ejemplo, para almacenar en una variable el nombre de todos los ficheros con extensin .sh del
directorio actual, podra escribir:
VAR=`ls *.sh`
O, por ejemplo, para matar el proceso con nombre firefox-bin, podra usar:
kill -9 $(pidof firefox-bin)

3.4.4 Expansin aritmtica


El formato para realizar una expansin aritmtica es el siguiente:
$((expresin))
Permite evaluar las cadenas indicadas en la expresin como enteros, admitiendo gran parte de los
operadores usados en el lenguaje C, pudiendo usar parntesis como parte de la expresin y el signo "-"

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-18-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

para nmeros negativos (a las cadenas que contengan letras se les asigna el valor "0"). Tras la
evaluacin aritmtica, el resultado vuelve a ser convertido a una cadena.6
Si se usan variables en la expresin, no es necesario que vayan precedidas por el carcter $ si ya
contienen un valor entero vlido.
Puede ver ms detalles en el apartado 2.6.4 del estndar.
Mire el contenido del script "script_expansion3.sh", que deber contener lo siguiente:

TAREAS

script_expansion3.sh
#!/bin/sh
VAR=1
VAR=$VAR+1
echo $VAR
RES1=$(($VAR))+1
echo $RES1
RES2=$(($VAR+1))
echo $RES2
VARb=b
echo $(($VARb+1))
Compruebe que dispone del permiso de ejecucin. Invquelo mediante el comando:
cd /home/afast/scripts/;

./script_expansion3.sh

Analice el resultado.

3.4.5 Expansin de ruta


Los campos que incluyan los caracteres *, ? y [ (asterisco, interrogacin y apertura de
corchetes) no entrecomillados sern sustituidos por la lista de ficheros que cumplan ese patrn. Si no
hay ningn fichero con ese patrn no se sustituye nada. El uso de estos caracteres ya se ha utilizado en
otros cursos (anexo de Fundamentos de Programacin I) y temas (Tema 1).
Puede ver ms detalles en el apartado 2.13 del estndar.

TAREAS

Comente la lnea del script "script_var-[Link]", visto en el apartado 3.3, donde


aparece la palabra firefox. Ejecute los siguientes comandos observando el valor de la variable
especial @:

cd /home/afast/scripts/
./script_var-[Link] script_for?.sh
./script_var-[Link] script_for*.sh
./script_var-[Link] script_expansion*.sh
./script_var-[Link] script_expansion[12].sh
./script_var-[Link] script_e*.sh

La conversin de un nmero a un carcter puede realizarse con $'\xxx' (en bash) o con '\xxx' (en dash), ambos con
comillas simples, pero ello no est recogido en el estndar POSIX.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-19-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

3.5 Comandos del shell (5 minutos)


Un comando puede ser clasificado en las siguientes tipos de comandos (de menor a mayor nivel):
a) Comandos simples
b) Tuberas
c) Listas AND-OR
d) Listas
e) Listas compuestas
f) Comandos compuestos (o estructuras de control)
g) Definiciones de funcin
Cada uno de estos tipos se forma mediante la composicin de elementos de los tipos inferior. Pero
tambin se permite anidar distintos tipos de comandos (no todas las combinaciones son posibles como
se ver ms adelante), por lo que podramos encontrarnos: tuberas de comandos compuestos,
comandos compuestos formados por otros comandos compuestos, etc.
En general, el valor devuelto por un comando compuesto (tipo b y superiores) ser el valor devuelto
por el ltimo comando simple ejecutado.
A continuacin describiremos cada uno de los tipos (salvo las funciones, que las veremos en un
apartado aparte). Puede ver ms detalles en el apartado 2.9 del estndar.

3.5.1 Comandos simples


Un comando simple est formado por (todos los elementos son opcionales) una secuencia de
asignacin de variables y redirecciones (en cualquier orden) seguida de palabras (elemento ejecutable
y sus argumentos) y redirecciones.
Es decir, en un mismo comando simple se puede hacer simultneamente la asignacin de variables y la
ejecucin de un programa. Cuando un comando simple no incluye un programa a ejecutar, la
asignacin de variables afecta a todo el shell, de lo contrario la asignacin slo afecta al programa que
se va a ejecutar.
Si en un mismo comando simple hubiera que hacer expansiones en las palabras y en la asignacin de
variables, primero se hace las expansiones de las palabras.
Ejemplos de comandos simples:
VAR=x
Asigna el valor x a la variable VAR y afecta a todo el shell.
VAR=x programa

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-20-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Asigna el valor x a la variable VAR y afecta solo al programa.


VAR=y OTRA=z
VAR=x programa $VAR
echo $VAR
Se asigna el valor y a la variable VAR y el valor z a la variable OTRA, que afectan a todo el shell.
A continuacin, asigna el valor x a la variable VAR y afecta slo al programa, al cual se le pasa como
primer argumento y. A continuacin se imprime y por pantalla.
VAR=x > fichero programa
VAR=x programa > fichero

#equivalente

Ambas lneas, asignan el valor x a la variable VAR que afecta solo al programa. Se ejecuta el
programa y la salida estndar se redirige al archivo fichero. La redireccin se realiza
independientemente de que aparezca antes o despus del programa. Si hubieran varias redirecciones se
realizan en el orden de aparicin en la lnea, de izquierda a derecha.

3.5.2 Tuberas
Una tubera es una secuencia de uno o ms comandos (simples o compuestos, pero no ningn tipo de
lista) separados por el operador |. La salida estndar de un comando se conecta a la entrada estndar
del siguiente comando simple. Esta conexin se hace previamente a cualquier redireccin. El formato
es:
[!] comando1 [ | comando2 ]

#los []7 indican que es opcional

Opcionalmente, se puede aadir delante el carcter ! que hace la negacin lgica del valor devuelto
por el ltimo comando, de tal manera que el valor devuelto por la tubera sera 1 si el ltimo comando
devuelve 0, o 0 en caso contrario.

3.5.3 Listas AND-OR


Una lista AND es una secuencia de tuberas (tenga en cuenta que una tubera puede ser slo un
comando simple) separadas por el operador &&. El formato es:
tuberia1 [ && tuberia2 ]
Se van ejecutando las tuberas de izquierda a derecha hasta que una de ellas devuelva un valor distinto
de cero. No se realiza ninguna expansin en una tubera hasta que el shell no determine que tiene que
ejecutar dicha tubera (depender del resultado de la tubera anterior).
Una lista OR es una secuencia de tuberas separadas por el operador ||. El formato es:
tuberia1 [ || tuberia2 ]
Se van ejecutando las tuberas de izquierda a derecha hasta que una de ellas devuelva un valor cero.
No se realiza ninguna expansin en una tubera hasta que el shell no determine que tiene que ejecutar
dicha tubera.
7

Recuerde que la notacin usada a lo largo de las prcticas en la sintaxis de los comandos es escribir entre
corchetes [x] aquellos parmetros opcionales.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-21-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Una lista AND-OR es el resultado de combinar listas AND y/o OR en una misma lnea. Los
operadores && y || se evalan con la misma prioridad de izquierda a derecha. Ejemplo:
tuberia1 || tuberia2 && tuberia3

3.5.4 Listas
Las listas son secuencias de una o ms listas AND-OR separadas por los operadores ; o &. Los
operadores ; y & no pueden aparecer seguidos (por ejemplo, dara error prog1 & ; prog2)
Segn el operador las listas pueden ser secuenciales o asncronas o mixtas (combinacin de ambas).
[Link]

Listas secuenciales

Se utiliza como separador el operador ;. Se van ejecutando los distintos comandos secuencialmente
(no se ejecuta un comando hasta que haya terminado el anterior). Cada lista AND-OR debe estar
terminada por el operador ; a excepcin de la ltima donde es opcional. El formato es:
listaAND-OR1 [ ; listaAND-OR2 ] [ ; ]
[Link]

Listas asncronas

Se utiliza como separador el operador &. Se van ejecutando los distintos comandos sin esperar a que
el comando anterior termine (ejecucin en segundo plano). El formato es:
listaAND-OR1 & [ listaAND-OR2 & ]
En este caso, a menos que se haga una redireccin explcita de la entrada estndar, si un programa en
segundo plano lee de la entrada estndar recibir un error de fin de fichero (EOF).
[Link]

Listas mixtas

Son combinaciones de listas secuenciales y sncronas. Por ejemplo:


lANDOR1 & lANDOR2 [ ; ]

#asncrona y secuencial

lANDOR1 ; lANDOR2 &

#secuencial y asncrona

lANDOR1 ; lANDOR2 & lANDOR3

#secuencial y asncrona

lANDOR1 & lANDOR2 & lANDOR3 ; lANDOR4 #asncrona y secuencial


lANDOR1 ; lANDOR2 & lANDOR3

#secuencial, asncrona, secuencial

3.5.5 Listas compuestas


No es ms que una secuencia de listas (apartado 3.5.4) separadas por el carcter de nueva lnea (intros)
que est terminada por el operador ;, el operador & o el carcter de nueva lnea (intro). La utilidad
de este tipo de listas se ver sobre todo cuando se expliquen los comandos compuestos.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-22-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Mire el contenido del script "script_operadores.sh", que deber contener lo siguiente:

TAREAS

script_operadores.sh
head -1 /etc/passwd && echo "Sin error1A" || echo "Con error1B"
head -1 /nofile && echo "Sin error2A" || echo "Con error2B"
echo "Comando dividido \
en dos lneas"
echo "Sin escapado: $$"
echo "Con escapado: \$\$"
echo "N de proceso del shell bash:" `pidof bash`

Compruebe que dispone del permiso de ejecucin. Invquelo y analice su funcionamiento.


Desde la lnea de comandos, cree listas y tuberas de todos los tipos vistos usando
combinaciones de los comandos ls, echo y ps.

3.6 Comandos compuestos o estructuras de control (25 minutos)


Los comandos compuestos son lo que en otros lenguajes de programacin se conoce como estructuras
de control. Cada uno de estos comandos compuestos (o estructuras de control) estn delimitados por
una palabra reservada u operador de control al principio y otro al final (terminador). Si se hace una
redireccin a continuacin del terminador, en la misma lnea, esa redireccin se aplicar a todos los
comandos que se encuentre en ese comando compuesto, a menos que se haga otra redireccin explcita
en un comando en concreto.
A continuacin se hace un repaso por todas las estructuras de control disponibles en el estndar
POSIX. Puede consultar el apartado 2.9.4 del estndar para ms informacin.

3.6.1 Secuencial. Agrupacin de comandos.


La agrupacin de comandos permite mejorar la legibilidad del cdigo, aplicar una redireccin a un
conjunto de comandos y crear un subshell entre otras cosas.
Existen dos formas de agrupar comandos, con los siguientes formatos:

( lista-compuesta )
Se ejecuta la lista compuesta en un subshell. Los cambios que se produzcan en este subshell
no afectarn al shell actual. Si la lista compuesta est terminada por el carcter de nueva lnea,
este carcter puede omitirse.

{ lista-compuesta }
Se ejecuta la lista compuesta en el shell actual. Recuerde que las listas compuestas estn
terminadas por los operadores ;, & o nueva lnea. Las llaves deben estar separadas de
cualquier otro elemento de la lnea por espacios u otros operadores.

En ambos casos, se permite aadir una redireccin al final (detrs del ) o }) que afectar a todos
los comandos del grupo.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-23-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

3.6.2 Condicional: if-elif-else


Presenta la siguiente sintaxis:
if lista-compuestaA1 then
lista-compuestaB1
elif lista-compuestaA2 then
lista-compuestaB2
...
else
lista-compuestaN
fi
Las entradas elif tienen el significado de un else seguido de un nuevo if. Puede haber tantas
entradas elif como se desee. Tanto las entradas elif como la entrada else son opcionales.
En esta estructura, lo primero que se hace es ejecutar la lista-compuestaA1, si el valor devuelto es 0
(ADVERTENCIA: 0 significa verdadero aqu), se ejecutara lista-compuestaB1 y terminara la
estructura if. Si el valor devuelto no es 0 se comprueba el siguiente elif. Si ninguna de las listascompuestas A devuelve 0 se ejecutara el bloque del else. En otras palabras, las listas compuestas B
solo se ejecutan si se ha comprobado su respectiva lista-compuesta A y ha devuelto 0.
A veces, para mejorar la legibilidad, las listas-compuestas se encierran entre llaves (agrupacin de
comandos) pero es opcional. Asimismo, then estar en una lnea u otra dependiendo del operador
(&, ; o nueva lnea) utilizado para terminar la lista compuesta.
Por ejemplo, si tenemos un programa llamado condicion que devuelve 0 si algo es verdadero y 1 si
es falso, los siguientes ejemplos son equivalentes:
if condicion; then
{ comando1; comando2; }
fi

if condicion; then
comando1; comando2;
fi

if condicion
then
comando1;
comando2;
fi

if condicion
then
comando1
comando2
fi

if condicion; then comando1; comando2; fi

if condicion; then { comando1; comando2; } fi


if condicion; then comando1; comando2; fi
Recuerde que si usa las llaves, debe separarlas del resto de elementos. Por ejemplo:
FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-24-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

if condicion; then {comando1; comando2;} fi


if condicion; then{ comando1; comando2;} fi
if condicion; then { comando1; comando2 } fi
darn error de sintaxis.
Respecto a la condicin que puede usarse, basta cualquier lista compuesta que devuelva un valor
(por ejemplo, pueden usarse los comandos internos true o false). El valor de una lista
compuesta es el valor del ltimo comando simple ejecutado en la lista compuesta. Un programa
habitual que se utiliza como condicin es el programa test.
[Link]

Comando test

El comando test se puede ejecutar de dos formas (ambas equivalentes):


test expresion
[ expression ]

#los [] deben estar obligatoriamente separados

En la segunda forma los corchetes no son operadores ni indican que la expresin sea opcional, sino
que realmente son el nombre del programa.
Puede ver la descripcin del comando test segn el estndar en la siguiente URL:
[Link]

Como expresiones ms habituales pueden usarse las siguientes:

Tipo

Expresin

Verdadera s (devuelve 0)

n1 -eq n2

n1 = n2

n1 -ne n2

n1 n1

Enteros (n1, n1 -gt n2


n2 enteros) n1 ge n2

n1 > n2

n1 -lt n2

n1 < n2

n1 -le n2

n1 n2

"$VAR" = "cad"

$VAR vale cad. Es conveniente poner la variable entre


comillas por si tuviera espacios o estuviese vaca, para
que al expandirse no d error de sintaxis.

"$VAR" != "cad"

$VAR vale algo distinto de cad. Igual que en el caso


anterior es conveniente poner la variable entre comillas.

-z $VAR
$VAR

$VAR est vaca. Equivale a "$VAR" = ""

-n $VAR

$VAR no est vaca. Equivale a "$VAR" != "" o ! -z

Cadenas

n1 n2

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-25-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

Tipo

Ficheros

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Expresin

Verdadera s (devuelve 0)
8

-e $FILE

$FILE existe

-f $FILE

$FILE existe y es regular9

-h $FILE

$FILE existe y es un enlace simblico

-d $DIR

$DIR existe y es un fichero de tipo directorio

-p $FILE

$FILE existe y es un fichero especial tubera (pipe)

-b $FILE

$FILE existe y es un fichero especial de bloques

-c $FILE

$FILE existe y es un fichero especial de caracteres

-r $FILE

$FILE existe y puede leerse

-w $FILE

$FILE existe y puede modificarse

-x $FILE

$FILE existe y puede ejecutarse

-s $FILE

$FILE existe y su tamao es mayor de cero bytes

Cualquiera de las condiciones anteriores puede ser precedida por el operador negacin !, en cuyo
caso la condicin ser cierta si no se satisface la comparacin indicada. Por ejemplo, ! -d $DIR se
cumplir si $DIR NO es un directorio.
Asimismo, se permite crear condiciones mltiples mediante los operadores:
condicion1

-a condicion2

AND: Verdadero si ambas condiciones son verdaderas

condicion1

-o condicion2

OR: Verdadero si se cumple alguna de las dos condiciones

Recuerde las restricciones de sintaxis del shell en lo que respecta a los espacios, especialmente
importantes en la escritura de las condiciones. Por ejemplo, la siguiente entrada dar error de sintaxis
(el espacio tras ; s puede omitirse):
if[ condicion ]; then
Y la siguiente dar error porque buscara el comando [comando] (incluyendo los corchetes como
parte del nombre del comando), que en general no encontrar (mostrando un mensaje de orden no
encontrada).
if [comando]; then

8
9

Si se indica un enlace simblico, ser cierta slo si existe el enlace simblico y el fichero apuntado.
Si se indica un enlace simblico, el tipo es el del fichero apuntado.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-26-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 Mire el contenido del siguiente script en su sistema y compruebe que tiene el permiso de
ejecucin:

TAREAS

script_if.sh
#!/bin/sh
FILE=/tmp/archivo
if [ -r $FILE -a ! -w $FILE ]; then
echo Fichero $FILE existe y no es modificable
else
echo Fichero no encontrado o es modificable
fi
VAR1=1; VAR2=1
if [ $(($VAR1)) -ne $(($VAR2)) ]; then
echo Distintos
elif ls /; then
echo
fi
2 Ejecute los comandos siguientes y analice el resultado:
rm f /tmp/archivo
cd /home/afast/scripts/ ; ./script_if.sh
3 Ejecute ahora los comandos siguientes y vuelva a analizar el resultado:
touch /tmp/archivo
chmod w /tmp/archivo/
./script_if.sh

3.6.3 Condicional: case


Presenta la siguiente sintaxis:
case cadena_texto in
patron1) lista-compuesta1;;
patron2) lista-compuesta2;;
...
* ) lista-defecto;;
#patron coincidente con todo
esac
En esta estructura, primero se expande cadena_texto (si es necesario) y busca el primer patrn
que encaje con dicho valor. Cuando lo encuentre, ejecuta la lista-compuesta correspondiente y finaliza
la estructura. Los patronN se interpretan como cadenas de caracteres y si es necesario se expanden
(por ejemplo, pueden contener variables). Admite los mismos caracteres que los usados para la
expansin de ruta (*, ? y []). Asimismo, pueden usarse patrones mltiples mediante el operador
| y opcionalmente pueden comenzar con el parntesis:
patronA | patronB)
(patronA | patronB)
(patronC)

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-27-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

El doble punto y coma ;; permite determinar el final de los elementos a interpretar cuando se cumpla
su patrn asociado. Por ese motivo, el ;; del ltimo patrn puede omitirse. Es posible aadir espacios
entre los patrones y los parntesis abiertos ) que marcan el final del patrn. Conforme a esto, seran
sintaxis vlidas alternativas las siguientes:
case cadena_texto in
patron1)
comando1;
comando2;;
esac

case cadena_texto in
patron1 )
comando1
comando2
esac

case cadena_texto in patron1) comando1; comando2;; esac

case cadena_texto in (patron1) comando1; comando2; esac

1 Mire el contenido del siguiente script en su sistema y compruebe que tiene el permiso de
ejecucin:

TAREAS

script_case.sh
#!/bin/sh
case $1 in
archivo | file)
echo Archivo ;;
*.c)
echo Fichero C ;;
*)
echo Error
echo Pruebe otro ;;
esac
2 Ejecute los comandos siguientes y analice el resultado:
cd /home/afast/scripts/
./script_case.sh archivo
./script_case.sh file
./script_case.sh file.c
./script_case.sh file.c++

3.6.4 Bucles incondicionales: for


Presenta la siguiente sintaxis:
for VAR in lista_valores; do
lista-compuesta
done

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-28-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

El punto y coma ";" puede sustituirse por un salto de lnea, y viceversa. As, por ejemplo, seran
sintaxis vlidas las siguientes:
for VAR in lista_valores; do lista-compuesta done
for VAR in lista_valores
do
lista-compuesta
done
lista_valores se corresponde con un conjunto de valores (tomndose cada valor como una
cadena de caracteres que puede ser objeto de expansin). La estructura for define la variable
VAR (si no ha sido previamente definida). Para cada uno de los valores del resultado de expandir
lista_valores, la estructura inicializa la variable VAR con dicho valor y realiza una iteracin
(ejecutando lista-compuesta, en la cual suele ser habitual acceder al valor de la variable $VAR).
Es posible omitir in lista_valores. Si se omite equivale a haber escrito lo siguiente: in $@
1 Mire el contenido del siguiente script en su sistema, compruebe que tiene el permiso de
ejecucin e invquelo:

TAREAS

script_for1.sh
#!/bin/sh
for i in 1 2 3; do
echo "Iteracion: $i"
done
2 Mire el contenido del siguiente script en su sistema, compruebe que tiene el permiso de
ejecucin e invquelo:
script_for2.sh
#!/bin/sh
for file in `ls /home/afast`; do
echo "Fichero: $file"
done
Suele ser habitual el uso del comando externo seq10 para generar una lista de valores. El comando
seq presenta la sintaxis:
seq

valor_inicial

valor_final

siendo ambos valores nmeros enteros. La salida del comando es la secuencia de nmeros enteros
entre ambos valores extremos indicados.

10

Si bien este comando no est recogido en el estndar POSIX, es habitual su presencia en la mayora de los
sistemas UNIX.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-29-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 Ejecute el comando siguiente y observe su salida:

TAREAS

seq 1 10
1 Mire el contenido del siguiente script en su sistema, compruebe que tiene el permiso de
ejecucin general e invquelo:
script_for_seq.sh
#!/bin/sh
for i in `seq 1 3`; do
echo "Iteracion: $i"
done
Compruebe como se obtiene el mismo resultado que se tena al invocar el fichero
script_for1.sh.

3.6.5 Bucles condicionales: while y until


Presentan la siguiente sintaxis:
while lista-comp-condicion do
lista-compuesta
done

until lista-comp-condicion do
lista-compuesta
done

La lista-comp-condicion es una lista compuesta que se rige por las mismas directrices
indicadas en la estructura "if". La estructura:

while va iterando (interpreta la lista-compuesta) mientras se cumpla la condicin


indicada (lista-comp-condicion devuelve el valor 0)

until va iterando (interpreta la lista-compuesta) mientras NO se cumpla la


condicin indicada (lista-comp-condicion devuelve un valor distinto de 0).

As, por ejemplo, seran vlidas y equivalentes las sintaxis siguientes:


while lista-comp-condicion
do
comando1
comando2
done

until lista-comp-condicion
do
comando1
comando2
done

while lista-comp-condicion ; do comando1; comando2; done

while lista-comp-condicion ; do { comando1; comando2; } done

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-30-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

TAREAS

1 Mire el contenido del siguiente script en su sistema, compruebe que tiene el permiso de
ejecucin e invquelo:
script_while.sh
#!/bin/sh
CONTADOR=0
while [ $CONTADOR lt 3 ]; do
echo "Contador: $CONTADOR
CONTADOR=$(($CONTADOR+1))
done
2 Mire el contenido del siguiente script en su sistema, compruebe que tiene el permiso de
ejecucin e invquelo:

script_until.sh
#!/bin/sh
CONTADOR=0
until [ $CONTADOR ge 3]]; do
echo El contador es $CONTADOR
CONTADOR=$(($CONTADOR+1))
done

Podr comprobar cmo ambos scripts devuelven la misma salida.

3.6.6 Ruptura de sentencias de control


Igual que en otros lenguajes de programacin, como en el lenguaje C, es posible romper el
funcionamiento normal de las estructuras repetitivas. Sin embargo, hacerlo supone hacer cdigo no
estructurado. Por coherencia con lo visto en otras asignaturas, no se aconseja su uso.
En shell script esto se realiza con dos comandos internos: continue y break
Ambos son comandos internos de la shell con la siguiente sintaxis y funcionalidad:
a)

continue: utilizado en estructuras de control para detener la iteracin actual y continuar


con la siguiente. Su sintaxis es:
continue

[n]

El parmetro opcional "n" es un nmero entero positivo que permite especificar la estructura
de control en la que se desea detener la iteracin. Si se tienen varias estructuras de control
anidadas, la estructura actual en la que se encuentra el "continue" corresponde a la estructura
"1"; la estructura superior que engloba a sta sera la estructura "2", y as sucesivamente. As,
el valor de "n" referencia a la estructura de control en la que deseamos detener la iteracin
actual y continuar con la siguiente (por omisin, "n=1").
b) break: utilizado en estructuras de control para detener todas las iteraciones restantes de la
estructura de control actual. Su sintaxis es:

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-31-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

break [n]
El parmetro opcional "n" es un nmero entero positivo que permite indicar si se desean
cancelar varias estructuras de control anidadas (por omisin, "n=1", que referencia a la
estructura actual en la que se encuentra el "break").

3.7 Funciones (5 minutos)


Presentan la siguiente sintaxis:

Definicin

fnombre() comando-compuesto [redireccion]

Invocacin

fnombre

[arg1

arg2 ]

El parntesis siempre debe estar vaco (slo indica que se est definiendo una funcin). Pueden
insertarse espacios antes, entre y despus del parntesis. El comando compuesto puede ser cualquier
de los que se han visto (agrupacin de comandos, estructuras condicionales, estructuras repetitivas).
Opcionalmente pueden aplicarse redirecciones a la funcin (afecta a los comandos que contiene). A
continuacin se muestran ejemplos bsicos de definicin de funciones:
fnombre(){
comando1
comando2
}

fnombre(){
comando1;
comando2;
}

fnombre() { comando1; comando2; }

En lo que se refiere al nombrado de las funciones, se aplican los mismos criterios antes expuestos para
el nombrado de las variables.
El estndar permite que dentro de una funcin se invoque a otra. Los argumentos pasados a la funcin
en su invocacin son accesibles desde el cuerpo de la funcin mediante los parmetros posicionales
"$1", "$2",..., "$9", "${10}",... Por tanto, dentro de la funcin estas variables no corresponden a los
argumentos usados en la invocacin del script, sino a los usados en la invocacin de la funcin.
Al igual que las variables, las funciones son:

Locales: slo existen en el proceso shell en que son definidas.

Slo son accesibles desde el momento de su definicin hacia abajo del script, esto es, siempre
deben definirse primero e invocarse despus (no puede invocarse a una funcin que es
definida ms adelante).

Dentro de la funcin son visibles todas las variables y funciones definidas antes de su
invocacin.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-32-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Dentro del cuerpo de la funcin suele ser habitual el uso del comando return, el cual provoca la
salida inmediata de la funcin con el valor de retorno (nmero) indicado:
return

[n]

Si no se indica ningn valor de retorno, la funcin devuelve el valor del ltimo comando ejecutado.
Como siempre, el valor devuelto por la funcin puede obtenerse con la variable "$?".
Mire el contenido del siguiente script en su sistema, compruebe que tiene el permiso de
ejecucin, invquelo y analice su funcionamiento:

TAREAS

script_funcion.sh
#!/bin/sh
suma () {
C=$(($1+$2))
echo "Suma: $C"
return $C
echo "No llega"
}
suma 1 2
echo "Valor devuelto: " $?

Uso de comandos y aplicaciones (15 minutos)

3.8

Con objeto de alcanzar una mayor homogeneizacin entre los sistemas, el estndar POSIX recoge una
lista de comandos que deben ser implementados en cualquier sistema, clasificndolos segn sean
ordenes internas del shell (built-in) o aplicaciones externas.

3.8.1 Comandos internos


Los comandos internos corresponden a rdenes interpretadas por el propio shell (luego no existe
ningn fichero ejecutable asociado al comando). Se distinguen dos tipos de comandos internos:

Especiales: un error producido al ejecutar este comando da lugar a que el shell termine. Por
consiguiente, el script termina con un error y un valor de retorno mayor de cero (vea el
apartado 2.8.2 del estndar para saber el valor de retorno).

Regulares: el shell no tiene que terminar cuando se produce un error en estos comandos.

En la siguiente tabla se recogen los comandos especiales definidos en el estndar.


Comando interno
Descripcin
especial
break, continue,
export, return, Se han descrito anteriormente.
unset, .

Comando nulo. Este comando no hace nada. Se suele utilizar en estructuras


de control que requieren un comando para ser sintcticamente correctas, pero
no se quiere hacer nada (ver ms adelante).

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-33-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Comando interno
especial

Descripcin

eval

Permite crear comandos a partir de sus argumentos (ver ms adelante)

exec

Ejecuta comandos (sustituyendo al shell actual) y abre, cierra y copia


descriptores de fichero

exit

Provoca que el shell termine (ver ms adelante)

readonly
set

Permite hacer que una variable sea de slo lectura (no admite asignaciones)
Establece opciones del shell y modifica los parmetros posicionales.

shift

Elimina el nmero indicado de parmetros posicionales empezando desde el


1, desplazando el resto de parmetros a posiciones inferiores.

times

Muestra los tiempos de procesamiento del shell y sus procesos hijos.

trap

Permite atrapar o ignorar seales del sistema.

Puede obtener ms informacin en el estndar, en concreto en la siguiente URL:


[Link]
Como comandos internos regulares, el estndar define los siguientes:
Bsicos regulares
Para Profundizar
regulares

bg, cd, false, fg, jobs, kill, pwd, read, true, wait
alias, command, fc, getopts, newgrp, umask, unalias

Consulte: [Link]
Entre dichos comandos (especiales y regulares), por su utilidad en los shell-scripts deben destacarse
los siguientes:
[Link]

Salida del proceso shell actual, exit

La sintaxis de este comando es:


exit

[n]

TAREAS

exit provoca la eliminacin inmediata del proceso correspondiente al shell que est leyendo el
script. El parmetro opcional es un nmero entero que corresponde al valor devuelto por el script. Si
no se indica ningn parmetro, el valor devuelto por el script ser el del ltimo comando ejecutado.
1 Abra una consola de comandos con el usuario "afast". Mediante el comando "su" abra
una sesin con el superusuario. Al abrir la sesin con "root", se ha creado un nuevo
proceso en memoria correspondiente al shell encargado del intrprete de comando en la
sesin del "root". Use el comando "ps ax" para localizar dicho proceso.
2 Ejecute el comando "exit", volviendo al usuario "afast". Esto habr provocado la
eliminacin del proceso shell encargado de la lnea de comandos como en la que trabajaba
"root". Ejecute de nuevo "ps ax" comprobando como dicho proceso ha desaparecido

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-34-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

3 Mire el contenido del script "script_exit.sh", que deber contener lo siguiente:


script_exit.sh
Echo Dentro del script
exit 3
echo Fuera del script
4 Compruebe que dispone del permiso de ejecucin general. Desde la sesin del usuario
"afast", vuelva a usar el comando "su" para abrir una sesin con el superusuario. Desde
dicha sesin ejecute el comando anterior mediante las siguientes invocaciones:
cd /home/afast/scripts/
/bin/bash
script_exit.sh
./script_exit.sh
Ambas invocaciones provocan la creacin de un subshell (un nuevo proceso shell)
encargado de leer el script. Por ello, cuando se llega al comando "exit" se para la
interpretacin del script y dicho subshell es eliminado, volviendo al proceso shell padre
correspondiente a la lnea de comandos desde la que estbamos trabajando.

TAREAS

Ejecute el comando "echo $?" para comprobar cmo el script ha devuelto el cdigo de
error "3".
5 Ejecute los siguientes comandos:

script_exit.sh && echo Hola, comprobando que no se imprime la cadena


Hola debido a que el script devuelve un cdigo de error (>0).

script_exit.sh || echo Hola, comprobando ahora s se imprime.

Edite el script para que el comando exit devuelva cero (exit 0), y vuelva a
invocar el comando script_exit.sh && echo Hola, comprobando que
ahora tambin se imprime la cadena Hola.

6 Vuelva a invocar el script pero ahora mediante:


.

script_exit.sh

Ver como la sesin del "root" se cierra automticamente y vuelve a la sesin del usuario
"afast". Esto se debe a que en este caso no se est creando ningn nuevo subshell, sino
que el propio shell de la lnea de comandos del usuario "root" es el encargado de
interpretar el script. Al llegar al comando "exit", ste provoca la eliminacin del proceso
shell que lee el script, esto es, la eliminacin de la sesin del usuario "root".
Ejecute el comando "echo $?" para comprobar cmo el script ha devuelto el cdigo de
error "0" (sin error) correctamente.
7 Ejecute y analice el funcionamiento de los siguientes comandos:
sh -c "exit 0" && echo "Sin error1A" || echo "Con error1B"
sh -c "exit 1" && echo "Sin error2A" || echo "Con error2B"

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-35-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

[Link]

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Entrada estndar a un shell-script, read

El comando "read" lee una lnea de la entrada estndar (teclado) y la guarda en variables. Solo
funciona en shell interactivos (leyendo la entrada del teclado), de lo contrario no hace nada. En su
forma ms bsica, presenta la siguiente sintaxis:
read VAR1 [VAR2 ]
Este comando espera a que el usuario introduzca una lnea de texto incluyendo espacios (la entrada
termina cuando el usuario tecla "Intro"; la pulsacin Intro no forma parte del valor asignado a la
cadena). Esta lnea se divide en campos (segn la variable IFS). Tras ello, el comando define las
variables dadas como argumentos, inicializndolas con los campos obtenidos en la divisin. Si hay
ms campos que variables, los campos restantes se asignan a la ltima variable. Si hay ms variables
que campos, las variables sobrantes reciben como valor la cadena vaca "".
Consulte
la
pgina
del
estndar
para
obtener
[Link]

ms

informacin:

Algunos intrpretes de comandos como bash aaden otras opciones a este comando, como la
posibilidad de imprimir un mensaje usando la opcin -p (vea la ayuda de read en bash man bash).

TAREAS

Cree el script "script_read.sh" (ste, como es breve, no se le proporciona) que contenga lo


siguiente:
script_read.sh
echo Introduzca una cadena
read CAD
echo Cadena introducida: $CAD
Asgnele el permiso de ejecucin general, invquelo y analice su funcionamiento.
El comando read tambin puede ser til, por ejemplo, para detener la interpretacin del script hasta
que el usuario pulse una tecla:

TAREAS

Cree el script "script_read_pause.sh" que contenga lo siguiente:


script_read_pause.sh
echo "Pulse una tecla para continuar..."
read CAD
echo Continuamos...
Asgnele el permiso de ejecucin general, invquelo y analice su funcionamiento.
Resulta habitual el uso de estructuras while, combinadamente con case y read, para crear
mens interactivos, permitiendo mantenerse dentro del men.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-36-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 Edite el script script_case_menu.sh para que tenga el siguiente contenido11:


script_case_menu.sh

TAREAS

#!/bin/sh
clear
SALIR=0
OPCION=0
while [ $SALIR -eq 0 ]; do
echo "Menu:"
echo "1) Opcion 1"
echo "2) Opcion 2"
echo "3) Salir"
echo "Opcion seleccionada: "
read OPCION
case $OPCION in
1)
echo "Opcion 1 seleccionada" ;;
2)
echo "Opcion 2 seleccionada" ;;
3)
SALIR=1 ;;
*)
echo "Opcin erronea";;
esac
done
2 Ejecute el comando siguiente y seleccione las opciones del men:
script_case_menu.sh

[Link]

Construccin de comandos en tiempo de ejecucin: eval

El comando eval construye un comando mediante la concatenacin de sus argumentos (pueden ser
variables, etc.) separados por espacios. Dicho comando construido es ledo por el shell e interpretado.
La sintaxis del comando es:
eval [argumentos ]
Un posible uso es la creacin de referencias indirectas a variables (parecido a usar punteros en
lenguaje de programacin C). En la tarea siguiente se muestra esto.

11

El comando clear, tampoco recogido en el estndar POSIX, tambin suele encontrarse habitualmente en la
mayora de los sistemas UNIX. Su funcionalidad es, simplemente, limpiar la informacin impresa en la
consola de comandos.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-37-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

Cree el script "script_eval.sh" que contenga lo siguiente:

TAREAS

script_eval.sh
#ejemplo de referencia indirecta con eval
VAR="Texto"
REF=VAR
#REF es una variable que vale VAR
eval OTRA='$'$REF #equivale a ejecutar OTRA=$VAR
echo $OTRA
#se ha accedido al contenido de VAR a
#traves de REF
Asgnele el permiso de ejecucin, invquelo y analice su funcionamiento.

3.8.2 Comandos externos


Los comandos externos corresponden a ficheros ejecutables externos al shell. Cualquier posible
aplicacin pertenecera a esta categora de comandos (ps, firefox, emacs,...). El estndar POSIX recoge
una lista de comandos externos que aconsejablemente deberan estar en un sistema UNIX,
clasificndolos en obligatorios u opcionales segn se exija o no su implementacin para satisfacer el
estndar. Entre los comandos externos obligatorios, el estndar define los siguientes:
Bsicos
Para
Profundizar

cat, chmod, chown, cmp, date, cp, dirname, echo, expr


awk, basename, chgrp, printf

4 Depuracin de shell-scripts (5 minutos)


Si bien la programacin de shell-scripts no se puede depurar fcilmente, los shells suelen ofrecer
algunos mecanismos en este aspecto. En concreto, tanto bash como dash ofrecen los siguientes
argumentos, que pueden usarse simultneamente:
-x

Traza: expande cada orden simple, e imprime por pantalla la orden con sus argumentos, y a
continuacin su salida.

-v

Verbose: Imprime en pantalla cada elemento completo del script (estructura de control, ...) y a
continuacin su salida (precedida del carcter si es una sola lnea)

Tambin es posible depurar slo parte del script insertando en l los siguientes comandos (pueden
usarse igualmente en la propia lnea de comandos):
set -x
set xv

Activa las trazas/verbose. Ubicarlo justo antes del trozo del script que se desea
depurar.

set +x
set +xv

Desactiva las trazas/verbose. Ubicarlo justo despus del trozo del script que se desea
depurar.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-38-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1 Mire el contenido del siguiente script en su sistema y compruebe que tiene el permiso de
ejecucin general:
script_depuracion.sh
#!/bin/sh
echo Hola
if true; then
echo hola2
ls /
fi

TAREAS

2 Invoque dicho script con las siguientes opciones de depuracin y analice la salida:
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/dash
/bin/dash
/bin/dash

-x
-v
-xv
-x
-v
-xv

script_depuracion.sh
script_depuracion.sh
script_depuracion.sh
script_depuracion.sh
script_depuracion.sh
script_depuracion.sh
script_depuracion.sh

3 Modifique el script para que tenga el siguiente contenido:


script_depuracion2.sh
#!/bin/sh
echo Hola
set -xv
if true; then
echo hola2
ls /
fi
set +xv
4 Invoque dicho script con los siguientes comandos y analice la salida:
script_depuracion2.sh
/bin/dash script_depuracion2.sh
/bin/bash script_depuracion2.sh

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-39-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

5 Propuesta de aplicacin de la prctica (90 minutos)


APLICACIN PRCTICA
El objetivo del apartado es proponer al alumno diversos ejercicios para que ste los resuelva por s
mismo, empleando los conocimientos que ha debido adquirir a lo largo de la prctica. No se le
solicitar que entregue el trabajo realizado en este apartado. En general, podr descargarse de la web
de la asignatura la solucin de los ejercicios propuestos.
Encontrar este apartado en mltiples prcticas de la asignatura, siempre con el mismo objetivo.

A continuacin se le propone la creacin de una serie de scripts. Para ello, ser necesario tanto usar los
conocimientos expuestos en esta prctica, como los analizados en las prcticas anteriores relativos a la
administracin de Linux:
a) Los ficheros "/etc/profile" (ledo en el arranque del sistema y comn para todos los
usuarios), "$/.bashrc", "$/.bash_profile" (ledos al abrir una sesin con el usuario
correspondiente, no es necesario que existan ambos), usados para cargar las variables de
entorno, son en realidad shell-scripts. Analice el contenido de dichos scripts y modifquelos
convenientemente para definir los alias:

alias red='ifconfig -a': para todos los usuarios del sistema.

alias casa='echo $PWD': slo para el usuario afast.

alias sockets='netstat -l': slo para el usuario root.

b) Cree los siguientes scripts:

[Link]: debe inicializar las variables CONFIG='-a', ARP='-n' y


ROUTE.

[Link]: debe definir las funciones arranque_red() (encargada de


activar la tarjeta eth0), parada_red() (encargada de desactivar la tarjeta eth0)
y estado_red() (encargada de ejecutar los comandos ifconfig, arp y
route aplicndoles los parmetros pasados a la funcin en los argumentos 1, 2 y 3,
respectivamente).

[Link]: debe importar las variables y funciones definidas por los dos scripts
anteriores. Mostrar al usuario un men en el que le pregunte si desea arrancar la red
(invocando la funcin arranque_red()), pararla (funcin parada_red()) o
mostrar su estado (funcin estado_red()). Debe comprobar si alguna de las
variables CONFIG, ARP y ROUTE es nula y, en caso de serlo, permitirle al usuario
escribir interactivamente (mediante la funcin read) los parmetros con los que
invocar el comando correspondiente.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-40-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

c) script_copy.sh: script que copie un fichero regular en otro, ambos pasados como
argumentos. Si no se le pasan los argumentos, lo comprobar, y solicitar al usuario que los
introduzca interactivamente.
d) script_print.sh: script que imprima en pantalla el contenido de un fichero de datos, o
el contenido de todos los ficheros de un directorio, segn se le pase como argumento un
fichero regular o un directorio.
e) script_borrar.sh: script que borre con confirmacin todos los ficheros pasados como
argumentos.
f) script_sesiones.sh: script al que, pasndole el login de un usuario, devuelva cuntas
sesiones tiene abiertas en el sistema.
g) script_mostrar.sh: script que para cada argumento que reciba (puede recibir una lista
de argumentos) realice una de las siguientes operaciones:

Si es un directorio, ha de listar los ficheros que contiene.

Si es un fichero regular, tiene que imprimir su contenido por pantalla.

En otro caso, debe indicar que no es ni un fichero regular ni un directorio (por ejemplo, un
fichero de bloques o de caracteres del directorio "/dev").

h) script_ejecucion.sh: script que asigne el permiso de ejecucin a los ficheros


regulares o directorios pasados como argumento (puede admitir una lista de ficheros).
i)

script_doble.sh: script que pida un nmero por teclado y calcule su doble.


Comprobar que el nmero introducido es vlido y, antes de terminar, preguntar si deseamos
calcular otro doble, en cuyo caso no terminar.

j)

script_tipos.sh: script que devuelva el nmero de ficheros de cada tipo (ficheros


regulares o directorios) que hay en una determinada carpeta, as como sus nombres. Tendr un
nico argumento (opcional) que ser la carpeta a explorar. Si se omite dicho argumento, se
asumir el directorio actual. Devolver 0" (xito) si se ha invocado de forma correcta o 1"
(error) en caso contrario.

k) script_user.sh: script que reciba como argumento el login de un usuario e imprima


por pantalla la siguiente informacin: login, nombre completo del usuario, directorio home,
shell que utiliza, nmero de sesiones actualmente abiertas y procesos pertenecientes a dicho
usuario. El script debe permitir las siguientes opciones:

-p: slo muestra la informacin de los procesos.

-u: muestra toda la informacin excepto la referente a los procesos.

--help: muestra informacin de ayuda (uso del script).

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-41-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

El script debe comprobar si los argumentos pasados son correctos, as como la existencia del
usuario indicado. Como cdigo de error podr devolver 0 (xito), 1 (sintaxis de
invocacin errnea), 2 (usuario no existe).
l)

script_menu.sh: script que ofrezca al usuario un men (con una opcin para salir)
desde el que el usuario pueda seleccionar cual de los scripts anteriores (apartados b) a k))
quiere utilizar.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-42-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

6 Ejemplo de Test (5 minutos)

INSTRUCCIONES PARA LA REALIZACIN DEL TEST


I) NORMAS COMUNES (iguales a todos los Tests de la asignatura)

Los tests de cada prctica son Exmenes. El examen es INDIVIDUAL. Durante la


realizacin del Test no deber hablar ni mirar la pantalla de otro compaero. El
incumplimiento de estas normas podr ser interpretado como un intento de copia por
parte del alumno, al que se le podr expulsar de la sala y aplicarle las sanciones
pertinentes.

Slo podrn realizar el tests los alumnos presentes en la clase en la que se lleve a
cabo su realizacin. Cuando el profesor realice el control de la asistencia, deber
presentarle su DNI o documento de identificacin equivalente. Sitelo en lugar
visible.

Salvo por problemas sobrevenidos, se exigir que cada alumno asista, tanto para la
clase como para la realizacin del Test, a la sala que tiene asignada conforme a su
subgrupo de prcticas.

La realizacin de los Test se har a travs de la Web de la Asignatura en Enseanza


Virtual, mediante la pestaa Evaluaciones. Cuando llegue el momento de la
realizacin del Test, el profesor le indicar que acceda a la plataforma y le
suministrar la clave necesaria para poder comenzar el Test.

Para garantizar una adecuada realizacin del examen, el profesor podr indicar una
redistribucin de los alumnos en el aula.

Para permitir una adecuada organizacin, cuando el profesor anuncie el comienzo de


la realizacin del Test, cada alumno deber abandonar cualquier tarea que est
haciendo con su equipo, acceder la Web de la Asignatura en Enseanza Virtual,
pestaa Evaluaciones, y comenzar el Test de la Asignatura, de modo que TODOS
los alumnos comiencen el Test ms o menos simultneamente.

Una vez comenzado el Test, no se permitir la entrada de ningn alumno en la sala.


Cuando finalice el Test, salga en silencio de la sala para no molestar a los dems
compaeros que siguen realizndolo.

Durante la realizacin del test deber mirar nicamente a su pantalla. Cualquier


intento de mirar la pantalla de otro compaero, as como hablar con ste, podr ser
sancionado.

Durante los Tests, podr usar el ordenador (incluso Internet), as como usar la
documentacin que estime oportuna, pero tenga en cuenta que la duracin de los
Tests es breve, por lo que si invierte un tiempo excesivo en buscar, probablemente

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-43-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

no tenga tiempo suficiente para terminar el Test.

Si durante la realizacin del examen tiene problemas con el tamao de la letra,


recuerde que siempre puede agrandarla o achicarla mediante las opciones de
visualizacin de su Navegador, o mediante las pulsaciones Ctrl-[+] o Ctrl-[-]
(siendo [+], [-] del teclado numrico).

Si lleva consigo un telfono mvil, desconctelo completamente.

II) NORMAS PARTICULARES DE CADA TEST (pueden variar de un Test a otro,


revselas siempre)

El Test consta de 5 cuestiones, todas igualmente ponderadas ("2 puntos", sobre 10,
por cuestin).

Cada cuestin presenta 3 opciones, de las cuales slo 1 de ellas es correcta.

La cuestin mal contestada descuenta 1/3 de una cuestin bien contestada, sobre el
total del Test (una cuestin no contestada no puntuar, ni positiva ni negativamente).

Si obtuviese en el Test una calificacin negativa, se le computara como "0" puntos


al sumarla con las dems pruebas de la asignatura (dems Tests de Prcticas y
Examen).

Si alguna pregunta del Test tuviese que ser anulada, su puntuacin sera distribuida
entre las dems cuestiones del Test.

La adecuada interpretacin de las cuestiones planteadas en el examen forma parte


del mismo (el profesor no responder a ninguna pregunta relativa a la interpretacin
de las cuestiones del Test).

III) PROCEDIMIENTO DE ENTREGA DEL TEST

Cuando termine el Test, asegrese de que ha pulsado el botn "Terminar".

Tras ello, levante la mano para que el profesor acuda a su puesto de trabajo y
compruebe que todo est correcto.

Cuando el profesor se lo indique, salga de la sala en silencio.

NOTA: Estas Instrucciones sern referenciadas cuando comience el Test. Se le presentan


aqu para que no necesite invertir tiempo del examen en su lectura.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-44-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

1) Una funcin definida en un shell-script puede ser invocada desde cualquier lnea de dicho shellscript:
a) Verdadero.
b) Falso.
c) Depende del contenido de la funcin.

2) Si dentro del shell-script [Link] se define una variable VAR y luego se invoca al shell-script
[Link], dentro de [Link] se crear una variable VAR con el mismo valor que tena en [Link]
en el momento de la invocacin. Si [Link] modifica su variable VAR, ello no afectar a la
variable VAR de [Link]
a) Verdadero.
b) Falso.
c) Depende de la forma en que se invoque a [Link]

3) Para que un fichero pueda ser utilizado como shell-script debe tener la extensin .sh:
a) Verdadero
b) Falso
c) Slo es necesario para algunos mecanismos de invocacin de shell-scripts desde la lnea de
comandos.

4) En un script [Link] definimos la variable VAR=1. A continuacin se define la funcin fun. La


variable VAR no ser accesible dentro de la funcin fun:
a) Falso.
b) Verdadero.
c) Slo ser accesible si la variable se define usando export.

5) Es posible anidar funciones, estructuras de control y scripts:


a) Verdadero.

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-45-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

BLOQUE I: ADMINISTRACIN BSICA DE S.O. LINUX

PRCTICA 3: PROGRAMACIN SHELL-SCRIPT EN LINUX

b) Falso.
c) Verdadero, salvo que slo pueden anidarse funciones que no devuelvan ningn valor de
retorno.

Cuestin
Solucin

1
(b)

2
(c)

3
(b)

4
(a)

5
(a)

APAGUE EL EQUIPO
Cuando finalice la prctica no olvide apagar el equipo. Para ello:
1

Apague el "equipo" de la mquina Linux Debian, bien desde la opcin "Apagar" del escritorio
KDE o Gnome, o bien mediante el comando "poweroff".

Una vez en el sistema real desde el que entr en la mquina virtual, apague finalmente el
ordenador usando la opcin "Apagar".

FUNDAMENTOS DE APLICACIONES Y SERVICIOS TELEMTICOS

-46-

DEPARTAMENTO DE INGENIERA TELEMTICA (DIT)

También podría gustarte