Está en la página 1de 29

SEMINARIO 06053 PROGRAMACIN AVANZADA EN SHELL (shellscrip s!

R"#$% M& G$#e' L"(r")*r (r"#*%&+*#e',eii&-s&es! A(ril )e .&005

Nota importante: El presente seminario se oferta dentro del plan de formacin para personal informtico de la Universidad de Sevilla para el ao 2006 y toda su documentacin asociada est bajo licencia Creative Commons con reconocimiento !ttp:""creativecommons#or$"licenses"by"2#%"deed#es&# '( edicin: Curso 0)*%% +ro$ramacin ,van-ada en S!ell. octubre 2#00)# 2( edicin: Curso 0%*0/ +ro$ramacin ,van-ada en S!ell. abril 2#00%# Esta )( edicin divide el curso en 2 seminarios: '# Seminario 060') +ro$ramacin ,van-ada en S!ell l0nea de comandos&. septiembre 2#006# 2# Seminario 060%) +ro$ramacin ,van-ada en S!ell s!ellscripts&. septiembre 2#006#

060/3 Pr*+r"#"ci$% A0"%'")" e% Shell (shellscripts!

1NDICE
1. Introduccin.................................................................................4 '#'# 1a l0nea de mandatos########################################################################2 '#2# Edicin y ejecucin de un $uin########################################################2 '#)# 3ecomendaciones de pro$ramacin#################################################% 2. Expansiones.................................................................................7 2#'# E4pansin de llaves###########################################################################5 2#2# E4pansin de tilde#############################################################################/ 2#)# E4pansin de parmetro o de variable##############################################6 2#2# Sustitucin de mandato###################################################################'0 2#%# E4pansin aritm7tica#######################################################################'' 2#6# Sustitucin de proceso####################################################################'' 2#5# 8ivisin en palabras########################################################################'2 2#/# E4pansin de fic!ero#######################################################################'2 3. Programacin estructurada.......................................................14 )#'# 1istas de mandatos##########################################################################'2 )#'#'# 1istas condicionales##################################################################'% )#2# Estructuras condicionales y selectivas###########################################'% )#2#'# Estructuras condicionales#########################################################'% )#2#2# Estructura selectiva##################################################################'5 )#)# 9ucles##############################################################################################'/ )#)#'# 9ucles $en7ricos#######################################################################'6 5#)#2# 9ucles condicionales :mientras; y :!asta;###############################20 )#)#)# 9ucle de seleccin interactiva##################################################2' 4. Funciones...................................................................................22 5. Caractersticas especia es..........................................................25 %#'# +ro$ramas interactivos###################################################################2% %#2# Control de trabajos##########################################################################26 %#)# <nt7rprete de uso restrin$ido##########################################################2/ !. "e#erencias................................................................................2$

/& I% r*)-cci$%

1.1. La lnea de mandatos.


1a l0nea de mandatos es el interfa- del usuario con el sistema. =ue permite personali-ar el entorno de operacin y ejecutar pro$ramas y $uiones# El formato t0pico de una l0nea consta de una orden y unos modificadores y parmetros opcionales. aun=ue puede incluir al$unos caracteres especiales. =ue modifican el comportamiento t0pico#
Mandato [Modificador ...][Parmetro ...]

Un caso especial es el de las l0neas =ue comien-an por la almo!adilla #&. =ue se consideran comentarios# >ambi7n puede insertarse un comentario en mitad de una l0nea. a la derec!a de una orden#
# Esto es un comentario ls -al # lista el contenido del directorio actual

+ueden a$ruparse varias rdenes en la misma l0nea separadas por el punto y coma ;&. =ue se ejecutan siempre en secuencia# ,simismo. si un mandato es muy lar$o o en$orroso. puede usarse el carcter de escape \& para continuar escribi7ndolo en la l0nea si$uiente#
cd /var/log; grep i error * find /tmp /var/tmp ! user root type f \ -perm +2 print

1.2. Edicin y ejecucin de un guin.


Un $uin interpretado por 9,S? es un fic!ero de te4to normal =ue consta de una serie de blo=ues de cdi$o formados por l0neas de mandatos =ue se ejecutan en secuencia# El usuario debe tener los permisos de modificacin escritura& en el directorio @para crear un nuevo pro$rama@ o sobre el propio fic!ero. para modificar uno e4istente# Como un pro$rama binario. el usuario debe tener permiso de ejecucin en el fic!ero del $uin. y se lan-a tecleando su camino completo junto con sus opciones y parmetros# ,simismo. como veremos en el Cap0tulo 2. si el pro$rama se encuentra en un directorio incluido en la variable de entorno PATH. slo se necesita teclear el nombre. sin necesidad de especificar el camino# 2

El proceso completo de edicin y ejecucin de un $uin es el si$uiente:


vi prueba.s c mod u+# prueba.s ./prueba.s prueba.s ! ! ! ! o cual"uier otro editor de te#tos activa el permiso de e$ecuci%n e$ecuta el gui%n si est& en un directorio de '()*+

E4iste una manera especial para ejecutar un $uin. precedi7ndolo por el si$no punto. =ue se utili-a para e4portar todas las variables del pro$rama al entorno de ejecucin del usuario para ms informacin sobre las variables de entorno revisar el Cap0tulo 2&# El si$uiente ejemplo ilustra el modo de ejecutar
apac ectl start . miprofile source miprofile ! E$ecuci%n normal de un gui%n. ! E$ecuci%n e#portando las variables. ! E"uivalente a la l,nea anterior.

Un :script; puede @y debe@ comen-ar con la marca #! para especificar el camino completo y los parmetros del int7rprete de mandatos =ue ejecutar el pro$rama# Esta marca puede usarse para ejecutar cual=uier int7rprete instalado en la m=uina 9,S?. 9S?. +E31. ,AB. etc#&# El si$uiente cuadro muestra un pe=ueo ejemplo de $uin 9,S?#
!!/bin/bas
! e$emplo-. informe de la capacidad de la cuenta ec o /0suario. '01E2/ ec o /3apacidad de la cuenta./ du s '+45E ! suma total del directorio del usuario

1.3. Recomendaciones de programacin.


