Вы находитесь на странице: 1из 30

CURSO 14146

SHELLSCRIPTS EN LINUX
Ramn M. Gmez Labrador
( ramonomez ARROBA !".e" #
O$%!bre de &.'14
Nota importante: El presente seminario se oferta dentro del plan de formacin para personal
informtico de la Universidad de Sevilla para el ao 2014 y toda su documentacin asociada
est bajo licencia reative ommons con reconocimiento
!"ttp:##creativecommons$or%#licenses#by#4$0#deed$es&$

Ediciones del curso:
1' edicin: urso 0()** +ro%ramacin ,van-ada en Shell. octubre 2$00($
2' edicin: urso 0*)0/ +ro%ramacin ,van-ada en Shell. abril 2$00*$
0a (' edicin del curso se dividi en 2 seminarios:
Seminario 0101( +ro%ramacin ,van-ada en Shell !l2nea de comandos&.
septiembre 2$001$
Seminario 010*( +ro%ramacin ,van-ada en Shell !shellscripts&. septiembre
2$001$
Esta 4' edicin es principalmente una actuali-acin del seminario dedicado a la l2nea
de comandos$
2
14146 S(e))"$r*+%" en L*n!,
-N.ICE
1. Introduccin...........................................................................................................................4
1$1$ aracter2sticas principales de 3,S4$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$4
1$2$ undo utili-ar el int5rprete de mandatos$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*
2. Redirecciones.........................................................................................................................6
2$1$ 6edireccin de entrada$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1
2$2$ 6edirecciones de salida$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1
2$($ ombinacin de redirecciones$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$7
2$4$ 6edireccin de entrada#salida$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$/
2$*$ 8ocumento interno$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$/
2$1$ 6edireccin de cadena$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$9
2$7$ :uber2as$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$9
3. Variables...............................................................................................................................11
($1$ :ipos de variables$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$11
($1$1$ ;ariables locales$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$11
($1$2$ ;ariables de entorno$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$12
($1$($ +armetros de posicin$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1(
($1$4$ ;ariables especiales$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$14
($2$ <atrices$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1*
($($ onfi%uracin del entorno$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$11
4. Expresiones..........................................................................................................................17
4$1$ E=presiones aritm5ticas$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$17
4$2$ E=presiones condicionales$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$19
4$2$1$ E=presiones de fic"eros$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$20
4$($2$ E=presiones comparativas num5ricas$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$21
4$($($ E=presiones comparativas de cadenas$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$22
5. Entrecomillado expansin...............................................................................................23
*$1$ Entrecomillado$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2(
*$2$ E=pansiones$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2(
*$2$1$ E=pansin de llaves$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$24
*$2$2$ E=pansin de tilde$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$24
*$2$($ E=pansin de parmetro o de variable$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2*
*$2$4$ Sustitucin de mandato$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$21
*$2$*$ E=pansin aritm5tica$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$27
*$2$1$ Sustitucin de proceso$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2/
*$2$7$ 8ivisin en palabras$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2/
*$2$/$ E=pansin de fic"ero$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2/
6. Re!erencias...........................................................................................................................3"
(
1. In%rod!$$*n.
El int#rprete de mandatos o >shell> es la interfa- principal entre el usuario y el sistema.
permiti5ndole a a?u5l interactuar con los recursos de 5ste$ El usuario introduce sus rdenes. el
int5rprete las procesa y %enera la salida correspondiente$
+or lo tanto. un int5rprete de mandatos de Uni= es tanto una interfa- de ejecucin de rdenes
y utilidades. como un len%uaje de pro%ramacin. ?ue admite crear nuevas rdenes @
denominadas $uiones o AshellscriptsB@. utili-ando combinaciones de mandatos y estructuras
l%icas de control. ?ue cuentan con caracter2sticas similares a las del sistema y ?ue permiten
?ue los usuarios y %rupos de la m?uina cuenten con un entorno personali-ado
C2D
$
En Uni= e=isten 2 familias principales de int5rpretes de mandatos: los basados en el int5rprete
de 3ourne !3S4. ES4 o 3,S4& y los basados en el int5rprete !S4 o :S4&$
Este curso de formacin sobre pro%ramacin en shell pretende ser una breve %u2a para el
usuario de sistemas FGU#0inu=. ?ue le permitir comprender. ejecutar y empe-ar a
pro%ramar en la Shell. "aciendo referencia especialmente a %&'( !Bourne Again Shell& @
evolucin de 3S4. con caracter2sticas de ES4 y S4@. ya ?ue es el int5rprete de mandatos
ms utili-ado en distribuciones FGU#0inu= e incluye un completo len%uaje para
pro%ramacin estructurada y %ran variedad de funciones internas$
1.1. Caractersticas principales de BASH.
0os principales caracter2sticas del int5rprete FGU 3,S4
CiD C1D
son:
Ejecucin s2ncrona de rdenes !una tras otra& o as2ncrona !en paralelo&$
8istintos tipos de redirecciones de entradas y salidas para el control y filtrado de la
informacin$
ontrol del entorno de los procesos$
Ejecucin de mandatos interactiva y desatendida. aceptando entradas desde teclado o
desde fic"eros$$
+roporciona una serie de rdenes internas para la manipulacin directa del int5rprete y
su entrono de operacin$
Un len%uaje de pro%ramacin de alto nivel. ?ue incluye distinto tipos de variables.
operadores. matrices. estructuras de control de flujo. entrecomillado. sustitucin de
valores y funciones$
ontrol de trabajos en primer y se%undo plano$
Edicin del "istrico de mandatos ejecutados$
+osibilidad de usar una >shell> para el uso de un entorno controlado$
4
1.2. Cundo utilizar el intrprete de mandatos.
omo se "a indicado anteriormente. una AshellB de Uni= puede utili-arse como interfa- para
ejecutar rdenes en la l2nea de comandos o como int5rprete de un len%uaje de pro%ramacin
para la administracin del sistema$
El len%uaje de 3,S4 incluye una sinta=is al%o en%orrosa. pero relativamente fcil de
aprender. con una serie de rdenes internas ?ue funcionan de forma similar a la l2nea de
comandos$ Un pro%rama o %uin puede dividirse en secciones cortas. cmodas de depurar.
permitiendo reali-ar prototipos de aplicaciones ms complejas$
Sin embar%o. "ay ciertas tareas ?ue deben ser resueltas con otros int5rpretes ms complejos o
con len%uajes compilados de alto nivel. tales como
C4D
:
+rocesos a tiempo real. o donde la velocidad es un factor fundamental$
Hperaciones matemticas de alta precisin. de l%ica difusa o de nImeros complejos$
+ortabilidad de cdi%o entre distintas plataformas$
,plicaciones complejas ?ue necesiten pro%ramacin estructurada o proceso
multi"ilvanado$
,plicaciones cr2ticas para el funcionamiento del sistema$
Situaciones donde debe %aranti-arse la se%uridad e inte%ridad del sistema. para
prote%erlo contra intrusin o vandalismo$
+royectos formados por componentes con dependencias de blo?ueos$
+roceso intensivo de fic"eros. ?ue re?uieran accesos directos o inde=ados$
Uso de matrices multidimensionales o estructuras de datos !listas. colas. pilas. etc$&$
+roceso de %rficos$
<anipulacin de dispositivos. puertos o AsocketsB$
Uso de bibliotecas de pro%ramacin o de cdi%o propietario
$
*
&. Red*re$$*one".
Uni= "ereda ( fic"eros especiales del len%uaje de pro%ramacin . ?ue representan las
funciones de entrada y salida de cada pro%rama$ Jstos son:
Entrada est)ndar: procede del tecladoK abre el fic"ero descriptor " !stdin& para
lectura$
'alida est)ndar: se diri%e a la pantallaK abre el fic"ero descriptor 1 !stdout& para
escritura$
'alida de error: se diri%e a la pantallaK abre el fic"ero descriptor 2 !stderr& para
escritura y control de mensajes de error$
El proceso de redireccin permite "acer una copia de uno de estos fic"eros especiales "acia o
desde otro fic"ero normal$ :ambi5n pueden asi%narse los descriptores de fic"eros del ( al 9
para abrir otros tantos arc"ivos. tanto de entrada como de salida$
El fic"ero especial /dev/null sirve para descartar al%una redireccin e i%norar sus datos$
2.1. Redireccin de entrada.
0a redireccin de entrada sirve para abrir para lectura el arc"ivo especificado usando un
determinado nImero descriptor de fic"ero$ Se usa la entrada estndar cuando el valor del
descriptor es 0 o 5ste no se especifica$
El si%uiente cuadro muestra el formato %en5rico de la redireccin de entrada$
[N]<Fichero
0a redireccin de entrada se usa para indicar un fic"ero ?ue contiene los datos ?ue sern
procesados por el pro%rama. en ve- de teclearlos directamente por teclado$ +or ejemplo:
miproceso.sh < fichdatos
Sin embar%o. conviene recordar ?ue la mayor2a de las utilidades y filtros de Uni= soportan los
fic"eros de entrada como parmetro del pro%rama y no es necesario rediri%irlos$
2.2. Redirecciones de salida.
8e i%ual forma a los descrito en el apartado anterior. la redireccin de salida se utili-a para
abrir un fic"ero @asociado a un determinado nImero de descriptor@ para operaciones de
escritura$
Se reservan 2 fic"eros especiales para el control de salida de un pro%rama: la salida normal
!con nImero de descriptor 1& y la salida de error !con el descriptor 2&$
1
En la si%uiente tabla se muestran los formatos %en5ricos para las redirecciones de salida$
Red*re$$*n .e"$r*+$*n
[N]> Fichero
Abre el fichero de descriptor N para escritura. Por defecto se usa la salida
estndar (N=1). Si el fichero existe, se borra; en caso contrario, se crea.
[N]>| Fichero
Como en el caso anterior, pero el fichero debe existir preiamente.
[N]>> Fichero
Como en el primer caso, pero se abre el fichero para a!adir datos al final,
sin borrar su contenido.
&> Fichero
"scribe las salida normal # de error en el mismo fichero.
El si%uiente ejemplo crea un fic"ero con las salidas %eneradas para confi%urar. compilar e
instalar una aplicacin FGU$
configure > aplic.sal
make >> aplic.sal
make install >> aplic.sal
2.3. Cominacin de redirecciones.
+ueden combinarse ms de una redireccin sobre el mismo mandato o %rupo de mandatos.
interpretndose siempre de i-?uierda a derec"a$
E/er$*$*o &.10 interpretar las si%uientes rdenes:
ls al /usr /tmp /noexiste >ls.sal 2>ls.err
find /tmp print >find.sal 2>/dev/null
Htras formas de combinar las redirecciones permiten reali-ar copias de descriptores de
fic"eros de entrada o de salida$ 0a si%uiente tabla muestra los formatos para duplicar
descriptores$
Red*re$$*n .e"$r*+$*n
[N]<&M
$uplicar descriptor de entrada M en N (N=%, por defecto).
[N]<&-
Cerrar descriptor de entrada N.
[N]<&M-
&oer descriptor de entrada M en N, cerrando M (N=%, por defecto).
[N]>&M
$uplicar descriptor de salida M en N (N=1, por defecto).
[N]>&-
Cerrar descriptor de salida N.
[N]>&M-
&oer descriptor de salida M en N, cerrando M (N=1, por defecto).
7
onviene "acer notar. ?ue @si%uiendo las normas anteriores@ las 2 l2neas si%uientes son
e?uivalentes y ambas sirven para almacenar las salidas normal y de error en el fic"ero
indicado:
ls al /var/* &>ls.txt
ls al /var/* >ls.txt 2>&
Sin embar%o. el si%uiente ejemplo muestra 2 mandatos ?ue no tienen por ?u5 dar el mismo
resultado. ya ?ue las redirecciones se procesan de i-?uierda a derec"a. teniendo en cuenta los
posibles duplicados de descriptores "ec"os en l2neas anteriores$
ls al * >ls.txt 2>& ! "alida normal # de error a $ls.txt$.
ls al * 2>& >ls.txt ! %signa la de error a la normal anterior
! &puede ha'erse redirigido( # luego
! manda la est)ndar a $ls.txt$.
2.!. Redireccin de entrada"salida.
0a redireccin de entrada salida abre el fic"ero especificada para operaciones de lectura y
escritura y le asi%na el descriptor indicado !0 por defecto&$ Se utili-a en operaciones para
modificacin y actuali-acin de datos$ El formato %en5rico es:
[N]<>Fichero
El si%uiente ejemplo muestra una simple operacin de actuali-acin de datos en un
determinado lu%ar del fic"ero
C4D
$
echo 2*+,-./01 > fich ! 2enera el contenido de $fich$
exec *<> fich ! %'rir fich con descriptor * en 3/"
read 4n + <&* ! 5eer + caracteres
echo 4n 6 >&* ! 3scri'ir coma decimal
exec *>&4 ! 7errar descriptor *
cat fich ! 2*+6-./01
2.#. $ocumento interno.
0a redireccin de documento interno usa parte del propio pro%rama @"asta encontrar un
delimitador de final@ como redireccin de entrada al comando correspondiente$ Suele
utili-arse para mostrar o almacenar te=to fijo. como por ejemplo un mensaje de ayuda$
El te=to del blo?ue ?ue se utili-a como entrada se trata de forma literal. esto es. no se reali-an
sustituciones ni e=pansiones$
El te=to interno suele ir tabulado para obtener una lectura ms comprensible$ El formato <<
mantiene el formato ori%inal. pero en el caso de usar el s2mbolo <<-. el int5rprete elimina los
caracteres de tabulacin antes de rediri%ir el te=to$
0a si%uiente tabla muestra el formato de la redireccin de documento interno$
/
Red*re$$*n .e"$r*+$*n
<<[-] Delimitador
Texto
...
Delimitador
Se usa el propio shellscript como entrada estndar, hasta la l'nea donde se
encuentra el delimitador.
(os tabuladores se eliminan de la entrada en el caso de usar la redirecci)n
<<- # se mantienen con <<.
omo ejemplo se muestra un tro-o de cdi%o y su salida correspondiente. ?ue presentan el
te=to e=plicativo para el formato de uso de un pro%rama$
echo << FIN
Formato:
config OPCION ...
OPCION!:
--cflag"
--ldflag"
--li#"
--ver"ion
--hel$
FIN
8ormato9
config :;7<:= ...
:;7<:=3"9
44cflags
44ldflags
44li's
44version
44help
2.%. Redireccin de cadena.
0a redireccin de cadena permite utili-ar una cadena de caracteres como datos de entrada a
un comando$ El formato %en5rico es:
<<<%Cadena%
El ejemplo muestra el uso de la redireccin de cadena para reali-ar una conversin a
mayIsculas$
tr >a4?> >%4@> <<<Aprue'aA ! ;BC3D%
2.&. 'ueras.
0a tuber*a es una "erramienta ?ue permite utili-ar la salida normal de un pro%rama como
entrada de otro. por lo ?ue suele usarse en el filtrado y depuracin de la informacin. siendo
una de las "erramientas ms potentes de la pro%ramacin con int5rpretes Uni=$
+ueden combinarse ms de una tuber2a en la misma l2nea de rdenes. usando el si%uiente
formato:
Mandato1 | Mandato2 ...
:odos los dialectos Uni= incluyen %ran variedad de filtros de informacin$ 0a si%uiente tabla
recuerda al%unos de los ms utili-ados$
9
Manda%o .e"$r*+$*n
head
Corta las primeras l'neas de un fichero.
tail
"xtrae las *ltimas l'neas de un fichero.
gre$
&uestra las l'neas +ue contienen una determinada cadena de caracteres o cumplen
un cierto patr)n.
cut
Corta columnas a,rupadas por campos o caracteres.
uni&
&uestra o +uita las l'neas repetidas.
"ort
(ista el contenido del fichero ordenado alfab-tica o num-ricamente.
'c
Cuenta l'neas, palabras # caracteres de ficheros.
find
.usca ficheros +ue cumplan ciertas condiciones # posibilita e/ecutar operaciones con
los archios locali0ados
"ed
"dita automticamente un fichero.
diff
&uestra las diferencias entre 1 ficheros en un formato compatible con la orden "ed.
comm
Compara 1 ficheros.
tr
Sustitu#e ,rupos de caracteres uno a uno.
a'(
Procesa el fichero de entrada se,*n las re,las de dicho len,ua/e.
El si%uiente ejemplo muestra una orden compuesta ?ue ordena todos los fic"eros con
e=tensin >.txt>. elimina las l2neas duplicadas y %uarda los datos en el fic"ero
>resultado.sal>$
cat ).t*t | "ort | uni& >re"ultado."al
0a orden tee es un filtro especial ?ue reco%e datos de la entrada estndar y lo rediri%e a la
salida normal y a un fic"ero especificado. tanto en operaciones de escritura como de
aadidura$ Esta es una orden muy Itil ?ue suele usarse en procesos lar%os para observar y
re%istrar la evolucin de los resultados$
El si%uiente ejemplo muestra y re%istra el proceso de compilacin e instalacin de una
aplicacin FGU$
configure 2>& E tee aplic.sal
make 2>& E tee a aplic.sal
make instal 2>& E tee a aplic.sal
E/er$*$*o &.&0 interpretar la si%uiente orden:
ls E tee salida E sort 4r
10
1. 2ar*ab)e".
,l contrario ?ue en otros len%uajes de pro%ramacin. 3,S4 no "ace distincin en los tipos de
datos de las variablesK son esencialmente cadenas de caracteres. aun?ue @se%In el conte=to@
tambi5n pueden usarse con operadores de nImeros enteros y condicionales$ Esta filosof2a de
trabajo permite una mayor fle=ibilidad en la pro%ramacin de %uiones. pero tambi5n puede
provocar errores dif2ciles de depurar
C4D
$
Una variable 3,S4 se define o actuali-a mediante operaciones de asi%nacin. mientras ?ue
se "ace referencia a su valor utili-ando el s2mbolo del dlar delante de su nombre$
Suele usarse la convencin de definir las variables en mayIsculas para distin%uirlas
fcilmente de los mandatos y funciones. ya ?ue en Uni= las mayIsculas y minIsculas se
consideran caracteres distintos$
F%BG$3sto es una prue'a ! asignaciHn de una varia'le
F%B2G*, ! asignar valor numIrico
echo JF%B ! 3sto es una prue'a
echo $F%B2GJF%B2$ ! F%B2G*,
3.1. 'ipos de (ariales.
0as variables del int5rprete 3,S4 pueden considerarse desde los si%uientes puntos de vista:
0as +ariables locales son definidas por el usuario y se utili-an Inicamente dentro de
un blo?ue de cdi%o. de una funcin determinada o de un %uin$
0as +ariables de entorno son las ?ue afectan al comportamiento del int5rprete y al de
la interfa- del usuario$
0os par)metros de posicin son los recibidos en la ejecucin de cual?uier pro%rama
o funcin. y "acen referencia a su orden ocupado en la l2nea de mandatos$
0as +ariables especiales son a?uellas ?ue tienen una sinta=is especial y ?ue "acen
referencia a valores internos del proceso$ 0os parmetros de posicin pueden incluirse
en esta cate%or2a$
1.1.1. 2ar*ab)e" )o$a)e".
0as variables locales son definidas para operar en un mbito reducido de trabajo. ya sea en un
pro%rama. en una funcin o en un blo?ue de cdi%o$ Luera de dic"o mbito de operacin. la
variable no tiene un valor preciso$
Una variable tiene un nombre Inico en su entorno de operacin. sin embar%o pueden @aun?ue
no es nada recomendable@ usarse variables con el mismo nombre en distintos blo?ues de
cdi%o$
El si%uiente ejemplo muestra los problemas de comprensin y depuracin de cdi%o ?ue
pueden desatarse en caso de usar variables con el mismo nombre$ En la primera fila se
presentan 2 pro%ramas ?ue usan la misma variable y en la se%unda. la ejecucin de los
11
pro%ramas !ntese ?ue el si%no > es el punto indicativo del interfa- de la AshellB y ?ue lo
tecleado por el usuario se representa en letra ne%rita&$
!K/'in/'ash
! prog varia'les prue'a
F%BGprue'a
echo JF%B
!K/'in/'ash
! prog2 varia'les prue'a 2
F%BG$otra prue'a$
echo JF%B
> echo +,-./
> $rog/
prue'a
> $rog0
otra prue'a
> $rog/
prue'a
+or lo tanto. para asi%nar valores a una variable se utili-a simplemente su nombre. pero para
"acer referencia a su valor "ay ?ue utili-ar el s2mbolo dlar !+&$ El si%uiente ejemplo muestra
los modos de referirse a una variable$
3BBG2 ! %signa 2 a la varia'le 3BB.
echo 3BB ! 3BB &cadena $3BB$(.
echo J3BB ! 2 &valor de 3BB(.
echo JL3BBM ! 2 &es eNuivalente(.
echo $3rror JL3BBM9 salir$ ! 3rror 29 salir
El formato +1Variable2 se utili-a en cadenas de caracteres donde se puede prestar a
confusin o en procesos de sustitucin de valores$
1.1.&. 2ar*ab)e" de en%orno.
,l i%ual ?ue cual?uier otro proceso Uni=. la AshellB mantiene un conjunto de variables ?ue
informan sobre su propio conte=to de operacin$ El usuario @o un shellscript@ puede
actuali-ar y aadir variables e=portando sus valores al entorno del int5rprete !mandato
e*$ort&. lo ?ue afectar tambi5n a todos los procesos "ijos %enerados por ella$
El administrador puede definir variables de entorno estticas para los usuarios del sistema
!como. por ejemplo. en el caso de la variable IF!&$
0a si%uiente tabla presenta las principales variables de entorno$
2ar*ab)e de
en%orno
.e"$r*+$*n 2a)or +or
om*"*n
!344
Camino del pro,rama int-rprete de mandatos. (a propia shell.
P56
$irectorio de traba/o actual. (o modifica la sheil.
O46P56
$irectorio de traba/o anterior (e+uiale a 7-). (o modifica la sheil.
PPI6
2dentificador del proceso padre (PP2$). (o modifica la shell
IF!
Separador de campos de entrada (debe ser de s)lo lectura). "SP, 3A., 4(.
12
3O8
$irectorio personal de la cuenta. (o define root.
4O9N-8
4ombre de usuario +ue e/ecuta la shell. Actiado por login
P-:3
Camino de b*s+ueda de mandatos. Se,*n el sistema
4-N9
2dioma para los mensa/es.
6I:O.
"ditor usado por defecto.
:.8
3ipo de terminal.
P!/ ... P!;
Puntos indicatios primario, secundario, selectio # de errores.
F<NCN-8
4ombre de la funci)n +ue se est e/ecutando. (o modifica la shell.
4INNO
45 de l'nea actual del script (para depuraci)n de c)di,o) (o modifica la shell.
8ebe "acerse una mencin especial a la variable P-:3. ?ue se encar%a de %uardar la lista de
directorios con fic"eros ejecutables$ Si no se especifica el camino e=acto de un pro%rama. el
sistema busca en los directorios especificados por P-:3. si%uiendo el orden de i-?uierda a
derec"a$ El carcter separador de directorios es dos puntos$
El administrador del sistema debe establecer los caminos por defecto para todos los usuarios
del sistema y cada uno de 5stos puede personali-ar su propio entorno. aadiendo sus propios
caminos de bIs?ueda !si no usa un int5rprete restrin%ido&$
E/er$*$*o 1.10 interpretar la si%uiente orden:
;%OPGJ;%OP9/home/grupo/'in9/opt/oracle/'in
Re$omenda$*one" de "e!r*dad0
Siempre deben indicarse caminos absolutos en la definici)n de la ariable P-:3 #, sobre todo, nunca
incluir el directorio actual (.), ni el directorio padre (..).
$eclarar la ariable IF! de s)lo lectura, para eitar intrusiones del tipo 6caballos de 3ro#a7.
1.1.1. Par3me%ro" de +o"*$*n.
0os parmetros de posicin son variables especiales de 3,S4 ?ue contienen los valores de
los parmetros ?ue recibe un pro%rama o una funcin$ El nImero indica la posicin de dic"o
parmetro en la llamada al cdi%o$
El 1
er
parmetro se denota por la variable +/. el 9M por += y a partir del 10M "ay ?ue usar la
notacin +1Nmero2$
El mandato interno "hift despla-a la lista de parmetros "acia la i-?uierda para procesar los
parmetros ms cmodamente$ El nombre del pro%rama se denota por la variable +>$
1(
6evisar el si%uiente cuadro para observar el uso de parmetros posicionales y de variables
locales. donde se muestran al%unas l2neas de un pro%rama para %estin de usuarios$
grep $QJ9$ /etc/passRd
grep $9J2<S9$ /etc/group E cut 4f 4d9
1$ Nmprime la l2nea del fic"ero de usuarios para el especificado en el 1
er
parmetro
recibido por el pro%rama$
2$ +resenta el nombre del %rupo cuyo identificador se encuentra en la variable 9I6$
1.1.4. 2ar*ab)e" e"+e$*a)e".
0as variables especiales informan sobre el estado del proceso. son tratadas y modificadas
directamente por el int5rprete. por lo tanto. son de slo lectura$
0a si%uiente tabla describe brevemente estas variables$
2ar*ab)e
e"+e$*a)
.e"$r*+$*n
++
2dentificador del proceso (P2$).
+)
Cadena con el contenido completo de los parmetros recibidos por el pro,rama.
+?
Como en el caso anterior, pero trata cada parmetro como una palabra diferente.
+@
4*mero de parmetros.
+A
C)di,o de retorno del *ltimo mandato (%=normal, 8%=error).
+B
9ltimo identificador de proceso e/ecutado en se,undo plano.
+C
:alor del *ltimo ar,umento del comando e/ecutado preiamente.
0a construccin cat D+?D se utili-a para procesar datos tanto de fic"eros como de la entrada
estndar
C4D
$
0a 1' fila de la tabla del si%uiente ejemplo muestra el cdi%o de un pro%rama para convertir
minIsculas en mayIsculasK mientras ?ue la 2'. indica cmo puede utili-arse el pro%rama !el
te=to tecleado est representado en letra ne%rita&$
Gota: la construccin E6 representa la combinacin de teclas ontrol)8 !carcter fin de
te=to&$
!K/'in/'ash
! ma#usculas convierte a ma#Tsculas usando ficheros o stdin
! Cso9 ma#usculas [ [<]fichero ]
cat $JU$ E tr >a4?V)IWHTX> >%4@YZ[\]^_>
14
> maFu"cula" dato".t*t >dato"."al
> maFu"cula" <dato".t*t >dato"."al
> maFu"cula"
"to e" una $rue#a de eGecuciHn del $rograma.
E6
3"O: 3" C=% ;BC3D% S3 3`37C7<]= S35 ;B:2B%a%.
Un uso comIn de la variable ++ es el de asi%nar nombres para fic"eros temporales ?ue
permiten el uso concurrente del pro%rama. ya ?ue al estar asociada al +N8 del proceso. 5ste
valor no se repetir nunca al ejecutar simultneamente varias instancias del mismo pro%rama$
E/er$*$*o 1.&0 interpretar los si%uientes mandatos:
echo J1b shiftb echo J1
echo Jb shift 2b echo J
3.2. )atrices.
Una matri, !o AarrayB& es un conjunto de valores identificados por el mismo nombre de
variable. donde cada una de sus celdas cuenta con un 2ndice ?ue la identifica$ 0as matrices
deben declararse mediante la clusula interna declare. antes de ser utili-adas$
3,S4 soporta matrices de una Inica dimensin @conocidas tambi5n como +ectores@. con un
Inico 2ndice num5rico. pero sin restricciones de tamao ni de orden num5rico o continuidad$
0os valores de las celdas pueden asi%narse de manera individual o compuesta$ Esta se%unda
frmula permite asi%nar un conjunto de valores a varias de las celdas del vector$ Si no se
indica el 2ndice en asi%naciones compuestas. el valor para 5ste por defecto es 0 o sumando 1
al valor previamente usado$
El uso de los caracteres especiales I?J o I)J como 2ndice de la matri-. supone referirse a
todos los valores en su conjunto. con un si%nificado similar al e=presado en el apartado
anterior$
El si%uiente ejemplo describe la utili-acin de matrices$
declare a =Ca3B:" ! Seclarar la matri?.
=Ca3B:"G& cero uno dos tres ( ! %signaciHn compuesta.
echo JL=Ca3B:"[2]M ! dos
=Ca3B:"[+]G$cuatro$ ! %signaciHn simple.
echo JL=Ca3B:"[+]M ! cuatro
=Ca3B:"G& [-]Gseis siete [0]Gnueve ( ! celdas -6 . # 0.
echo JL=Ca3B:"[.]M ! siete
E/er$*$*o 1.10 se%In los datos de la matri- del ejemplo anterior. cul es la salida de las
si%uientes rdenes:
echo JL=Ca3B:"[*]M
echo J=Ca3B:"[*]
echo J=Ca3B:"
1*
3.3. Con*i+uracin del entorno.
El int5rprete de mandados de cada cuenta de usuario tiene un entorno de operacin propio. en
el ?ue se incluyen una serie de variables de confi%uracin$
El administrador del sistema asi%nar unas variables para el entorno de ejecucin comunes a
cada %rupo de usuarios @o a todos ellos@K mientras ?ue cada usuario puede personali-ar
al%unas de estas caracter2sticas en su perfil de entrada. aadiendo o modificando las variables$
+ara crear el entorno %lobal. el administrador crea un perfil de entrada comIn para todos los
usuarios !arc"ivo /etc/#a"hrc en el caso de 3,S4&. donde @entre otros cometidos@ se
definen las variables del sistema y se ejecutan los fic"eros de confi%uracin propios para cada
aplicacin$
Estos pe?ueos pro%ramas se sitIan en el subdirectorio /etc/profile.dK debiendo e=istir
fic"eros propios de los int5rpretes de mandatos basados en el de 3ourne !3S4. 3,S4.
+8ES4. etc$&. con e=tensin ."h6 y otros para los basados en el int5rprete !S4. :S4.
etc$&. con e=tensin .c"h$
El proceso de cone=in del usuario se completa con la ejecucin del perfil de entrada personal
del usuario !arc"ivo 7/.#a"hC$rofile para 3,S4&$ ,un?ue el administrador debe
suministrar un perfil vlido. el usuario puede retocarlo a su conveniencia$ En el si%uiente
cap2tulo se presentan las variables de entorno ms importantes usadas por 3,S4$
11
4. E,+re"*one".
El int5rprete 3,S4 permite utili-ar una %ran variedad de e=presiones en el desarrollo de
pro%ramas y en la l2nea de mandatos$ 0as distintas e=presiones soportadas por el int5rprete
pueden en%lobarse en las si%uientes cate%or2as:
Expresiones aritm#ticas: las ?ue dan como resultado un nImero entero o binario$
Expresiones condicionales: utili-adas por mandatos internos de 3,S4 para su
evaluar indicando si 5sta es cierta o falsa$
Expresiones de cadenas: a?uellas ?ue tratan cadenas de caracteres !se tratarn a
fondo en el ap2tulo *&$
0as e=presiones complejas cuentan con varios parmetros y operadores. se evalIan de
i-?uierda a derec"a$ Sin embar%o. si una operacin est encerrada entre par5ntesis se
considera de mayor prioridad y se ejecuta antes$
0a tabla lista los operadores utili-ados en los distintos tipos de e=presiones 3,S4$
Operadores aritmticos:
K - ) / L KK --
Operadores de comparacin:
MM BM < <M > >M -e& Nnt Nlt -le Ngt Nge
Operadores lgicos:
B && ||
Operadores binarios:
& | E << >>
Operadores de asignacin:
M )M /M LM KM -M <<M >>M &M EM |M
Operadores de tipos de ficheros:
-a -e N# Nc Nd Nf -h -4 -$ -" -! Nt
Operadores de permisos:
-r -' -* -g -u -( -O -9 NN
Operadores de fechas:
-nt Not Net
Operadores de cadenas:
-O -n
!.1. ,-presiones aritmticas.
0as e=presiones aritm5ticas representan operaciones nImeros enteros o binarios !booleanos&
evaluadas mediante el mandato interno let !no se permiten nImero reales ni complejos&$
0a valoracin de e=presiones aritm5ticas enteras si%ue las re%las:
Se reali-a con nImeros enteros de lon%itud fija sin comprobacin de desbordamiento.
esto es. i%norando los valores ?ue sobrepasen el m=imo permitido$
0a divisin por 0 %enera un error ?ue puede ser procesado$
0a prioridad y asociatividad de los operadores si%ue las re%las del len%uaje $
17
0a si%uiente tabla describe las operaciones aritm5ticas enteras y binarias a%rupadas en orden
de prioridad$
O+era$*n .e"$r*+$*n Comen%ar*o"
VarKK
Var--
Post;incremento de ariable.
Post;decremento de ariable.
(a ariable se incrementa o decrementa
en 1 despu-s de ealuarse su expresi)n.
KKVar
--Var
Pre;incremento de ariable.
Pre;decremento de ariable.
(a ariable se incrementa o decrementa
en 1 antes de ealuarse su expresi)n.
KExpr
-Expr
&s unario.
&enos unario.
Si,no positio o ne,atio de la expresi)n
(por defecto se considera positio).
B Expr
7 Expr
4e,aci)n l),ica.
4e,aci)n binaria.
4e,aci)n de la expresi)n l),ica o
ne,aci)n bit a bit.
E1 )) E2
"xponenciaci)n. "1 eleado a "1 ("1
"1
).
E1 ) E2
E1 / E2
E1 L E2
&ultiplicaci)n.
$iisi)n.
<esto.
=peraciones de multiplicaci)n # diisi)n
entre n*meros enteros.
E1 K E2
E1 - E2
Suma..
<esta.
Suma # resta de enteros.
Expr << N
Expr >> N
$espla0amiento binario a la i0+uierda.
$espla0amiento binario a la derecha.
$espla0amiento de los bits un n*mero
indicado de eces.
E1 < E2
E1 <= E2
E1 > E2
E1 >M E2
Comparaciones (menor, menor o i,ual,
ma#or, ma#or o i,ual).
E1 MM E2
E1 BM E2
Comparaciones de i,ualdad #
desi,ualdad.
E1 & E2
=peraci)n binaria >.
E1 E E2
=peraci)n binaria = "xclusio.
E1 | E2
=peraci)n binaria =.
E1 && E2
=peraci)n l),ica >.
E1 || E2
=peraci)n l),ica =.
E1 A E2 : E3
"aluaci)n l),ica. Si "1=cierto, se deuele "1; si no, "?.
1/
E1 M E2
E1 pM E2
Asi,naci)n normal # con pre;operaci)n
(operadores lidos@ *G, /G, cG, dG,
4G, <<G, >>G, &G, QG, EG).
Asi,na el alor de "1 a "1. Si es indica
un operador, primero se reali0a la
operaci)n entre las 1 expresiones # se
asi,na el resultado ("1 = "1 =p "1).
E1P E2
=peraciones independientes. Se e/ecutan en orden.
El cuadro ?ue se muestra a continuacin ilustra el uso de las e=presiones aritm5ticas$
let aG, ! %signaciHn aG,.
let 'GJad**0 ! 'Gad&**0(G*2.
echo $aGJa6 'GJ'$ ! aG,6 'G*2
let cGJ'/&Jad*( ! cG'/&ad*(G+.
let adGc44 ! aGadcG06 cGc4G*.
echo $aGJa6 cGJc$ ! aG06 cG*
let 7O3GJ'/Jc6 B3"O:GJ'cJc ! 7O3G'/c6 B3"O:Gresto&'/c(.
echo $7ocienteGJ7O36 BestoGJB3"O:$ ! 7ocienteG16 BestoG2
0os nImeros enteros pueden e=presarse en bases num5ricas distintas a la decimal !base por
defecto&$ El si%uiente ejemplo muestra los formatos de cambio de base$
let =G,0 ! Dase decimal &140(.
let =G1*+ ! Dase octal &14.(6 empie?a por 1.
let =G1x*+%8 ! Dase hexadecimal &140%48(6 empie?a por 1x.
let =G[21!]2+P2 ! Dase 21 &especificada entre 2 # -+(.
E/er$*$*o 4.10 e=plicar la si%uiente e=presin$
let aG&'>c(e'9c
!.2. ,-presiones condicionales.
0as expresiones condicionales son evaluadas por los mandatos internos del tipo te"t. dando
como resultado un valor de cierto o de falso$ Suelen emplearse en operaciones condicionales
y bucles. aun?ue tambi5n pueden ser empleadas en rdenes compuestas$
E=isten varios tipos de e=presiones condicionales se%In el tipo de parmetros utili-ado o su
modo de operacin:
Expresiones con !ic-eros. ?ue comparan la e=istencia . el tipo. los permisos o la
fec"a de fic"eros o directorios$
Expresiones comparati+as num#ricas. ?ue evalIan la relacin de orden num5rico
entre los parmetros$
Expresiones comparati+as de cadenas. ?ue establecen la relacin de orden alfab5tico
entre los parmetros$
:odas las e=presiones condicionales pueden usar el modificador de ne%acin !B Expr& para
indicar la operacin inversa$ ,simismo. pueden combinarse varias de ellas en una e=presin
compleja usando los operadores l%icos O !Expr1 && Expr2& y H !Expr1 || Expr2&$
19
4.&.1. E,+re"*one" de 4*$(ero".
Son e=presiones condicionales ?ue devuelven el valor de cierto si se cumple la condicin
especificadaK en caso contrario da un valor de falso$ 4ay una %ran variedad de e=presiones
relacionadas con fic"eros y pueden a%ruparse en operaciones de tipos. de permisos y de
comparacin de fec"as$
onviene recordar ?ue Atodo en Uni= es un fic"eroB. por eso "ay bastantes operadores de
tipos de fic"eros$ 0a si%uiente tabla lista los formatos de estas e=presiones$
5orma%o Cond*$*n ($*er%o "*...#
-a Fich
-e Fich
"l fichero (de cual+uier tipo) existe
-" Fich
"l fichero no est ac'o.
-f Fich
"s un fichero normal.
-d Fich
"s un directorio.
-# Fich
"s un dispositio de blo+ues.
-c Fich
"s un dispositio de caracteres.
-$ Fich
"s una tuber'a.
-h Fich
-4 Fich
"s un enlace simb)lico.
-! Fich
"s una 6socket7 de comunicaciones.
-t De!c
"l descriptor est asociado a una terminal.
F1 -ef F2
(os 1 ficheros son enlaces hacia el mismo archio.
0as condiciones sobre permisos establecen si el usuario ?ue reali-a la comprobacin puede
ejecutar o no la operacin deseada sobre un determinado fic"ero$ 0a tabla describe estas
condiciones$
5orma%o Cond*$*n ($*er%o "*...#
-r Fich
3iene permiso de lectura.
-' Fich
3iene permiso de escritura (modificaci)n).
-* Fich
3iene permiso de e/ecuci)nAacceso.
-u Fich
3iene el permiso SB2$.
-g Fich
3iene el permiso SC2$.
20
-t Fich
3iene permiso de directorio compartido o fichero en cach-.
-O Fich
"s el propietario del archio.
-9 Fich
"l usuario pertenece al ,rupo con el C2$ del fichero.
0as operaciones sobre fec"as @descritas en la si%uiente tabla@ establecen comparaciones entre
las correspondientes a 2 fic"eros$
5orma%o Cond*$*n ($*er%o "*...#
-N Fich
"l fichero ha sido modificado desde al *ltima lectura.
F1 -nt F2
"l fichero D1 es ms nueo +ue el D1.
F1 -ot F2
"l fichero D1 es ms anti,uo +ue el D1.
;5anse ejemplos e=tra2dos del fic"ero de confi%uracin /etc/rc.d/rc.s#sinit$
! "i /proa/mdstat # /etc/raidta' son ficherosb entonces ...
if I -f /$roc/md"tat -a -f /etc/raidta# JQ then
...
! "i el camino representado por el contenido de la varia'le
! Jafile es un directoriob entonces ...
if I -d D+afileD JQ then
...
E/er$*$*o 4.&0 interpretar la si%uiente e=presin$
if [ 4e /proc/lvm 4a 4x /s'in/vgchange 4a 4f /etc/lvmta' ]b
4.1.&. E,+re"*one" $om+ara%*6a" n!m7r*$a".
,un?ue los operadores de comparacin para nImeros ya se "an comentado en el apartado
anterior. la si%uiente tabla describe los formatos para este tipo de e=presiones$
5orma%o Cond*$*n ($*er%o "*...#
N1 -e& N2
N1 -ne N2
N1 -lt N2
N1 -gt N2
Se cumple la condici)n de comparaci)n num-rica (respectiamente i,ual, distinto,
menor # ma#or).
ontinuando con el ejemplo. se comentan unas l2neas de /etc/rc.d/rc.s#sinit$
21
! "i la varia'le B3"C5O es > 1 #
! /s'in/raidstart es efecuta'leb entonces ...
if I +.!<4: -gt > -a -* /"#in/raid"tart JQ then
...
! "i el cHdigo de la efecuciHn del er mandato es 1 #
! el del 2g es distinto de 1b entonces ...
if gre$ -& /initrd /$roc/mount" && R
B gre$ -& /initrd/loo$f" /$roc/mount" Q then
...
! "i la expresiHn de Nue existe el fichero /fast'oot es cierta o
! el cHdigo de salida del mandato es correctob entonces ...
if I -f /fa"t#oot J || R
gre$ -i& Dfa"t#ootD /$roc/cmdline 0>/dev/null Q then
...
4.1.1. E,+re"*one" $om+ara%*6a" de $adena".
8e forma similar. tambi5n pueden reali-arse comparaciones entre cadenas de caracteres$
onviene destacar ?ue es recomendable usar comillas dobles para delimitar las cadenas a
comparar$
0a tabla si%uiente indica el formato para este tipo de e=presiones$
5orma%o Cond*$*n ($*er%o "*...#
Cad1 MM Cad2
Cad1 BM Cad2
Cad M7 E"
Se cumple la condici)n de comparaci)n de cadenas (respectiamente i,ual #
distinto) # de comparaci)n con expresi)n re,ular extendida (este *ltimo caso, solo
se usa en expresiones condicionales entre EE # FF).
[-n] Cad
(a cadena no est ac'o (su lon,itud no es %).
-O Cad
(a lon,itud de la cadena es %.
omo en los prrafos previos. se revisa parte del cdi%o del fic"ero /etc/rc.d/rc.s#sinit$
! "i 5:2=%a3 es una varia'le vacWa o
! tiene el valor $&none($b entonces ...
if I -O D+3O!:N-8D -o D+3O!:N-8D M DSnoneTD JQ then
...
! "i la varia'le Jfast'oot no tiene contenido #
! la varia'le JB::O8"Oh;3 no es $nfs$b entonces ...
if I -O D+fa"t#ootD -a D+.OO:F!:UPD BM Dnf"D JQ then
i
! "i la varia'le JC<S solo contiene nTmerosb entonces ...
if II D+<I6D M7 EI>-=JK+ JJQ then
...
E/er$*$*o 4.10 interpretar la si%uiente orden$
if [ 4n $J;=;$ 4a 4f /proc/isapnp 4a 4x /s'in/sndconfig ]b then
22
8. En%re$om*))ado 9 e,+an"*n.
#.1. ,ntrecomillado.
ada uno de los caracteres especiales @metacaracteres@ usados en 3,S4 tienen un
comportamiento especial. se%In la sinta=is del len%uaje$ El entrecomillado es el
procedimiento utili-ado para modificar o eliminar el uso normal de dic"o metacaracteres$
Hbs5rvese el si%uiente ejemplo$
! 3l jbA se usa normalmente para separar comandos.
echo Polab echo Nue tal ! Pola
! Nue tal
! Csando entrecomillado pierde su funciHn normal.
echo $Polab echo Nue tal$ ! Polab echo Nue tal
0os ( tipos bsicos de entrecomillado definidos en 3,S4 son
C2D
:
.ar)cter de escape /RCar#cter0: mantiene el valor literal del carcter ?ue lo
precedeK la secuencia RR e?uivale a presentar el carcter R$ uando aparece como
Iltimo carcter de la l2nea. sirve para continuar la ejecucin de una orden en la l2nea
si%uiente$
.omillas simples /VCadenaV0: siempre conserva el valor literal de cada uno de los
caracteres de la cadena$
.omillas dobles /DCadenaD0: conserva el valor de literal de la cadena. e=cepto para
los caracteres dlar !J&. comilla simple !>& y de escape !kJ. kk. k>. k$. ante el fin de
l2nea y secuencia de escape del tipo ,GSN)&$
El entrecomillado con formato +DCadenaD se utili-a para procesos de traduccin se%In el
idioma e=presado por la variable 4-N9$ Si se utili-a el valor de idioma por defecto ! o
+HSNP&. la cadena se trata normalmente con comillas dobles$
;eamos unos ejemplos:
echo $"Hlo con permiso k$rootk$$ ! "Hlo con permiso $root$
echo >"Hlo con permiso k$rootk$> ! "Hlo con permiso k$rootk$
E/e$r$*$*a 8.10 indicar las salidas de los si%uientes mandatos$
echo $3fecutar >sm'mount kkkkservidorkkdocumentos kJP:a3/doc>$
echo >3fecutar jsm'mount kkkkservidorkkdocumentos kJP:a3/docA>
#.2. ,-pansiones.
omo se lleva observando en todo el curso. la l2nea de comandos se divide en una serie de
elementos ?ue representan cierto si%nificado en la semntica del int5rprete$ 0a expansin es
un procedimiento especial ?ue se reali-a sobre dic"os elementos individuales$
2(
3,S4 dispone de / topos de e=pansiones. ?ue se%In su orden de procesado son
C2D
:
Expansin de lla+es: modifica la e=presin para crear cadenas arbitrarias$
Expansin de tilde: reali-a sustituciones de directorios$
Expansin de par)metro +ariable: 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 aritm#tica: sustituye la e=presin por su valor num5rico$
'ustitucin de proceso: comunicacin de procesos mediante tuber2as con nombre de tipo
cola !LNLH&$
1i+isin en palabras: separa la l2nea de mandatos resultante en palabras usando los
caracteres de divisin incluidos en la variable IF!$
Expansin de !ic-ero: permite buscar patrones con comodines en los nombres de
fic"eros$
8.&.1. E,+an"*n de ))a6e".
0a e=pansin de llaves es el preprocesado de la l2nea 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 e=istir. por lo tanto puede modificarse el nImero
de palabras ?ue se obtienen tras ejecutar la e=pansin$ El formato %eneral es el si%uiente:
5orma%o .e"$r*+$*n
[$re]1C1PC2[P...]2[%&f]
"l resultado es una lista de palabras donde se le a!ade a cada una de
las cadenas de las llaes G# separadas por comasG un prefi/o # un
sufi/o opcionales.
+ara ilustrarlo. v5anse los si%uientes ejemplos$
echo aL'6c6dMe ! a'e ace ade
mkdir JP:a3/L'in6li'6docM ! "e crean los directorios9
! JP:a3/'in6 JP:a3/li' # JP:a3/doc.
E/er$*$*o 8.&0 interpretar la si%uiente orden$
mkdir JLP:a3M/L'in6li'6docM
8.&.&. E,+an"*n de %*)de.
Este tipo de e=pansin obtiene el valor de un directorio. tanto de las cuentas de usuarios.
como de la pila de directorios accedidos$ 0os formatos vlidos de la e=pansin de tilde son:
24
5orma%o .e"$r*+$*n
7['!&ario]
$irectorio personal del usuario indicado. Si no se expresa nada +3O8.
7K
$irectorio actual (+P56).
7-
$irectorio anterior (+O46P56).
;5ase este pe?ueo pro%rama:
!K/'in/'ash
! capacidad muestra la capacidad en lD de la cuenta del
! usuario indicado
! Cso9 capacidad usuario
echo $Csuario9 J$
ls ld mJ
du hs mJ
Es recomendable definir un alias en el perfil de entrada del usuario para cambiar al directorio
anterior. ya ?ue la sinta=is del comando es al%o en%orrosa$ +ara ello. aadir la si%uiente l2nea
al fic"ero de confi%uracin 7/.#a"hrc$
alias cdaG>cd m4>
8.&.1. E,+an"*n de +ar3me%ro o de 6ar*ab)e.
+ermite la sustitucin del contenido de la variable si%uiendo una amplia variedad de re%las$
0os distintos formatos para la e=pansin de parmetros son
C1D
:
5orma%o .e"$r*+$*n
+1BVar2
Se hace referencia a otra ariable # se obtiene su alor (expansin
indirecta).
+1$ar#m:-Val2
Se deuele el parmetro; si -ste es nulo, se obtiene el valor por
defecto.
+1$ar#m:MVal2
Si el parmetro es nulo se le asigna el valor por defecto # se expande.
+1$ar#m:ACad2
Se obtiene el parmetro; si es nulo se manda un mensaje de error.
+1$ar#m:KVal2
Se deuele el valor alternativo si el parmetro no es nulo.
+1$ar#m:(nic2
+1$ar#m:(nic:)on*2
Valor de subcadena del parmetro, desde el punto inicial hasta el final o
hasta la lon,itud indicada.
+1B$ref)2
+1B$ref?2
$euele los nombres de ariables +ue empie0an por el prefi/o.
2*
+1@$ar#m2
+1@Matri+I)J2
"l tamao en caracteres del parmetro o en elementos de una matri0.
+1$ar#m@$atr,n2
+1$ar#m@@$atr,n2
Se elimina del alor del parmetro la m'nima (o la mxima) comparaci)n
del patr)n, comen0ando por el principio del parmetro.
+1$ar#mL$atr,n2
+1$ar#mLL$atr,n2
Se elimina del alor del parmetro la m'nima (o la mxima) comparaci)n
del patr)n, buscando por el final del parmetro.
+1$ar#m/$atr,n/Cad2
+1$ar#m//$atr,n/Cad2
"n el alor del parmetro se reempla0a por la cadena indicada la primera
comparaci)n del patr)n (o todas las comparaciones).
3,S4 proporciona unas potentes "erramientas para el tratamiento de cadenas. sin embar%o la
sinta=is puede resultar en%orrosa y re?uiere de e=periencia 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:
! "i el er par)metro es nulo6 asigna el usuario Nue lo efecuta.
C"C%B<:GJL94nRhoaminM
! "i no est) definida la varia'le 7:5Ca="6 el ancho es de /1.
%=7P:GJL7:5Ca="94/1M
! "i no existe el er par)metro6 pone mensafe de error # sale.
9 JL9e$3rror9 J1 fichero$
! :'tiene la extensiHn de un fichero &Nuita hasta el punto(.
3oOGJL8<7P3B:!!*.M
! puita la extensiHn jrpmA al camino del fichero.
B;aGJL8<7PB;ac.rpmM
! 7uenta el ng de caracteres de la varia'le 75%F3.
7%B%7O3B3"GJL!75%F3M
! Benom'ra el fichero de enero a 8e'rero.
=C3F:GJL%=O<2C:/enero/fe'reroM
! %Vade nuevo elemento a la matri? &matri?[tamaVo]Gelemento(.
matri?[JL!matri?[*]M]G$nuevo$
E/er$*$*o 8.&0 interpretar los si%uientes mandatos$
S%O:"G$ls ld J$
O<;:GJLS%O:"9M
;3BaGJLS%O:"9290M
if [ JL!:;7<:=3"M 4gt ]b then ...
fG$JfJLcJeM$
8.&.4. S!"%*%!$*n de manda%o.
Esta e=pansin sustituye el mandato ejecutado @incluyendo sus parmetros@ por su salida
normal. ofreciendo una %ran potencia y fle=ibilidad de ejecucin a un AshellscriptB$ 0os
formatos vlidos son:
21
5orma%o .e"$r*+$*n
+SMandatoT
Sustituci)n literal del mandato # sus parmetros.
WMandatoW
Sustituci)n de mandatos permitiendo caracteres de escape.
uando la sustitucin de mandatos va en una cadena entre comillas dobles se evita ?ue
posteriormente se ejecute una e=pansin de fic"eros$
El si%uiente pro%rama lista informacin sobre un usuario$
!K/'in/'ash
! infous lista informaciHn de un usuario.
! Cso9 infous usuario
O3a;:B%5Gngrep $QJ9$ /etc/passRd 2>/dev/nulln
C"C%B<:Gnecho JO3a;:B%5 E cut 4f 4d9n
echo $=om're de usuario9 JC"C%B<:$
echo 4n $<dentifidor &C<S(9 $
echo JO3a;:B%5 E cut 4f* 4d9
echo 4n $=om're del grupo primario9 $
2<SGnecho JO3a;:B%5 E cut 4f+ 4d9n
grep $9J2<S9$ /etc/group E cut 4f 4d9
echo $Sirectorio personal9 $
ls 4ld necho JO3a;:B%5 E cut 4f- 4d9n
E/er$*$*o 8.10 interpretar la salida de la si%uiente orden:
echo $J&'asename J1(9 k$JC"3Bk$ sin permiso de efecuciHn.$ >&2
8.&.8. E,+an"*n ar*%m7%*$a.
0a e=pansin aritm5tica calcula el valor de la e=presin indicada y la sustituye por el
resultado de la operacin$ El formato de esta e=pansin es:
5orma%o .e"$r*+$*n
+SSExpre!i,nTT
+IExpre!i,nJ
Sustitu#e la expresi)n por su resultado.
;5ase el si%uiente ejemplo:
! 7uenta el ng de espacios para centrar una cadena
! espacios G & anchoqpantalla longitud &cadena( ( / 2.
3";%7<:"GJ&& &%=7P:4JL!7%S3=%M(/2 ((
E/er$*$*o 8.40 interpretar la si%uiente l2nea. al%o dif2cil de leer$
if [ JL!cadM 4lt J[JL!M4] ]b then ...
27
8.&.6. S!"%*%!$*n de +ro$e"o.
0a 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&$ 0os formatos vlidos para esta e=pansin son:
5orma%o .e"$r*+$*n
Fich <S)i!taT
De!cr<S)i!taT
(a lista de )rdenes escribe en el fichero para +ue -ste pueda ser le'do por otro
proceso.
Fich >S)i!taT
De!cr>S)i!taT
Cuando otro proceso escribe en el fichero, el contenido de -ste se pasa como
parmetro de entrada a la lista de )rdenes.
E/er$*$*o 8.80 interpretar la si%uiente l2nea$
comm <&sort enero.dat( <&sort fe'rero.dat(
8.&.:. .*6*"*n en +a)abra".
Una ve- ?ue se "ayan reali-ado las e=pansiones previas. el int5rprete divide la l2nea de
entrada en palabras. utili-ando como separadores los caracteres especificados en la variable de
entorno IF!$ +ara evitar problemas de se%uridad %enerados por un posible Aaballo de
:royaB. el administrador debe declarar esta variable como de slo lectura y establecer unos
valores fijos para los separadores de palabraK ?ue por defecto 5stos son espacio. tabulador y
salto de l2nea$ Una secuencia de varios separadores se considera como un Inico delimitador$
+or ejemplo. si se ejecuta el si%uiente mandato:
du hs JP:a3
el intIrprete reali?a las sustituciones # antes de efecutar la orden
divide la lWnea en las siguientes pala'ras.
jduA j4hsA j/home/ramonA
8.&.;. E,+an"*n de 4*$(ero.
Si al%unas de las palabras obtenidas tras la divisin anterior contiene al%In caracteres especial
conocido como comod*n !). A o I&. 5sta se trata como un patrn ?ue se sustituye por la lista
de nombres de fic"eros ?ue cumplen dic"o patrn. ordena da alfab5ticamente
C2D
$ El resto de
caracteres del patrn se tratan normalmente$
0os patrones vlidos son:
2/
5orma%o
.e"$r*+$*n
)
"+uiale a cual+uier cadena de caracteres, incluida una cadena nula.
A
"+uiale a cual+uier carcter *nico.
I)i!taJ
"+uiale a cual+uier carcter +ue apare0ca en la lista. Pueden incluirse ran,os de
caracteres separados por ,ui)n (-). Si el primer carcter de la lista es E, se
comparan los caracteres +ue no formen parte de ella.
0a si%uiente tabla describe al%unos ejemplos$
! 5istar los ficheros terminados en .rpm
l" ).r$m
! 5istar los ficheros Nue empiecen por letra minTscula # tengan
! extensiHn .rpm
l" Ia-OJ).r$m
! 5istar los ficheros Nue empie?an por j.'A6 j.xA # j.oA
l" .I#*XJ)
! 5istar los ficheros cu#a extensiHn tenga 2 caracteres
l" ).AA
E/er$*$*o 8.60 evaluar la si%uiente orden$
cd /var/logb tar cvf copialog.tar s#slog.[140] messages.[140]
29
6. Re4eren$*a".
1$ 3$ Lo=. $ 6amey: BASH(1) (pginas de manuales de BASH v3!)$ 2$001$
2$ $ 6amey. 3$ Lo=: ABash "e#erence $anual% v!&'B$ Lree SoftQare Loundation. 2$002$
($ <iRe F. trad$ F$ 6odr2%ue- ,lboric": (rogramaci)n en BASH * +,$, de
-ntroducci)n$ 2$000$
4$ <$ ooper: Advanced Bash.Scripting /uide% v!1$ 0inu= 8ocumentation +roject.
2$00($
*$ 6$ <$ Fme- 0abrador: Administraci)n Avan0ada de Sistemas 1inu2 (33 edici)n)$
Secretariado de Lormacin del +,S !Universidad de Sevilla&. 2$004$
i$ +royecto FGU: "ttp:##QQQ$%nu$or%#
ii$ :"e 0inu= 8ocumentation +roject !:08+&: "ttp:##QQQ$tldp$or%#
iii$ +royecto 4ispa0inu= !08+)ES&: "ttp: ##QQQ$"ispalinu=$es#
(0

Вам также может понравиться