Sie sind auf Seite 1von 23

Introduccin al shell scripting

Si ya has practicado un poco con el shell bash, te habrs dado cuenta de que
se pueden hacer muchas cosas interesantes con l. Aunque hay veces, que
para conseguir determinado resultado necesitas introducir, por ejemplo, 3 o 4
comandos; o tenemos que evaluar una condicin manualmente !por ejemplo,
con ls comprobamos manualmente si un archivo e"iste#. $os scripts de shell
nos dan la posibilidad de automati%ar series de comandos y evaluciones de
condiciones.
&n script es como se llama a un archivo !o conjunto de archivos# que contiene
instrucciones !en nuestro caso comandos de bash#, y que necesita de un
programa ayudante para ejecutarse !en nuestro caso la propia terminal bash
ser el programa ayudante#. &n script tiene cierta similitud con un programa,
pero e"isten di'erencias. (eneralmente, los programas estn en lenguaje de
mquina !la mquina lo entiende directamente#, mientras que los scripts son
archivos que contienen en 'ormato te"to los comandos o instrucciones que la
aplicacin ayudante ejecutar.
Aunque en principio esto puede resultar un tanto abstracto, vamos a verlo
despacio y con ejemplos. Si no has programado nunca, en este cap)tulo
encontrars el aprendi%aje del shell*scripting en bash como una sencilla
introduccin a la programacin, que te ayudar a comprender despus los
'undamentos de otros lenguajes de programacin. +o te preocupes, porque lo
vamos a e"plicar todo de 'orma sencilla y no te quedar ninguna duda.
Nuestro primer script en bash
Ahora que has practicado con bash y con el editor vim, ya ests preparado
para crear tu primer script bash. Si recordamos, un script era un archivo de
te"to plano con comandos; as) que ha% vim miscript.sh y pon en l lo siguiente
!lo e"plicaremos detenidamente a continuacin#,
-./bin/bash
- 0sta l)nea ser ignorada
- 0sta tambin
echo 12ola1
echo 1Soy un script de shell.1
3omo ya sabemos, la e"tensin en los archivos en $inu" no tiene signi'icado
4til. 0s por convenio general, por lo que a los scripts de shell se les llama con la
e"tensin 1.sh1 !de S2ell#. 5e este modo identi'icaremos 'cilmente nuestros
scripts entre el resto de archivos de un directorio.
6bservemos la primera l)nea, -./bin/bash. 0sta l)nea es un tanto especial, y es
caracter)stica de todos los scripts en $inu", no solamente los de bash. 7ras -.
indicamos la ruta a la aplicacin ayudante, la que interpretar los comandos del
archivo. 0n nuestro caso es bash, as) que ponemos ah) /bin/bash, que es la ruta
hacia la aplicacin bash. 3omo ms adelante tendrs tiempo de descubrir, hay
otros tipos de scripts !8erl, 8ython, 828...# para los cuales deberemos indicar
la aplicacin ayudante correspondiente.
3omo ves, no importa que pongamos l)neas en blanco, pues sern ignoradas.
8odemos ponerlas despus de cada bloque de comandos que tengan cierta
relacin, para dar claridad y legibilidad al conjunto de comandos del script.
$as dos siguientes l)neas comien%an por el carcter -. 0n los scripts de bash,
las l)neas que comien%an con este signo son ignoradas, y se llaman
comentarios. 8odemos usarlas para e"plicar qu hace el grupo de comandos
siguiente, de tal 'orma que cuando editemos el script en el 'uturo nos sea ms
'cil descubrir qu es lo que est haciendo en cada sitio; o podemos usarlos
para dar cualquier otra in'ormacin importante de cara a la edicin del archivo.
9eremos ms ejemplos de la utilidad de los comentarios despus.
$as dos 4ltimas l)neas son dos comandos, de los que luego sern ejecutados
por bash. 3omo sabemos, el comando echo saca por stdout !por de'ecto por
pantalla# lo que le pasemos como argumento, en este caso dos 'rases.
8odemos a:adir cualquier comando normal de los que hemos visto, que ser
ejecutado normalmente. 5espus escribiremos algunos scripts ms complejos,
para que te hagas una idea de para cunto pueden servirnos.
(uardemos el script y salgamos de vim. !;s in'ormacin, 3ap)tulo 4, VIM
bsico#. Ahora lo ejecutaremos. $a primera 'orma de hacerlo es como sigue,
< bash miscript.sh
2ola
Soy un script de shell
3omo ves, todos los comandos del script han sido ejecutados. Aunque la 'orma
ms 'recuente de ejecutar scripts es, darles primero permisos de ejecucin,
como ya sabemos del cap)tulo de usuarios, grupos y permisos,
< chmod +x miscript.sh
< ./miscript.sh
2ola
Soy un script de shell
Al darle permisos de ejecucin, podemos ejecutar ahora nuestro script como si
de un programa normal se tratase. 0sto es posible gracias a la primera l)nea
del script, que hace que se llame inmediatamente a la aplicacin ayudante para
procesar los comandos. 2emos podido observar que a nivel del shell, nuestro
script es un programa como otro cualquiera, que podemos ejecutar e incluso
ponerlo en alg4n directorio listado en la variable de entorno <8A72, como por
ejemplo /usr/local/bin y ejecutarlo como si de un programa del sistema se tratase,
simplemente tecleando su nombre. 3reo que ya te vas imaginando la gran
utilidad de los scripts de shell...
Variables
=ecordamos que una variable es un nombre al que le hacemos corresponder
un valor. 0ste valor puede ser un valor numrico o bien una cadena de te"to
indistintamente en los scripts de shell. $os nombres de las variables conviene
que comiencen por una letra, despus veremos por qu.
0n el siguiente ejemplo aprenderemos a usar las variables en nuestros scripts,
-./bin/bash
- Script de muestra del uso de las variables
- Asignacin de una variable,
-
variable>?
otravariable>@A
tercera>B
resultado@><C?D@A/BE
resultadoB><C<variableD<otravariable/<terceraE
echo 1 1
echo 10l resultado de ?D@A/B es <resultado@ ,1
echo 1que e'ectivamente coincide con <resultadoB 1
echo 1 1
'rase>1Fntrodu%ca lo que usted quiera,1
echo <'rase
read entradaGdelGusuario
echo 1 1
echo 1&sted introdujo, <entradaGdelGusuario1
e"it A
=epasemos el ejemplo despacio. 0n primer lugar tenemos la l)nea que ser
siempre la primera en nuestros scripts, y que ya conocemos, la que dice cul
es el programa que ejecutar las instrucciones del script.
Siguiendo tenemos la asignacin de algunas variables, esto es, estamos dando
valor a algunas variables que luego usaremos. 6bserva que entre el nombre y
el valor, +6 2AH 0S8A3F6S, es variable>valor. 8rocura recordarlo. Ahora cada
variable tiene el valor que le hemos asignado. 8odr)amos cambiarlo
simplemente de la misma 'orma, pero poniendo otro valor distinto, que
sobreescribir)a a cualquiera que tuviese antes la variable. As), tercera=7 har)a
que el valor de la variable tercera 'uese de ah) en adelante I.
5espus nos encontramos con el comando <C E, que nos permite hacer
operaciones aritmticas, obteniendo el resultado. 5espus veremos ms
detenidamente el hecho de que un comando 509&0$9A un valor. 5e momento
trata de comprender este ejemplo. 0n la primera de esas l)neas, la variable
resultado@ se queda con el valor resultante de e'ectuar la operacin entre los
n4meros. 0n la l)nea siguiente, vemos que para =0J0=F=+6S al valor que
tiene una variable, colocamos delante de su nombre el signo <. 5ondequiera
que pongamos ese signo delante del nombre de una variable, todo ello ser
reempla%ado por el valor de la variable. As), la e"presin que se eval4a al 'inal
es la misma que la de la l)nea anterior, pues todas las variables quedan
sustituidas por sus valores reales antes de que se haga la operacin. 3omo
ves, es bastante sencillo.
0n las l)neas siguientes usamos el ya conocido comando echo. 0s muy
conveniente que en nuestros scripts pongamos entre comillas lo que echo debe
sacar por pantalla. As), en la primera l)nea tenemos una 'orma sencilla posible
para generar una l)nea en blanco en la salida, como podremos apreciar cuando
despus ejecutemos el script. 3omo ves, dentro de las comillas del argumento
de echo, podemos hacer que apare%ca el valor de una variable procediendo
como ya hemos aprendido. 0l comando echo ser nuestro mejor aliado para
hacer que nuestro script saque in'ormacin por la pantalla.
A la variable 'rase le vamos a asignar una cadena de te"to. 5ate cuenta de que
esta ve% tampoco hay espacios en medio de la asignacin y que 0$ 70K76 9A
SF0;8=0 0+7=0 36;F$$AS, pudiendo ser simples o dobles. $a estructura es
entonces variable>1te"to1. 0n la l)nea siguiente, con el comando echo de nuevo,
podemos sacar por pantalla el te"to que hab)amos guardado en la variable.
Atencin a la l)nea siguiente. 0l comando read va a ser nuestra v)a de
comunicacin con el usuario en nuestros scripts. Junciona de este modo,
primero, ponemos read, el comando que hace todo el trabajo, y a continuacin,
ponemos el nombre de la variable donde queremos que la entrada del usuario
quede almacenada !en nuestro caso, la variable es entradaGdelGusuario#. 3uando
a la hora de ejecutarse, el script llegue a esa l)nea, esperar a que el usuario
escriba algo y presione la tecla F+7=6. 0n ese momento, lo que el usuario
escribi antes de de presionar F+7=6 quedar guardado en la variable, y luego
podremos hacer uso de estos datos que el usuario introdujo, como hacemos en
la l)nea siguiente, sacarlos de nuevo por pantalla.
8or 4ltimo tenemos el comando e"it. 0ste comando al 'inal del script no es
especialmente 4til, pero si pusisemos cualquier cosa debajo de l ya no ser)a
ejecutada. $o usaremos despus cuando queramos que 1si se da tal condicin,
entonces que el programa !script# termine1.
8ara terminar de comprender este segundo script de ejemplo, ponlo en un
'ichero llamado, por ejemplo, variables.sh con el editor vim. 5ale permisos de
ejecucin como hicimos antes y despus ejec4talo,
< ./variables.sh
0l resultado de ?D@A/B es B? ,
que e'ectivamente coincide con B?