Como cual=uier otro pro$rama. un $uin 9,S? puede re=uerir un cierto mantenimiento. =ue incluya modificaciones. actuali-aciones o mejoras del cdi$o# +or lo tanto. el pro$ramador debe ser precavido y desarrollarlo teniendo en cuenta las recomendaciones de desarrollo t0picas para cual=uier pro$rama# Una prctica ordenada permite una verificacin y comprensin ms cmoda y rpida. para reali-ar las modificaciones de forma ms se$ura y ayudar al usuario a ejecutar el pro$rama correctamente# +are ello. se$uir las si$uientes recomendaciones# El cdi$o debe ser fcilmente le$ible. incluyendo espacios y san$r0as =ue separen claramente los blo=ues de cdi$o 8eben aadirse comentarios claros sobre el funcionamiento $eneral del pro$rama principal y de las funciones. =ue conten$an: autor. descripcin. modo de uso del pro$rama. versin y fec!as de modificaciones#

<ncluir comentarios para los blo=ues o mandatos importantes. =ue re=uieran cierta aclaracin# ,$re$ar comentarios y ayudas sobre la ejecucin del pro$rama# 8epurar el cdi$o para evitar errores. procesando correctamente los parmetros de ejecucin# Co desarrollar un cdi$o e4cesivamente enrevesado. ni complicado de leer. aun=ue 7sto !a$a a!orrar l0neas de pro$rama# Utili-ar funciones y las estructuras de pro$ramacin adecuadas para evitar repetir cdi$o reiterativo# ms

1os nombres de variables. funciones y pro$ramas deben ser descriptivos. pero sin confundirse con otros de ellos. ni con los mandatos internos o e4ternosD no deben ser ni muy lar$os ni muy cortos# >odos los nombres de funciones y de pro$ramas suelen escribirse en letras minEsculas. mientras =ue las variables acostumbran a definirse en mayEsculas#

.& E2p"%si*%es&

Como se !a observando en el seminario anterior. la l0nea de comandos se divide en una serie de elementos =ue representan cierto si$nificado en la semntica del int7rprete# 1a expansin es un procedimiento especial =ue se reali-a sobre dic!os elementos individuales# 9,S? dispone de / topos de e4pansiones. =ue se$En su orden de procesado son F2G: Expansin de arbitrarias# a%es: modifica la e4presin para crear cadenas

Expansin de ti de: reali-a sustituciones de directorios# Expansin de par&metro ' %aria( e: tratamiento $eneral de variables y parmetros. incluyendo la sustitucin de prefijos. sufijos. valores por defecto y otros operaciones con cadenas# )ustitucin de mandato: procesa el mandato y devuelve su salida normal# Expansin num7rico# aritm*tica: sustituye la e4presin por su valor

)ustitucin de proceso: comunicacin de procesos mediante tuber0as con nombre de tipo cola H<HI&# +i%isin en pa a(ras: separa la l0nea de mandatos resultante en palabras usando los caracteres de divisin incluidos en la variable IFS# Expansin de #ic,ero: permite buscar patrones con comodines en los nombres de fic!eros#

El resto del cap0tulo describe cada uno de los tipos de e4pansiones#

2.1. Expansin de llaves.


1a e4pansin de llaves es el preprocesado de la l0nea de comandos =ue se ejecuta en primer lu$ar y se procesan de i-=uierda a derec!a# Se utili-a para $enerar cadenas arbitrarias de nombre de fic!eros. los cuales pueden o no e4istir. por lo tanto puede modificarse el nEmero de palabras =ue se obtienen tras ejecutar la e4pansin# El formato $eneral es el si$uiente:

3*r#" *
[Pre]{C1,C2[,...]}[Suf]

Descripci$% El resultado es una lista de palabras donde se le aade a cada una de las cadenas de las llaves y separadas por comas un prefijo y un sufijo opcionales.

+ara ilustrarlo. v7anse los si$uientes ejemplos#


ec o a6b7c7d8e m9dir '+45E/6bin7lib7doc8 ! abe ace ade ! 1e crean los directorios. ! '+45E/bin7 '+45E/lib y '+45E/doc.

E4ercici* .&/5 interpretar la si$uiente orden#


m9dir '6+45E8/6bin7lib7doc8

2.2. Expansin de tilde.


Este tipo de e4pansin obtiene el valor de un directorio. tanto de las cuentas de usuarios. como de la pila de directorios accedidos# 1os formatos vlidos de la e4pansin de tilde son: 3*r#" *
~[Usuario]

Descripci$% Directorio personal del usuario indicado. Si no se expresa nada $HOME. Directorio actual ($PWD). Directorio anterior ($OLDPWD).

~+ ~-

J7ase este pe=ueo pro$rama:


!!/bin/bas ! capacidad muestra la capacidad en :; de la cuenta del ! usuario indicado ! 0so. capacidad usuario ec o /0suario. '-/ ls ld <'du s <'-

Es recomendable definir un alias en el perfil de entrada del usuario para cambiar al directorio anterior. ya =ue la sinta4is del comando es al$o en$orrosa# +ara ello. aadir la si$uiente l0nea al fic!ero de confi$uracin ~/.bash !#
alias cda=>cd <->

2.3. Expansin de par metro o de varia!le.


+ermite la sustitucin del contenido de la variable si$uiendo una amplia variedad de re$las# 1os distintos formatos para la e4pansin de parmetros son F'G: 3*r#" *
${!Var}

Descripci$% Se hace referencia a otra variable y se obtiene su valor (e2p"%si$% i%)irec "). Se devuelve el parmetro si !ste es nulo" se obtiene el 0"l*r p*r )e6ec *. Si el parmetro es nulo se le "si+%" el 0"l*r p*r )e6ec * y se expande. Se obtiene el parmetro si es nulo se manda un #e%s"4e )e err*r. Se devuelve el 0"l*r "l er%" i0* si el parmetro no es nulo. V"l*r )e s-(c")e%" del parmetro" desde el punto inicial hasta el final o hasta la lon#itud indicada. Devuelve los nombres de variables $ue empie%an por el prefijo. El "#"7* en caracteres del parmetro o en elementos de una matri%. Se elimina del valor del parmetro la m&nima (o la mxima) comparaci'n del patr'n" comen%ando por el principio del parmetro. Se elimina del valor del parmetro la m&nima (o la mxima) comparaci'n del patr'n" buscando por el final del parmetro. En el valor del parmetro se reempla%a por la cadena indicada la primera comparaci'n del patr'n (o todas las comparaciones).

${Parm"-Val}

${Parm"#Val}

${Parm"$Cad}

${Parm"+Val}

${Parm"Inic} ${Parm"Inic"Long} ${!Pref%}

${#Parm} ${#Matriz&%'} ${Parm#Patrn} ${Parm##Patrn}

${Parm(Patrn} ${Parm((Patrn}

${Parm/Patrn/Cad} ${Parm//Patrn/Cad}

9,S? proporciona unas potentes !erramientas para el tratamiento de cadenas. sin embar$o la sinta4is puede resultar en$orrosa y re=uiere de e4periencia para depurar el cdi$o# +or lo tanto. se recomienda crear

$uiones =ue resulten fciles de comprender. documentando claramente las rdenes ms complejas# Unos ejemplos para estudiar:
! 1i el -er par&metro es nulo7 asigna el usuario "ue lo e$ecuta. 010)2?4='6-.-@A oami@8 ! 1i no est& definida la variable 34B05C17 el anc o es de DE. )C3+4='634B05C1.-DE8 ! 1i no e#iste el -er par&metro7 pone mensa$e de error y sale. . '6-.F/Error. 'E fic ero/ ! 4btiene la e#tensi%n de un fic ero G"uita EI*='6J?3+E24!!*.8 asta el puntoH.

! Kuita la e#tensi%n LrpmM al camino del fic ero. 2(5='6J?3+2(5N.rpm8 ! 3uenta el nO de caracteres de la variable 3B)PE. 3)2)3*E2E1='6!3B)PE8 ! 2enombra el fic ero de enero a Jebrero. C0EP4='6)C*?Q04/enero/febrero8 ! )Rade nuevo elemento a la matriS GmatriS[tamaRo]=elementoH. matriS['6!matriS[*]8]=/nuevo/

E4ercici* .&.5 interpretar los si$uientes mandatos#


T)*41=/ls ld '-/ *?(4='6T)*41.-8 (E25='6T)*41.2.U8 if [ '6!4(3?4CE18 -gt - ]V t en ... f=/'f'6-N'e8/

2.". Sustitucin de mandato.


Esta e4pansin sustituye el mandato ejecutado @incluyendo sus parmetros@ por su salida normal. ofreciendo una $ran potencia y fle4ibilidad de ejecucin a un :s!ellscrpit;# 1os formatos vlido son: 3*r#" *
$)Mandato* +Mandato+

Descripci$% Sustituci'n literal del mandato y sus parmetros. Sustituci'n de mandatos permitiendo caracteres de escape.

Cuando la sustitucin de mandatos va en una cadena entre comillas dobles se evita =ue posteriormente se ejecute una e4pansin de fic!eros#

'0

El si$uiente pro$rama lista informacin sobre un usuario#


!!/bin/bas ! infous lista informaci%n de un usuario. ! 0so. infous usuario *E5(42)B=@grep /W'-./ /etc/passAd 2X/dev/null@ 010)2?4=@ec o '*E5(42)B Y cut -f- -d.@ ec o /Combre de usuario. '010)2?4/ ec o -n /?dentifidor G0?TH. / ec o '*E5(42)B Y cut -fZ -d. ec o -n /Combre del grupo primario. / Q?T=@ec o '*E5(42)B Y cut -f[ -d.@ grep /.'Q?T./ /etc/group Y cut -f- -d. ec o /Tirectorio personal. / ls -ld @ec o '*E5(42)B Y cut -f\ -d.@

E4ercici* .&35 interpretar la salida de la si$uiente orden:


ec o /'Gbasename 'EH. ]/'01E2]/ sin permiso de e$ecuci%n./ X^2

2.#. Expansin aritm$tica.


1a e4pansin aritm7tica calcula el valor de la e4presin indicada y la sustituye por el resultado de la operacin# El formato de esta e4pansin es: 3*r#" *
$))Expresin** $&Expresin'

Descripci$% Sustituye la expresi'n por su resultado.

J7ase el si$uiente ejemplo:


! 3uenta el nO de espacios para centrar una cadena ! espacios = G anc o_pantalla longitud GcadenaH H / 2. E1()3?41='GG G)C3+4-'6!3)TEC)8H/2 HH

E4ercici* .&85 interpretar la si$uiente l0nea. al$o dif0cil de leer#


if [ '6!cad8 -lt '['6!-8--] ]V t en ...

2.%. Sustitucin de proceso.


1a sustitucin de proceso permite utili-ar un fic!ero especial de tipo cola para intercambiar informacin entre 2 procesos. uno =ue escribe en la cola y el otro =ue lee de ella en orden el primero en lle$ar es el primero en salir&# 1os formatos vlidos para esta e4pansin son: ''

3*r#" *
ic! ,)Lista* "escr,)Lista* ic! -)Lista* "escr-)Lista*

Descripci$% (a lista de 'rdenes escribe en el fichero para $ue !ste pueda ser le&do por otro proceso. )uando otro proceso escribe en el fichero" el contenido de !ste se pasa como parmetro de entrada a la lista de 'rdenes.

E4ercici* .&55 interpretar la si$uiente l0nea#


comm `Gsort enero.datH `Gsort febrero.datH

2.&. 'ivisin en pala!ras.


Una ve- =ue se !ayan reali-ado las e4pansiones previas. el int7rprete divide la l0nea de entrada en palabras. utili-ando como separadores los caracteres especificados en la variable de entorno IFS# +ara evitar problemas de se$uridad $enerados por un posible :Caballo de >roya;. el administrador debe declarar esta variable como de slo lectura y establecer unos valores fijos para los separadores de palabraD =ue por defecto 7stos son espacio. tabulador y salto de l0nea# Una secuencia de varios separadores se considera como un Enico delimitador# +or ejemplo. si se ejecuta el si$uiente mandato:
du s '+45E

el int7rprete reali-a las sustituciones y @antes de ejecutar la orden@ divide la l0nea en las si$uientes palabras#
LduM L- sM L/ ome/ramonM

2.(. Expansin de )ichero.


Si al$unas de las palabras obtenidas tras la divisin anterior contiene al$En caracteres especial conocido como comodn %. $ o &&. 7sta se trata como un patrn =ue se sustituye por la lista de nombres de fic!eros =ue cumplen dic!o patrn. ordena da alfab7ticamente F2G# El resto de caracteres del patrn se tratan normalmente# 1os patrones vlidos son:

'2

3*r#" *
%

Descripci$% E$uivale a cual$uier cadena de caracteres" incluida una cadena nula. E$uivale a cual$uier carcter *nico. E$uivale a cual$uier carcter $ue apare%ca en la lista. +ueden incluirse ran#os de caracteres separados por #ui'n (-). Si el primer carcter de la lista es ." se comparan los caracteres $ue no formen parte de ella.

$ &Lista'

1a si$uiente tabla describe al$unos ejemplos#


! Bistar los fic /s %. 01 ! Bistar los fic ! e#tensi%n /s &a-2'%. 01 ! Bistar los fic /s .&b34'% ! Bistar los fic /s %.$$ eros terminados en .rpm eros "ue empiecen por letra minascula y tengan .rpm eros "ue empieSan por L.bM7 L.#M y L.IM eros cuya e#tensi%n tenga 2 caracteres

E4ercici* .&65 evaluar la si$uiente orden#


cd /var/logV tar cvf copialog.tar syslog.[E-U] messages.[E-U]

')

3& Pr*+r"#"ci$% es r-c -r")"&


1as estructuras de pro$ramacin se utili-an para $enerar un cdi$o ms le$ible y fiable# Son vlidas para en$lobar blo=ues de cdi$o =ue cumplen un cometido comEn. para reali-ar comparaciones. selecciones. bucles repetitivos y llamadas a subpro$ramas#

3.1. Listas de mandatos.


1os mandatos 9,S? pueden a$ruparse en blo=ues de cdi$o =ue mantienen un mismo mbito de ejecucin# 1a si$uiente tabla describe brevemente los aspectos fundamentales de cada lista de rdenes# Lis " )e $r)e%es
Mandato 5

Descripci$% Ejecuta el mandato en ,- plano. El proceso tendr menor prioridad y no debe ser interactivo.. .uber&a. /ediri#e la salida de la primera orden a la entrada de la se#undo. )ada mandato es un proceso separado. Ejecuta varios mandatos en la misma l&nea de c'di#o. Ejecuta la ,0 orden si la 10 lo hace con !xito (su estado de salida es 2). Ejecuta la ,0 orden si falla la ejecuci'n de la anterior (su c'di#o de salida no es 2). Ejecuta la lista de 'rdenes en un subproceso con un entorno com*n. 3lo$ue de c'di#o ejecutado en el propio int!rprete. +osibilita escribir listas de 'rdenes en ms de una l&nea de pantalla. Se utili%a para ejecutar mandatos lar#os.

Man1 6 Man2

Man1; Man2 Man1 55 Man2

Man1 66 Man2

)Lista*

{ Lista; } L#nea1 \ L$nea2

Ka se !a comentado previamente la sinta4is de al$unas de estas combinaciones de mandatos# Sin embar$o. el si$uiente ep0$rafe presta atencin especial a las listas de rdenes condicionales#

'2

3&/&/& Lis "s c*%)ici*%"les&


1os mandatos condiciona es son a=uellos =ue se ejecutan si una determinada orden se reali-a correctamente @lista K 55&@ o si se produce al$En error @lista I 66&@# , continuacin se comentan al$unos ejemplos ms sacados del fic!ero de confi$uracin /etc/rc.d/rc.sysinit #
! 1i se e$ecuta correctamente Lconver"uotaM7 se e$ecuta LrmM. /sb78/!98:; <=>9<a -> / 55 1 -? /=>9<a.>s; ! ! 1i da error la e$ecuci%n de LgrepM7 se e$ecuta LmodprobeM. @ ;0 Ah7BA /0 9!/b>s/>sb/B 7:; s 66 19B0 9b; h7B C- /B;:/8>//

E4ercici* 3&/5 interpreta la si$uiente lista de rdenes#


load9eys ':Eb5)( ` /dev/ttyE X /dev/ttyE 2X/dev/null ^^ ] success /Boading def 9eymap/ YY failure /Boading def 9eymap/

3.2. Estructuras condicionales y selectivas.


,mbas estructuras de pro$ramacin se utili-an para esco$er un blo=ue de cdi$o =ue debe ser ejecutado tras evaluar una determinada condicin# En la estructura condicional se opta entre 2 posibilidades. mientras =ue en la selectiva pueden e4istir un nEmero variable de opciones#

3&.&/& Es r-c -r"s c*%)ici*%"les&


1a estructura condiciona sirve para comprobar si se ejecuta un blo=ue de cdi$o cuando se cumple una cierta condicin# +ueden anidarse varias estructuras dentro del mismo blo=ues de cdi$o. pero siempre e4iste una Enica palabra ?7 para cada blo=ue condicional# 1a tabla muestra cmo se representan ambas estructuras en 9,S?# Es r-c -r" )e pr*+r"#"ci$%
7? Expresin; <h;8 %lo&ueV fi

Descripci$% Es r-c -r" c*%)ici*%"l si#ple4 se ejecuta la lista de 'rdenes si se cumple la expresi'n. En caso contrario" este c'di#o se i#nora.

'%

7? Expresin1; <h;8 D/9=>;E; [ ;/7? Expresin2; <h;8 %lo&ue2; ... ] [;/s; %lo&ue'; ] ?7

Es r-c -r" c*%)ici*%"l c*#ple4"4 el formato completo condicional permite anidar varias 'rdenes" adems de poder ejecutar distintos blo$ues de c'di#o" tanto si la condici'n de la expresi'n es cierta" como si es falsa.

,un=ue el formato de codificacin permite incluir toda la estructura en una l0nea. cuando 7sta es compleja se debe escribir en varias. para mejorar la comprensin del pro$rama# En caso de teclear la orden compleja en una sola l0nea debe tenerse en cuenta =ue el carcter separador ;& debe colocarse antes de las palabras reservadas: <h;8. ;/s;. ;/7? y ?7# ?ay =ue resaltar la versatilidad para teclear el cdi$o de la estructura condicional. ya =ue la palabra reservada <h;8 puede ir en la misma l0nea =ue la palabra 7?. en la l0nea si$uiente sola o conjuntamente con la primera orden del blo=ue de cdi$o. lo =ue puede aplicarse tambi7n a la palabra ;/s;&# +uede utili-arse cual=uier e4presin condicional para evaluar la situacin. incluyendo el cdi$o de salida de un mandato o una condicin evaluada por la orden interna test# Este Eltimo caso se e4presa colocando la condicin entre corc!etes formato: & Condicin 'H# J7anse al$unos sencillos ejemplos de la estructura condicional simple e4tra0dos del :script; /etc/rc.d/rc.sysinit # Ctese la diferencia en las condiciones sobre la salida normal de una orden @e4presada mediante una sustitucin de mandatos@ y a=uellas referidas al estado de ejecucin de un comando si la orden se !a ejecutado correctamente o si se !a producido un error&#
! Ba condici%n m&s simple escrita en una l,nea. ! si 2E10B*XEV entonces rc=7? & $FESGLT -@< H '; <h;8 !#E; ?7 ! ! Ba condici%n doble. ! si la variable +41*C)5E es nula o vale LGnoneHMV entonces ... 7? & -2 I$HOSTJAMEI -9 I$HOSTJAMEI # I)898;*I '; <h;8 HOSTJAME#/9!a/h9s< ?7 ! ! 3ombinaci%n de los 2 tipos de condiciones. ! si e#iste el fic ero /fastboot o la cadena LfastbootM est& ! en el fic ero /proc/cmdlineV entonces ... 7? & -? /?as<b99< ' 66 @ ;0 -7= I?as<b99<I /0 9!/!1B/78; \ C-/B;:/8>//; <h;8 ?as<b99<#K;s ?7

Ibs7rvese los ejemplos para las estructuras condicionales complejas. basados tambi7n en el pro$rama de confi$uracin /etc/rc.d/rc.sysinit #

'6

! Estructura condicional comple$a con 2 blo"ues. ! si e#iste el fic ero especificado7 se e$ecutaV si no7 se da ! el valor LnoM a la variable CE*c42:?CQ 7? & -? /;<!/sKs!98?7@/8;<L9 M '; <h;8 . /;<!/sKs!98?7@/8;<L9 M ;/s; JETWOFNIJO#89 ?7 ! Estructura anidada. ! si rc=EV entonces ...V si no7 si rc=-V entonces ...V en caso ! contrarioV no se ace nada. 7? & I$ !I # IHI '; <h;8 s>!!;ss I$STFIJOI ;!h9 ;/7? & I$ !I # IEI '; <h;8 0ass;B I$STFIJOI ;!h9 ?7

E4ercici* 3&.5 describir el comportamiento de la si$uiente estructura#


if [ -f /etc/sysconfig/console/default.9map ]V t en :Eb5)(=/etc/sysconfig/console/default.9map else if [ -f /etc/sysconfig/9eyboard ]V t en . /etc/sysconfig/9eyboard fi if [ -n /':Eb*);BE/ -a -d //usr/lib/9bd/9eymaps/ -o -d //lib/9bd/9eymaps/ ]V t en :Eb5)(=':Eb*);BE fi fi

3&.&.& Es r-c -r" selec i0"&


1a estructura se ecti%a evalEa la condicin de control y. dependiendo del resultado. ejecuta un blo=ue de cdi$o determinado# 1a si$uiente tabla muestra el formato $en7rico de esta estructura# Es r-c -r" )e pr*+r"#"ci$%
!as; Varia(le 78 [)]Patrn1* %lo&ue1 ;; ... ;sa!

Descripci$% Es r-c -r" selec i0" #9l iple4 si la variable cumple un determinado patr'n" se ejecuta el blo$ue de c'di#o correspondiente. )ada blo$ue de c'di#o acaba con 5;;6. (a comprobaci'n de patrones se reali%a en secuencia.

1as posibles opciones soportadas por la estructura selectiva mEltiple se e4presan mediante patrones. donde puede aparecer caracteres comodines. evalundose como una e4pansin de fic!eros. por lo tanto el patrn para representar la opcin por defecto es el asterisco %&# 8entro

'5

de una misma opcin pueden aparecer varios patrones separados por la barra vertical 6&. como en una e4presin l$ica I# Si la e4presin =ue a comprobar cumple varios patrones de la lista. slo se ejecuta el blo=ue de cdi$o correspondiente al primero de ellos. ya =ue la evaluacin de la estructura se reali-a en secuencia# Ibs7rvese el si$uientes ejemplos:
! 1egan el valor de la variable 0*3. ! - si es LyesM o LtrueM7 ... ! - si es LnoM o LfalseM7 ... !as; I$GTPI 78 K;s6< >;* PLOPNFLAOS#I$PLOPNFLAOS --><!I; PLOPNDEF#I$PLOPNDEF )><!*I; ;; 896?a/s;* PLOPNFLAOS#I$PLOPNFLAOS --/9!a/<71;I; PLOPNDEF#I$PLOPNDEF )/9!a/<71;*I; ;; ;sa!

E4ercici* 3&35 describir el modo de ejecucin de la si$uiente estructura selectiva#


case /'14/ in )?IH ec o n /'01. / lsuser -ca e#pires '01Yfgrep -v /!/Ycut -f2 -d.@/ VV 1un41H ec o /'01. @logins -aol '01Ycut -fd -d.@/ VV Binu#H ec o /'01. @c age -l '01Ygrep )ccountYcut -f2 -d.@/ VV *H ec o /1istema operativo desconocido/ VV esac

3.3. *ucles.
1os bucles son estructuras reiterativas =ue se ejecutan repetitivamente. para no tener =ue teclear varias veces un mismo blo=ue de cdi$o# Un bucle debe tener siempre una condicin de salida para evitar errores provocados por bucles infinitos# 1a si$uiente tabla describe las 2 rdenes especiales =ue pueden utili-arse para romper el modo de operacin t0pico de un bucle# Or)e%
b ;aM

Descripci$% R-p -r" i%#e)i" " )e -% (-cle (debe evitarse en pro#ramaci'n estructurada para impedir errores de lectura del c'di#o).

'/

!98<78>;

S"l * " l" c*%)ici$% )el (-cle (debe evitarse en pro#ramaci'n estructurada para impedir errores de lectura del c'di#o).

1os si$uientes puntos describen los distintos bucles =ue pueden usarse tanto en un $uin como en la l0nea de mandatos de 9,S?#

3&3&/& :-cles +e%;ric*s&


1os bucles $en7ricos de tipos :para cada; ejecutan el blo=ue de cdi$o para cada valor asi$nado a la variable usada como 0ndice del bucle o a su e4presin de control# Cada iteracin debe reali-ar una serie de operaciones donde dic!o 0ndice var0e. !asta la lle$ar a la condicin de salida# El tipo de bucle ?9 ms utili-ado es a=u7l =ue reali-a una iteracin por cada palabra o cadena& de una lista# Si se omite dic!a lista de valores. se reali-a una iteracin por cada parmetro posicional# +or otra parte. 9,S? soporta otro tipo de bucle iterativo $en7rico similar al usado en el len$uaje de pro$ramacin C. usando e4presiones aritm7ticas# El modo de operacin es el si$uiente: Se evalEa la primera e4presin aritm7tica antes de ejecutar el bucle para dar un valor inicial al 0ndice# Se reali-a una comprobacin de la se$unda e4presin aritm7tica. si 7sta es falsa se ejecutan las iteraciones del bucle# Siempre debe e4istir una condicin de salida para evitar =ue el bucle sea infinito# como Eltima instruccin del blo=ue se ejecuta la tercera e4presin aritm7tica @=ue debe modificar el valor del 0ndice@ y se vuelve al paso anterior#

1a si$uiente tabla describe los formatos de los bucles iterativos $en7ricos de tipo :para cada;& interpretados por 9,S?# :-cle
?9 Var [78 Lista]; B9 %lo&ue B98; F9 B98; ))Exp1;)Exp2;)Exp***

Descripci$% :-cle i er" i0*4 se ejecuta el blo$ue de mandatos del bucle sustituyendo la variable de evaluaci'n por cada una de las palabras incluidas en la lista. :-cle i er" i0* )e es il* C4 se eval*a) Exp1" mientras) Exp2 )sea cierta se ejecutan en cada iteraci'n del bucle el blo$ue de mandatos y) Exp*) (las 7 expresiones deben ser aritm!ticas).