Fntrodu%ca lo que usted quiera,
Yo tecleo esta frase
&sted introdujo, Ho tecleo esta 'rase.
2acer scripts de shell no es di')cil, pero tampoco se nace sabiendo escribirlos.
3omo habrs podido adivinar, la mejor 'orma de aprender a escribir scripts es...
Lescribiendo scripts. As) que deber)as considerar crearte los tuyos propios con
los conceptos que hemos aprendido y practicar as) para consolidarlos.
omandos posibles
&na duda que puede surgir es... Mqu comandos puedo escribir en mis scriptsN
M7engo alguna limitacinN
5e aqu) otra de las bondades de los scripts en bash, todos los comandos que
escribiremos en bash pueden escribirse en un script de bash; esto incluye
cualquier programa, redirecciones de entrada o salida, pipes, etc. &sando
comandos del sistema, podemos hacer que nuestros scripts hagan casi
cualquier cosa que nosotros queramos, y que se comporten como si de
complej)simos programas se trataran. 0sto es, para borrar un 'ichero dentro de
un script, simplemente necesitamos usar el comando rm, sin preocuparnos por
cmo 'unciona rm internamente. 3on los comandos que ahora conocemos,
nuestros scripts podrn, listar 'icheros o directorios, borrar, despreciar salidas,
buscar en cadenas de te"to, pedir datos al usuario e interpretarlos...
$o mejor, a parte de conseguir una secuencia automati%ada !no ser necesario
teclear todos los comandos que necesitemos para una determinada cosa todas
las veces; simplemente los escribiremos en un script y lo ejecutaremos con una
sola l)nea cada ve% que lo necesitemos#; es que podemos hacer que los
argumentos que le pasemos a un comando en el script sean variables. 8oco a
poco irs comprendiendo lo ventajoso de que los argumentos de los programas
que ejecutemos en nuestros scripts sean variables.
2acer notar una cosa. 3uando una de nuestras variables sea el argumento de
un programa, y si lo llamamos con muchos argumentos, es muy conveniente
para evitar errores e"tra:os, entrecomillar la variable,
;FG9A=FAO$0>/un/directorio
- +o muy adecuado,
ls *l <;FG9A=FAO$0
- Oastante mejor,
ls *l 1<;FG9A=FAO$01
3uidado, en este caso las comillas deben ser dobles.
7odav)a hay muchos comandos que no conocemos, pero cuando aprendas
algunos nuevos, recuerda que pueden servir para dar 'uncionalidades e"tra a
tus scripts.
oncepto de valor de retorno
3uando un programa termina de ejecutarse, devuelve o retorna un valor. 0n el
caso de los programas, el valor de retorno es un n4mero. 0l valor es cero !A# si
el programa 'inali% con "ito o distinto de cero si el programa no 'inali% con
"ito. 3ada uno de los valores distintos de cero va asociado a una causa
distinta !sabiendo este valor podr)amos saber por qu ra%n 'all el programa#,
pero puede que por ahora no lo necesites.
0l valor de retorno es un concepto un poco abstracto, pero no es di')cil de
comprender. 0l valor de retorno no se imprime por la pantalla, es decir, cuando
un programa termina no saca por pantalla un cero, pero nosotros podemos
saber cul es ese valor.
0n el shell bash !y por e"tensin, en nuestros scripts# el valor de retorno del
4ltimo programa o comando ejecutado queda almacenado en la variable
especial !" .
9eamos un ejemplo,
-./bin/bash
echo 1$istando archivo e"istente...1
ls archivoGe"istente
echo 10l valor de retorno 'ue, <N1
echo 1 1
echo 1$istando archivo ine"istente...1
ls archivoGine"istente
echo 10l valor de retorno 'ue, <N1
e"it
0n el primer caso, pedimos a ls que liste un archivo e"istente. $o lista con "ito
y por tanto el valor de retorno vale cero. 0n el segundo caso le pedimos que
liste un archivo ine"istente. 3omo eso no es posible, el comando no termina
con "ito y el valor de retorno es distinto de cero.
$a utilidad de conocer el valor de retorno al ejecutar un programa en nuestros
scripts salta a la vista, cuando veamos las sentencias condicionales podremos
hacer que el script haga una cosa u otra en 'uncin de si un programa termin
con "ito o no.
9olveremos a ver el valor de retorno cuando estudiemos las 'unciones.
#asar $ procesar argumentos
$os comandos que ejecutamos normalmente pueden recibir opciones y
argumentos !parmetros#, como por ejemplo ls %l ./ . 0n ese ejemplo, ls es el
comando, *l es una opcin y ./ es un argumento. 0n esta seccin veremos las
variables especiales que nos permitirn luego hacer que nuestros scripts se
comporten del mismo modo, que puedan recoger opciones y argumentos.
-./bin/bash
echo 1P<A contiene <A1
echo 1P<@ contiene <@1
echo 1P<B contiene <B1
echo 10n total hay <- parametros1
$lama a este script args.sh y dale permisos de ejecucin. Antes de ejecturalo
vamos a e"plicarlo.
0n primer lugar tenemos la barra invertida P . &saremos la barra invertida para
escapar caracteres especiales. Si queremos sacar por pantalla con el comando
echo unas comillas o un signo del dolar, la 4nica 'orma es anteponindole una
barra invertida, de otro modo ser)a interpretado como comillas de 'in de cadena
de te"to o como variable respectivamente.
$uego tenemos las variables <+, donde + es un n4mero natural, A, @, B, etc. <A
contiene el comando ejecutado, <@ el primer parmetro, <B el segundo
parmetro, y as) sucesivamente.
8or 4ltimo tenemos la variable especial <- . 0sta variable contiene un n4mero
entero, que vale el n4mero de parmetros que pasamos al script sin contar <A.
0jecutemos el script de dos 'ormas distintas para comprender todo esto,
< ./args.sh
<A contiene ./args.sh
<@ contiene
<B contiene
0n total hay A parametros
< ./args.sh buenos dias
<A contiene ./args.sh
<@ contiene buenos
<B contiene dias
0n total hay B parametros
0stas dos ejecuciones han debido servir para ilustrar cmo 'uncionan estas
variables especiales para recibir parmetros en nuestros scripts. 3on'orme
sigamos aprendiendo veremos cmo podemos hacer que nuestro script se
comporte de una 'orma u otra dependiendo de los parmetros que se le pasen.
3ada ve% ms, nuestros scripts se irn pareciendo a programas 1de los
buenos1.
7odav)a hay ms... puede que no se te ocurra cmo listar todos los parmetros
que se le pasen al script, sean cuantos sean. shift nos da la solucin. 2ay
algunas cosas que debemos saber antes de poder usar shi't para listar los
parmetros pasados a un script. +o obstante, hay un ejemplo en QJuncionesR,
que aplica tanto a 'unciones como al script en s) mismo.
Variable de proceso
Aunque todav)a no hemos visto los procesos, debemos hacer notar que
e"iste la variable especial <. . 0sta variable contiene el F5 de proceso del
4ltimo comando ejecutado. 7odo esto ser detallado en el cap)tulo de
procesos.
&valuacin de condiciones
;uchas veces nos ser necesario hacer que nuestro script se comporte de una
'orma u otra seg4n el usuario introdu%ca uno u otro argumento, o seg4n una
variable tenga tal o cual valor. 0n esta seccin pasamos a ver los comandos y
estructuras que nos permiten hacer esto.
0l comando que nos permite evaluar condiciones en bash es test. 0l valor de
retorno de test ser cero !A# si la expresin es 90=5A50=A !7=&0#, y en
cambio, ser uno !@# si la e"presin que le pasamos a test es JA$SA !JA$S0#.
$o que queremos evaluar recibe el nombre de 0K8=0SFS+. test recibe las
e"presiones de un modo un tanto especial. 0n el siguiente ejemplo
comprobamos si dos n4meros son iguales o no,
< test 7 %e' 7
< echo !"
A
< test 7 %e' (
< echo !"
@
8rimero, I *eq I es lo que se conoce como e"presin. 5e esta 'orma tan
peculiar al principio le decimos a test que compruebe si I es igual a I !*eq,
abreviatura de TequalsT, Tes igual aT#. As) que ese primer comando quiere decir,
M0s I igual a IN 3omo ves, test no ha producido ninguna salida por la pantalla,
sin embargo, si comprobamos su valor de retorno, vemos que es cero !A#, lo
cual indica que la e"presin es verdadera, I es igual a I, e'ectivamente.
0n el siguiente comando estamos comprobando si I es igual a U. 3omo era de
esperar, el valor de retorno de test es uno !@#, lo cual indica que la e"presin es
'alsa; I no es igual a U.
Ahora supn que antes de todos aquellos comandos hacemos,
< a=7
< b=(
< test !a %e' !a
- Aqui seguiriamos con las dos variables
y que repetimos todo lo anterior, pero en ve% de usar I y U, usamos las
variables <a y <b. +o hay cambios, test reempla%a las variables por su valor y
despus e'ect4a la comprobacin, siendo el resultado 'inal el mismo.
)ugerencia
8ara no tener que aprender de memoria la 'orma en que hay que
introducirle las e"presiones a test, puedes consultar las pginas del manual,
aunque todav)a no lo hemos descrito, man test
8uedes moverte con las 'lechas de direccin y volver al shell pulsando la
tecla q.
0ntonces, para ver cmo y qu otras cosas se pueden evaluar con test, es muy
recomendable seguir el consejo arriba e"puesto.
0"iste adems otra 'orma de llamar a test que no es con el comando, y que en
nuestros scripts puede ayudarnos a que con un slo golpe de vista nos demos
cuenta de qu es la e"presin que se evalua. 0sta otra 'orma consiste en poner
entre corchetes !y con espacio# la e"presin a evaluar,
< * + %gt , -
< echo !"
A
&structuras condicionales con if
2emos visto cmo evaluar condiciones con test. 3on la ayuda de las
estructuras condicionales que crearemos con i' y lo que ya hemos aprendido,
podremos por 'in hacer que nuestros scripts se comporten de una 'orma u otra
seg4n las condiciones que nosotros especi'iquemos.
$as estructuras condicionales tienen este aspecto,
i' 0K8=0SF6+@; then
- Oloque @
eli' 0K8=0SF6+B; then
- Oloque B
else
- Oloque 3
'i
0ste es el modelo ms general con todas las opciones posibles. Si el valor de
retorno de 0K8=0SF6+@ es cero, las l)neas de comandos de 1Oloque @1 sern
ejecutadas. 0l resto del bloque i' ser ignorado en ese caso.
Si el valor de retorno de 0K8=0SF6+@ no es cero, pero el de 0K8=0SF6+B s)
que es cero, entonces el 1Oloque @1 no ser ejecutado, mientras que el 1Oloque
B1 s) que ser ejecutado. 0l 1Oloque 31 ser ignorado. 8odemos poner tantos
eli'Ts como necesitemos.
Si ni 0K8=0SF6+@ ni 0K8=0SF6+B ni cualquier otra de otros eli'Ts que
pongamos retornan cero, entonces el 1Oloque 31 ser ejecutado.
&samos 'i para terminar la estructura condicional.
3omo habrs supuesto, las 0K8=0SF6+es son comandos con test. 9eamos un
ejemplo sencillo,
-./bin/bash
echo 1Fntrdu%ca un numero, 1
read input
i' C <input *lt ? E; then
echo 10l numero era menor que ?1
eli' C <input *eq ? E; then
echo 10l numero era ?1
eli' C <input *gt ? E; then
echo 10l numero era mayor que ?1
else
echo 1+o intrudujo un numero1
'i
0n este sencillo ejemplo hacemos que el usuario introdu%ca un n4mero que
queda guardado en la variable <input. 5ependiendo de si el n4mero es menor,
igual o mayor que ?, el script se comporta de una 'orma u otra !podemos a:adir
ms l)neas de comandos despus de los echoTs que aparecen ah)#. Si el usuario
no introduce nada o introduce una cadena de te"to, lo que hay tras else es lo
que ser ejecutado, pues ninguna de las condiciones anteriores se cumple.
5ate cuenta que en las e"presiones entre corchetes podr)an haberse
sustituidos estos corchetes por test.
5e todos modos, los eli' y los else son opcionales, podemos crear una
estructura condicional sin ellos si no los necesitamos. 3omo muestra, el
siguiente ejemplo,
-./bin/bash
i' C <- *ne B E; then
echo 1+ecesito dos argumentos, el primero1
echo 1es el 'ichero donde debo buscar y1
echo 1el segundo es lo que quieres que1
echo 1busque.1
echo 1 1
echo 1&so, <A V'icheroW VpatronGbusquedaW1
echo 1 1
e"it
'i
JF320=6><@
O&SX&05A><B
i' C . *e <JF320=6 E; then
echo 10l 'ichero no e"iste1
e"it
'i
+&;G9030S>Ycat 1<JF320=61 Z grep **count 1<O&SX&05A1Y
i' C <+&;G9030S *eq A E; then
echo 10l patron de busqueda P1<O&SX&05AP1 no 'ue encontrado1
echo 1en el 'ichero <JF320=6 1
else
echo 10l patron de busqueda P1<O&SX&05AP1 'ue encontrado1
echo 1en el 'ichero <JF320=6 <+&;G9030S veces1
'i
0ste ejemplo ya se va pareciendo a un programa de los buenos. 0studimoslo
en detalle,
0n primer lugar comprobamos que nos han pasado dos argumentos, el 'ichero
donde buscar y la cadena de b4squeda. Si no es as), le indicamos al usuario
cmo debe ejecutar el script y salimos.
A continuacin comprobamos que el 'ichero e"iste. Si no es as), advertimos
convenientemente y salimos.
Ahora viene la l)nea que hace todo el trabajo, +&;G9030S>Ycat 1<JF320=61 Z grep
**count 1<O&SX&05A1Y Al entrecomillar con las comillas inclinadas el comando, su
salida, en ve% de salir por pantalla, quedar guardada en la variable
+&;G9030S. As), mediante cat y el pipe, grep cuenta el n4mero de veces que
el valor de <O&SX&05A est en el 'ichero, que nos queda guardado en
<+&;G9030S.
$o siguiente habla por s) solo.
3oloca esas l)neas en un script y dale permisos de ejecucin. A continuacin,
ejec4talo de las distintas 'ormas posibles, sin argumentos, con un 'ichero
ine"istente, con distintos patrones de b4squeda, etc.
5entro de un bloque de una estructura condicional puedes poner otra !i's
anidados#, y dentro de esa otra puedes poner otra y as) sucesivamente.
7ambin podrs poner cuando las veamos, bucles y otras estructuras, as) como
condicionales dentro de bucles, etc. Slo la prctica te dar la su'iciente soltura
como para poder hacer que tus scripts hagan autnticas virguer)as. L$a prctica
hace al maestro.
omprobar el valor de una variable con case
0scribiendo scripts, es muchas veces necesario comprobar si el valor de una
variable coincide con alguno de los que nosotros estbamos esperando, y si
as) es, actuar de una 'orma u otra dependiendo de este valor.
+i que decir tiene que eso es posible hacerlo con i', y elsei', pero e"iste otra
'orma ms e'iciente y cmoda de hacer esto, con la estructura case. Se usa
como sigue,
-./bin/bash
case <9A=FAO$0 in
valor@#
- Oloque @
;;
valorB#
- Oloque B
;;
.
.
.
.
D#
- &ltimo Oloque
;;
esac
valor@ y valorB son valores que nosotros esperamos que la variable pueda
contener, y Oloque @ y Oloque B son los bloques de comandos con lo que
queremos que se haga en cada caso. 8odemos poner tantos valores
reconocibles como queramos. $os puntos son precisamente para indicar
aquello. 0l D !asterisco# es un comodn e"actamete igual que hac)amos
moviendonos entre directorios en cap)tulos anteriores, cualquier cosa que no
haya coincidido en alguna de las de arriba coincidir aqu). 0sto es
completamente opcional. +o obstante, en el ejemplo siguiente te dars cuenta
de su utilidad.
$os dos 1;;1 es necesario que se pongan al 'inal de cada opcin.
-./bin/bash
- caseGarg.sh
i' C <- *lt @ E; then
echo 10rror. 0speraba al menos un parametro1
e"it @
'i
case <@ in
**opcion@#
echo 1**opcion@ es una opcion reconocida1
e"it A
;;
**opcionB#
echo 1**opcionB es una opcion posible1
e"it A
;;
linu"#
echo 1P1linu"P1 es un argumento reconocido1
e"it A
;;
D#
echo 18arametro no reconocido1
e"it @
;;
esac
0n este ejemplo se hace que las opciones tengan que ir precedidas de un
doble guin en 'orma larga !la 4nica que reconoceremos en este caso#, de esta
'orma damos a nuestro script un aspecto y un comportamiento ms
1pro'esional1. $os argumentos no se suelen hacer preceder de ning4n signo;
aunque todo esto puedes ponerlo como t4 pre'ieras, lo importante es que
aprecies cmo 'unciona este tipo de estructura condicional.
3on e"it salimos del script, haciendo que el valor devuelto sea A !"ito# o @
!error# seg4n los parmetros 'ueran reconocidos o no.
5entro de cada uno de los bloques de comandos se pueden poner estructuras
condicionales con i', o incluso otro case.
.ucles
$os bucles en bash*scripting di'ieren un poco de lo que son en la mayor)a de
los lenguajes de programacin, pero vienen a cumplir una misin similar; a
solucionar el problema de 1Xuiero que mi script haga esto mientras se de esta
condicin1, o 18ara cada uno de los elementos siguientes, quiero que mi script
haga esto otro1.
As), tenemos dos tipos de bucles di'erentes en bash, 'or y [hile.
.ucles con for
5e los propsitos e"plicados anteriormente a solucionar por los bucles, 'or
viene a solucionar el segundo. 9eamos algunos ejemplos,
< for i in pedro pepe /uan /ose0 do
W echo 12ola !i1
W done
2ola pedro
2ola pepe
2ola juan
2oja jose
0n primer lugar apreciamos que todo lo que se puede hacer en un script
tambin se puede hacer en bash. $a estructura de 'or es la siguiente,
'or nombre3var in 4I)56 ; do
comando 7
comando ,
- H asi los que queramos
done
nombre3var es el nombre de una variable !el que nosotros queramos, y slo el
nombre, no precedida de <#. 4I)56 es una lista de elementos, que se la
podemos dar como en el ejemplo anterior, ah) en ese comando, o podemos
poner una variable que ya contenga una lista de elementos !en este caso s)
que la preceder)amos de <, para que sea reempla%ada por los elementos de la
lista que contiene#. 5espus aprenderemos otras 'ormas posibles de e"presar
esa lista.
3on este bucle lo que conseguimos es, comando 7, comando ,, etc. se ejecutan
tantas veces como elementos haya en $FS7A. 8ara la primera ve%, <nombreGvar
valdr el primer elemento de la lista, para la segunda ve% que se ejecuten los
comandos valdr el segundo elemento de la lista, y asi sucesivamente hasta
llegar al 4ltimo elemento en el que el bucle habr terminado !y el script seguir
su 'lujo de ejecucin normal hacia abajo#. Ahora ya deber)amos entender el
ejemplo anterior.
4I)56 puede ser una lista de archivos dada impl)citamente. ;s concretamente,
podemos usar los wildcards que ya conocemos para re'erirnos a varios
archivos con un nombre parecido,
-./bin/bash
- $istador de archivos y directorios ocultos
5F=><@
i' C *% <5F= E; then
echo 10l primer argumento debe ser un directorio1
e"it @
'i
i' C . *d <5F= E; then
echo 10l directorio debe e"istir1
e"it @
'i
'or i in <5F=/.D; do
echo 10ncontr el elemento oculto <i1
done
echo 1Saliendo...1
.D hace re'erencia a todos los archivos y directorios ocultos de <5F=. Al detectar
'or el [ildcard, sabr que los elementos de la lista son cada uno de los archivos
coincidentes. 0jecuta el ejemplo anterior si quieres ver cmo 'unciona. 8uedes
hacer uso con este bucle de lo que ya sabes de [ildcards re'eridos a archivos.
0l elemento 4I)56 del bucle 'or, puede ser un comando entrecomillado con
comillas laterales; un comando tal que su salida sea una lista de elementos.
As), ser)a lo mismo,
'or i in D; do
que,
'or i in YlsY; do
.ucles con while
0l otro tipo de bucle posible en bash*scripting es el bucle [hile. 0ste bucle viene
a cumplir con el propsito de 1quiero que se haga esto mientras que se d esta
condicin1. Su estructura es la siguiente,
[hile test 36+5F3F6+; do
- 3omandos a ejecutar
done
3omo ya sabemos usar el bucle anterior, este lo entenderemos con algunos
pocos ejemplos,
-./bin/bash
j>A
[hile C <j *lt @A E; do
echo 1j vale <j1
j><C<j\@E
done
- Aqui sigue el 'lujo de ejecucion normal del script
0ste ejemplo es interesante. $a condicin para que el bucle se siga ejecutando
es que j valga menos de @A. 6bserva la 'orma mediante la cual en cada ciclo
del bucle sumamos @ a la variable j.
7anto en el bucle 'or como en el [hile, podemos usar brea8 para indicar que
queremos salir del bucle en cualquier momento,
-./bin/bash
;F+&;>U
[hile C @ E; do
echo 1Fntrodu%ca un n4mero, 1
read &S0=G+&;
i' C <&S0=G+&; *lt <;F+&; E; then
echo 10l n4mero intrododucido es menor que el m)o1
echo 1 1
eli' C <&S0=G+&; *gt <;F+&; E; then
echo 10l n4mero introducido es mayor que el m)o1
echo 1 1
eli' C <&S0=G+&; *eq <;F+&; E; then
echo 1Acertaste, ;i n4mero era <;F+&;1
brea]
'i
done
- 3omandos in'eriores...
echo 10l script sali del bucle. 7erminando...1
e"it
$a condicin es que el bucle se ejecute siempre !test @ siempre retornar
7=&0, y el bucle se seguir ejecutando#. 8ero, si el n4mero introducido es el
mismo que el valor de <;F+&; , brea] har que se salga de el bucle y contin4e
ejecutando los comandos in'eriores.
7en en cuenta que en bash scripting, usando la notacin <C E para hacer clculos
slo podemos usar n4meros enteros.
Adems, dentro de un bucle [hile se puede utili%ar cualquiera de los elementos
ya conocidos, siempre que se haga correctamente.
9unciones
Si bien las 'unciones en bash scripting di'ieren de lo que son en la mayor)a de
los lenguajes de programacin, s) comparten, en cambio, su ra%n de ser
bsica.
&na funcin en un script es un conjunto de l)neas !comandos# a los que se les
da un nombre especial y pueden ser ejecutados desde cualquier punto del
script mediante el uso de ese nombre especial.
+o se considera una buena prctica repetir en distintos sitios las mismas l)neas
de cdigo. As), se agrupan en una 'uncin, y $$A;A+56 a la 'uncin por su
nombre, esas l)neas son ejecutadas dondequiera que la llamemos.
&na 'uncin se 50JF+0 de la siguiente 'orma,
'unction nombreGdeGlaG'uncion !# ^
-- Aqu) van los comandos que se
-- ejecutarn cuando llamemos a la
-- 'uncin
_
nombreGdeGlaG'uncion lo elegimos nosotros, y le podemos dar el nombre que
queramos, con las mismas condiciones que el nombre de una variable !no
espacios, no caracteres e"tra:os, etc.#. 0ntre las dos llaves !^ y _# se introducen
los comandos que se quiere que se ejecuten cuando la 'uncin sea llamada.
&n ejemplo sencillo podr)a ser el siguiente,
-./bin/bash
- 'unction@.sh
'unction uso !# ^
echo 10ste script recibe dos argumentos.1
echo 10l primero debe ser **opc@ u **opcB ,1
echo 1y el segundo debe ser un 'ichero e"istente.1
echo 1**1
_
i' C <- *ne B E; then
uso
e"it @
'i
case <@ in
**opc@#
i' C *e <B E; then
echo 10l script termin con "ito1
e"it A
else
uso
e"it @
'i
;;
**opcB#
i' C *e <B E; then
echo 10l script termin con "ito1
e"it A
else
uso
e"it @
'i
;;
D#
uso
e"it @
;;
esac
Se necesita de'inir la 'uncin antes de llamarla. Se llama a la 'uncin
simplemente con el nombre que le dimos; ese nombre se convierte en un
1comando posible1 que lo que hace es ejecutar las l)neas que hay dentro de la
'uncin.
5e no haber usado aqu) las 'unciones, tendr)amos que haber reescrito los echo
que dicen cmo se usa el script una y otra ve% en cada sitio donde los
hubisemos necesitado. ;ientras no se ejecute el script con los argumentos
adecuados, llamamos a la 'uncin uso que e"plica al usuario cmo se debe
llamar el script. 0sta estrategia es muy 'recuente y 4til en scripts ms
complejos con muchas opciones.
8odemos de'inir tantas 'unciones como necesitemos, cada una con un nombre
distinto. Adems, al igual que los scripts desde la l)nea de comandos, las
'unciones pueden recibir parmetros, que se procesan de la misma 'orma, <@ <B
y dems se corresponden con el primer y el segundo parmetro pasado a la
'uncin respectivamente.
Al convertirse la 'uncin en un 1comando posible1 dentro del script, los
parmetros se le pasan igual que a cualquier otro comando,
-./bin/bash
'unction listaGparametros !# ^
echo 1Se ha llamado a listaGparametros, con <-1
echo 1parmetros. ;ostrando los parmetros,1
echo 1 1
b>I
numparms><-
local j>@
[hile C <j *le <numparms E; do
echo 10l parmetro <j contiene <@1
shi't
local j><C<j\@E
done
_
listaGparametros a b c d ds'a'd d
echo <b
echo <j
$a 'uncin listaGparametros en este ejemplo recibe varios parmetros del mismo
modo que cualquier otro comando dentro del script, y se procesan igual que ya
conocemos para los scripts.
Aqu) hacemos uso de shi't dentro de la 'uncin. $o que shi't hace es que <@
valga <B, que <B valga <3, etc. para as) recortar la lista de argumentos una
posicin quitando el primero de ellos. MXu conseguimosN 8ues es sencillo,
listamos todos los parmetros posibles, puesto que imprimimos el primero por
pantalla, luego el primero vale el segundo, que se imprime por pantalla, luego
el primero vale el tercero, que se vuelve a sacar por pantalla, y as) con tantos
como tengamos. shi't nos o'rece unas avan%adas posibilidades para procesar
argumentos. 0n este ejemplo lo hemos visto dentro de una 'uncin, pero todo
esto es tambin aplicable a un script en s) mismo, 'uera de una 'uncin.
8ara terminar con este ejemplo, nos 'ijamos en local j>..., esto signi'ica que la
variable <j slo e"iste dentro de la 'uncin, de hecho, cuando hacemos echo <j
'uera de la 'uncin, no obtenemos ning4n valor. $a variable <b, al no ser
503$A=A5A 50 `;OF76 $63A$, sino ($6OA$, e"iste dentro de la 'uncin y
'uera de ella, como se puede apreciar ejecutando el script. 3ualquier otra
variable con valor en el 'lujo principal del script e"iste dentro de las 'unciones
que de'inamos.
2emos dicho que cada 'uncin se convierte en una especie de 1comando
posible1 dentro del script donde est de'inida. 3omo si de un comando se
tratase, y al igual que hac)amos con e"it A o e"it @ en el 'lujo principal del script,
podemos hacer que la llamada a una 'uncin genere un valor de retorno de
"ito o bien de error. $o conseguimos con el comando return. Se usa
e"actamente igual que e"it en el script, pero usaremos return dentro de las
'unciones.
&sar las 'unciones en nuestros scripts nos d amplias posibilidades en el
sentido de reducir el tama:o de stos, y que sean ms 'ciles de interpretar si
pasado un tiempo debemos estudiarlos y modi'icarlos. Adems, otra ventaja de
usar 'unciones para l)neas que se repiten es que si no lo hicisemos y
quisiramos modi'icar el comportamiento de esas l)neas, deber)amos hacerlo
en todos y cada uno de los sitios donde las hubisemos puesto. 3on las
'unciones, si modi'icamos las l)neas de la 'uncin, ya queda modi'icada en
todos los sitios.
onclusiones
=ecuerda la utilidad de los scripts a la hora de automati%ar tareas que tengan
que hacerse 'recuentemente; es mejor hacer un script que teclear todos los
comandos necesarios cada ve% que lo necesitemos.
9icheros asociados
2emos estado viendo cmo personali%ar algunos aspectos de bash pero sin
embargo hasta ahora los perder)amos al salir de la terminal. Oash lee algunos
'icheros en cada inicio. 0n estos 'icheros podremos colocar variables y alias
para no tener que cambiarlos cada ve%.
Antes necesitamos saber lo que es un shell de entrada o login y un shell
interactivo. &n shell de entrada es el que obtenemos tras hacer login en el
sistema en la consola, y un shell interactivo es el que obtenemos, si estamos
en modo gr'ico y abrimos un xterm, o sea, una ventana de terminal.
8ara los shells de entrada o de login, primero se lee el 'ichero /etc/pro'ile que
contiene de'iniciones de variables y alias comunes a todos los usuarios del
sistema. A continuacin se lee el 'ichero a/.bashGpro'ile, en el directorio de cada
usuario. 0n este 'ichero, cada usuario de'ine sus variales y alias, que
sobreescriben a los de /etc/pro'ile.
8ara los shells interactivos, slo se lee el 'ichero a/.bashrc, distinto para cada
usuario. 8uesto que generalmente no se quiere una con'iguracin distinta en
un "term o en una terminal de login, es bastante com4n poner las de'iniciones
de variables y alias en a/.bashGpro'ile, y que a/.bashrc se pare%ca a,
i' C *' /etc/pro'ile E; then
. /etc/pro'ile
'i
i' C *' /etc/bashrc E; then
. /etc/bashrc
'i
source a/.bashGpro'ile
source interpreta el archivo que se le pasa como primer argumento como
rdenes de bash. 0s prcticamente equivalente al punto .
#rocesos. )e:ales.

Das könnte Ihnen auch gefallen