B9 %lo&ue

'6

J7ase al$unos ejemplos:


! 1e asigna a la variable LlibraryM el camino de cada uno de ! los arc ivos indicados en la e#pansi%n de fic eros y se ! realiSan las operaciones indicadas en el blo"ue de c%digo. ?9 /7b a K 78 //7b/M; 8;//$)>8a1; - *//7b ;Bha<-M; 8;/.s9% ; B9 /8 -s -? $/7b a K //7b/ /B!98?7@ -8 //7b/ B98; ... ! 1e establece un contador de asta 2E iteraciones para ! e$ecutar el bucle. ?9 )) <71;s # E; <71;s , CH; <71;s++ **; B9 />s /sb78/ 0!78?9 -0 6 @ ;0 K0b78B - /B;:/8>// C-5E 55 \ K0Lh7!h - /B;:/8>// C-5E B98;

E4ercici* 3&85 evaluar el si$uiente bucle:


for 01 in @cut -f2 -d. / ome/cdc/*.lista@V do grep /W'01./ /etc/s adoA Y cut -f--2 -d. XX'J?3+*E5( done

<&3&.& :-cles c*%)ici*%"les =#ie% r"s> ? =h"s ">&


1os bucles condicionales evalEan la e4presin en cada iteracin del bucle y dependiendo del resultado se vuelve a reali-ar otra iteracin o se sale a la instruccin si$uiente# 1a si$uiente tabla describe los formatos para los 2 tipos de bucles condicionales soportados por el int7rprete 9,S?# :-cle
Lh7/; Expresin; B9 %lo&ue B98;

Descripci$% :-cle i er" i0* =#ie% r"s>4 se ejecuta el blo$ue de 'rdenes mientras $ue la condici'n sea cierta. (a expresi'n de evaluaci'n debe ser modificada en al#*n momento del bucle para poder salir. :-cle i er" i0* =h"s ">4 se ejecuta el blo$ue de c'di#o hasta $ue la condici'n sea cierta. (a expresi'n de evaluaci'n debe ser modificada en al#*n momento del bucle para poder salir.

>8<7/ Expresin; B9 %lo&ue B98;

,mbos bucles reali-an comparaciones inversas y pueden usarse indistintamente. aun=ue se recomienda usar a=u7l =ue necesite una

20

condicin ms sencilla o le$ible. intentando no crear e4presiones ne$ativas# J7ase el si$uiente ejemplo:
! 5ientras aya par&metros "ue procesar7 ... Lh7/; & $# !# H ' ; B9 0 9!;ssB7 I$EI sh7?< B98;

E4ercici* 3&55 convertir este bucle Lh7/; en un bucle >8<7/ y en uno ?9 de estilo C#
i=e A ile [ 'i -ge E ] V do if [ -f /var/log/9syms.'i ] V t en mv /var/log/9syms.'i /var/log/9syms.'GG'i+-HH fi i='GG'i--HH done

3&3&3& :-cle )e selecci$% i% er"c i0"&


1a estructura s;/;!< no es propiamente dic!o un bucle de pro$ramacin estructurada. ya =ue se utili-a para mostrar un menE de seleccin de opciones y ejecutar el blo=ue de cdi$o correspondiente a la seleccin esco$ida# En caso de omitir la lista de palabras. el sistema presenta los parmetros posicionales del pro$rama o funcin# Este tipo de bucles no suele utili-arse# 1a si$uiente tabla describe el formato del bucle interactivo# :-cle
s;/;!< Var [78 Lista]; B9 %lo&ue1 ... B98;

Descripci$% :-cle )e selecci$% i% er"c i0"4 se presenta un men* de selecci'n y se ejecuta el blo$ue de c'di#o correspondiente a la opci'n ele#ida. El bucle se termina cuando se ejecuta una orden b ;aM. (a variable PSQ se usa como punto indicativo.

2'

8& 3-%ci*%es&
Una funcin en 9,S? es una porcin de cdi$o declarada al principio del pro$rama. =ue puede reco$er parmetro de entrada y =ue puede ser llamada desde cual=uier punto del pro$rama principal o desde otra funcin. tantas veces como sea necesario# El uso de funciones permite crear un cdi$o ms comprensible y =ue puede ser depurado ms fcilmente. ya =ue evita posibles errores tipo$rficos y repeticiones innecesarias# 1os parmetros recibidos por la funcin se tratan dentro de ella del mismo modo =ue los del pro$rama principal. o sea los parmetros posicionales de la funcin se corresponden con las variables internas 'H. $E. etc# El si$uiente cuadro muestra los formatos de declaracin y de llamada de una funcin# Decl"r"ci$%
[?>8!<798] 'om(re uncin )* { %lo&ue ... [ } ;<> 8 [Valor] ] ...

LL"#")"
'om(re uncin)[Parmetro1)...]

1a funcin ejecuta el blo=ue de cdi$o encerrado entre sus llaves y @al i$ual =ue un pro$rama@ devuelve un valor num7rico# En cual=uier punto del cdi$o de la funcin. y normalmente al final. puede usarse la clusula ;<> 8 para terminar la ejecucin y opcionalmente indicar un cdi$o de salida# 1as variables declaradas con la clusula /9!a/ tienen un mbito de operacin interno a la funcin# El resto de variables pueden utili-arse en cual=uier punto de todo el pro$rama# Esta caracter0stica permite crear funciones recursivas sin =ue los valores de las variables de una llamada interfieran en los de las dems# En el ejemplo del si$uiente cuadro se define una funcin de nombre salida. =ue recibe ) parmetros# El principio del cdi$o es la definicin de la funcin la palabra ?>8!<798 es opcional& y 7sta no se ejecuta !asta =ue no se llama desde el pro$rama principal# ,simismo. la variable *5(Q2E( se declara en el pro$rama principal y se utili-a en la funcin manteniendo su valor correcto#

22

!/bin/bas ! comprus - comprueba la e#istencia de usuarios en listas y en ! el arc ivo de claves Gnormal y C?1H. ! 0so. comprus F Y cadena ! F. ayuda. ! 2am%n Q%meS - 1eptiembre -.UUD. ! 2utina de impresi%n. ! (ar&metros. ! - - te#to de cabecera. ! 2 - cadena a buscar. ! Z - arc ivo de bas"ueda. salida GH 6 if egrep /'2/ 'Z X'*5(Q2E( 2X/dev/nullV t en ec o / '-./ cat '*5(Q2E( fi 8 !! (24Q2)5) (2?C3?()B !! (24Q='Gbasename 'EH *5(Q2E(=/tmp/grep'' T?2B?1*)1=/ ome/cdc/listas if [ /#'*/ = /#F/ ] t en ec o / 0so. '(24Q F Y cadena (rop%sito. '(24Q. ;as"ueda de usuarios. cadena. e#presi%n regular a buscar. / e#it E fi if [ '! -ne - ]V t en ec o /'(24Q. (ar&metro incorrecto. 0so. '(24QH F Y cadena F. ayuda/ X^2 e#it fi ec o for i in 'T?2B?1*)1/*.listaV do salida /'-/ /'Gbasename 'i Y sed >s/.lista//>H/ /'i/ done salida /'-/ /passAd/ //etc/passAd/ [ -e /'*5(Q2E(/ ] ^^ rm -f '*5(Q2E(

E4ercici* 8&/5 desarrollar en 9,S? una funcin =ue reciba un Enico parmetro. una cadena de caracteres. y muestre el Eltimo carcter de dic!a cadena# 8ebe tenerse en cuenta =ue el primer carcter de una cadena tiene como 0ndice el valor 0# E4ercici* 8&.5 pro$ramar una funcin 9,S? =ue reciba una cadena de caracteres y =ue la imprima centrada en la pantalla# >ener en cuenta =ue 2)

el anc!o del terminal puede estar definido en la variable de entorno 34B05C1. en caso contrario usar un valor por defecto de /0 columnas#

22

5& C"r"c er@s ic"s especi"les&


En Eltima instancia se van a describir al$unas de las caracter0sticas especiales =ue el int7rprete 9,S? aade a su len$uaje para mejorar la funcionalidad de su propia interfa- y de los pro$ramas =ue interpreta# Se$uidamente se enumeran al$unas de las caracter0sticas especiales de 9,S? y en el resto de puntos de este cap0tulo se tratan en mayor profundidad las =ue resultan ms interesantes: +osibilidad de llamar al int7rprete 9,S? con una serie de opciones =ue modifican su comportamiento normal# Landatos para creacin de pro$ramas interactivos# Control de trabajos y $estin de seales# Lanipulacin y personali-acin del punto indicativo# Soporte de alias de comandos# Mestin del !istrico de rdenes ejecutadas# Edicin de la l0nea de mandatos# Lanipulacin de la pila de Eltimos directorios visitados# <nt7rprete de uso restrin$ido. con caracter0sticas limitadas# +osibilidad de trabajar en modo compatible con la norma +IS<N '00)#2 F2G#

#.1. +rogramas interactivos.


9,S? proporciona un nivel bsico para pro$ramar :s!ellscripts; interactivos. soportando instrucciones para solicitar y mostrar informacin al usuario# 1as rdenes internas para dialo$ar con el usuario se describen en la si$uiente tabla#

2%

M"%)" *
;aB [-0 +Cadena+] [Var1 ...]

Descripci$% Asi+%" l" e% r")" " 0"ri"(les4 lee de la entrada estndar y asi#na los valoras a las variables indicadas en la orden. +uede mostrarse un mensaje antes de solicitar los datos. Si no se especifica nin#una variable" FEPLR contiene la l&nea de entrada.

;!h9 [-8])Cadena

M-es r" -% #e%s"4e4 manda el valor de la cadena a la salida estndar con la opci'n n no se hace un salto de l&nea. M-es r" -% #e%s"4e 6*r#" e")*4 e$uivalente a la funci'n printf del len#uaje )" manda un mensaje formateado a la salida normal" permitiendo mostrar cadena y n*meros con una lon#itud determinada.

0 78<?

ormato)Parm1 ...

J7ase los si$uientes ejemplos#


! Bas siguientes instrucciones son e"uivalentes y muestran ! un mensa$e y piden un valor ;!h9 S8 ID71; <> 891b ;" I ;aB JOMDFE ! ;aB S0 ID71; <> 891b ;" I JOMDFE ... ! 5uestra los usuarios y nombres completos ! Gla modificaci%n de la variable ?J1 s%lo afecta al bucleH Lh7/; IFS#" ;aB >s>a 79 !/a:; >7B @7B 891b ; 7@89 a B9 0 78<? I(Ts )(s*\8I $>s>a 79 $891b ; B98; ,/;<!/0assLB

Como ejercicio se propone e4plicar paso a paso el funcionamiento del bucle anterior y los valores =ue se van asi$nando a las distintas variables en cada iteracin#

#.2. ,ontrol de tra!ajos.


1as rdenes para el control de trabajos permiten manipular los procesos ejecutados por el usuario o por un $uin 9,S?# El usuario puede manejar varios procesos y subprocesos simultneamente. ya =ue el sistema asocia un nEmero identificador Enico a cada uno de ellos#

26

1os procesos asociados a una tuber0a tienen identificadores +<8& propios. pero forman parte del mismo trabajo independiente# 1a si$uiente tabla describe las instrucciones asociadas con el tratamiento de trabajos# M"%)" *
Mandato)5

Descripci$% E4ec-ci$% e% .A pl"%*4 lan%a el proceso de forma desatendida" con menor prioridad y con la posibilidad de continuar su ejecuci'n tras la desconexi'n del usuario. Re *r%" " e4ec- "r e% .A pl"%*4 contin*a la ejecuci'n desatendida de un procesos suspendido. Re *r%" " e4ec- "r e% /er pl"%*4 vuelve a ejecutar el proceso asociado al trabajo indicado de forma interactiva. M-es r* l*s r"("4*s e% e4ec-ci$%" indicando el n- de trabajo y los +8D de sus procesos. M"%)" -%" se7"l " pr*ces*s * r"("4*s" para indicar una excepci'n o un error. +uede especificarse tanto el n- de seal como su nombre. P"r" l" e4ec-ci$% )el pr*ces*" hasta $ue se recibe una seal de continuaci'n. C"p -r" )e se7"l4 cuando se produce una determinada seal (interrupci'n) en el proceso" se ejecuta el mandato asociado. (as seales especiales EI?* y E22 se capturan respectivamente al finali%ar el 5script6 y cuando se produce un error en una orden simple. Esper" h"s " B-e er#i%e -% pr*ces* * r"("4*4 detiene la ejecuci'n del proceso hasta $ue el proceso hijo indicado hay finali%ado su ejecuci'n.

b@ (',-ra(a.o

?@ (',-ra(a.o

U9bs

M7// Se/al)PI"1Y(-ra(1 ...

s>s0;8B

< a0 [Comando] [Se/al1 ...]

La7< [PI"1Y(-ra(1]

3evisar los si$uientes ejemplos#

25

! 1e elimina el fic ero temporal si en el programa aparecen las Z seRales E GfinH7 -7 27 Z y -e. < a0 A 1 -? ${FIPHTEMP} ; ;37<A H E C Q EV ... ! 4rdena de forma independiente las listas de fic eros de ! usuarios7 espera a finaliSar ambos procesos y compara ! los resultados. )!a< a/>1HQ.sa/ 0 9?HQ.sa/ 0asHQ.sa/ 6 s9 < 6 >87= - >s>HQ* 5 )!a< a/>1HW.sa/ 0 9?HW.sa/ 0asHW.sa/ 6 s9 < 6 >87= - >s>HW* 5 La7< B7?? >s>HQ >s>HW

#.3. -nt$rprete de uso restringido.


Cuando el administrador del sistema asi$na al usuario un int7rprete de uso restrin$ido. 7ste Eltimo utili-a un entorno de operacin ms controlado y con al$unas caracter0sticas limitadas o eliminadas# E4isten ) formas de ejecutar 9,S? en modo restrin$ido:
rbas bas r bas --restricted

9,S? restrin$ido modifica las si$uientes caracter0sticas Co se puede usar la orden !B#

F2G

Co se pueden modificar las variables 1+EBB. ()*+. ECP ni ;)1+_ECP# Co se pueden ejecutar mandatos indicando su camino. slo se ejecutarn a=uellos =ue se encuentren en los directorios especificados por el administrador## Co se pueden especificar caminos de fic!eros como ar$umento del mandato :.;# Co se pueden aadir funciones nuevas en los fic!eros de inicio# Co se admiten redirecciones de salida# Co se puede reempla-ar el int7rprete 39,S? no se puede ejecutar la orden ;3;!&# Co se pueden aadir o =uitar mandatos internos# Co se puede modificar el modo de operacin restrin$ido#

2/

6& Re6ere%ci"s&
'# 9# Ho4. C# 3amey: :9,S? '&; p$inas de manuales de 9,S? v2#%b&;# 2#002# 2# C# 3amey. 9# Ho4: :9as! 3eference Lanual. v2#%b;# Hree SoftOare Houndation. 2#002# )# LiPe M. trad# M# 3odr0$ue- ,lboric!: :+ro$ramacin en 9,S? @ CILI de <ntroduccin;# 2#000# 2# L# Cooper: :,dvanced 9as!*Scriptin$ Muide. v2#';# 1inu4 8ocumentation +roject. 2#00)# %# 3# L# Mme- 1abrador: :,dministracin ,van-ada de Sistemas 1inu4 )( edicin&;# Secretariado de Hormacin del +,S Universidad de Sevilla&. 2#002# i# +royecto MCU#: !ttp:""OOO#$nu#or$" ii# >!e 1inu4 8ocumentation +roject >18+&: !ttp:""OOO#tldp#or$" iii# +royecto ?ispa1inu4 18+*ES&: !ttp:""OOO#!ispalinu4#es"

26

También podría gustarte