Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programar en Bash Practica PDF
Programar en Bash Practica PDF
con
bash
1
ndicedecontenidos
1. Primer contacto Pg. 3
2. Desvo de la salida y la entrada de los comandos Pg. 3
3. Nombres de ficheros y metacaracteres Pg. 5
4. Comillas y caracteres de escape Pg. 6
5. Tuberas de comunicacin: pipes Pg. 6
6. Sustitucin de comandos por su salida Pg. 7
7. Secuencias de comandos Pg. 8
8. Expresiones Pg. 9
8.1. Variables Pg. 9
8.2. Variables especiales Pg. 13
8.3. Expresiones aritmticas Pg. 14
8.4. El comando test Pg. 16
9. Rutinas Pg. 17
9.1. Algo ms sobre los parmetros Pg. 18
9.2. Valor de retorno Pg. 20
9.3. Variables locales Pg. 21
9.4. Bibliotecas de rutinas Pg. 22
10. Sentencias de control Pg. 22
10.1. case ... in ... esac Pg. 23
10.2. if ... then ... fi Pg. 23
10.3. for ... do ... done Pg. 24
10.4. while ... done Pg. 25
10.5. until ... done Pg.
256
2
Un shell es un programa a medio camino entre el usuario y el sistema operativo. En
UNIX hay multitud de shells, pero quiz uno de los ms frecuentes es el BourneShell y su
mejora BourneAgainShell(bash). Cada uno de los shells que existen tienen
particularidades que lo hacen nico, pero tambin muchas similitudes que nos permiten, una
vez aprendido uno, trabajar con los dems sin demasiados problemas. En nuestro caso,
trabajaremos con el BourneAgainShell(bash), ya que es el shell que trae Guadalinex por
defecto.
El desarrollo de esta unidad didctica o leccin est pensado para personas que han
tenido contacto con algn tipo de lenguaje de programacin y que conoce los conceptos de
variable, rutina, sentencia de control, mbitos locales de declaracin de identificadores, etc.
1. Primercontacto
En el momento en el que una persona obtiene una cuenta en una mquina UNIX, el
administrador le asigna una shell de trabajo que ser el que le dar la bienvenida cada vez
que inicie una sesin en esa mquina.
Para averiguar cul es el shell de trabajo que le ha asignado su administrador tan slo
tiene que ejecutar en el terminal el siguiente comando que muestra en pantalla el contenido
de la variable $SHELL. Esta es la variable es la que el sistema utiliza de forma estndar para
guardar el nombre del shell de trabajo.
$echo$SHELL
3
permitirn ilustrar cada uno de los conceptos estudiados. En algunos de ellos al final de
algunas lneas aparece un texto en castellano precedido del smbolo #. Se trata de
comentarios que bashshell ignora por completo.
2. Desvodelasalidaylaentradadeloscomandos
El bashshell permite desviar la entrada y la salida de todos los comandos de forma
que estos puedan leer o escribir sus datos en un fichero, en la pantalla, en una lnea de
comunicaciones o en cualquier otro dispositivo sin que sea preciso cambiar una sola lnea
del cdigo fuente.
Para desviar, por ejemplo, la salida del comando ls a un fichero llamado lst basta
con teclear el siguiente comando:
$lsF>lst
Este comando crea primero el fichero lst y a continuacin ejecuta ls, pero
desviando toda la salida que produzca hacia este fichero. Tambin es posible desviar la
salida de un comando aadindola a un fichero ya existente. Por ejemplo, si quisiramos
aadir al fichero anterior la frase "estos eran mis ficheros", bastara con teclear el siguiente
comando:
$echo"estoseranmisficheros">>lst
$catlst
a.cb.cbuf.ccopia/f1.datf2.datf3.dat
estoseranmisficheros
$mailjuan<lst
Tambin es posible desviar la entrada usando el smbolo <<, pero en este caso el
resultado es diferente. Cuando tecleamos un comando de la forma
$cmd<<palabra
El shell crea un fichero temporal en el que introduce todas las lneas que lea de la
4
entrada estndar hasta encontrar una que contenga tan slo la palabra indicada. A
continuacin ejecuta el comando desviando su entrada a travs ese fichero temporal. En
cierto modo, algo como
$mailjuan<<fin
HolaJuan,teheenviadoellistadodemisficheros
fin
$echo"HolaJuan,teheenviadoellistadodemisficheros">tmp
$mailjuan<tmp
$rmtmp
Este tipo de desvo se utiliza de forma casi exclusiva en los programas que
construyamos en el lenguaje del shell. En sesiones interactivas prcticamente no se utiliza.
3. Nombresdeficherosymetacaracteres
Todos los shell de UNIX permiten el uso de metacaracteres para representar de forma
simplificada conjuntos ms o menos amplios de nombres de ficheros cuyos nombres
encajan en un cierto patrn. A continuacin se muestran los cuatro metacaracteres
existentes:
$lsFR
a.cb.cbuf.ccopia/f1.datf2.datf3.dat
./copia:
a.cb.cbuf.cf1.datf2.datf3.dat
$#ficheroscuyonombreterminanen.c
$ls*.c
a.cb.cbuf.c
5
$#ficheros.ccuyonombrebasetieneuncarcter
$ls?.c
a.cb.c
$#ficheroscuyonombreincluyealmenosundgito
$ls*[09]*
f1.datf2.datf3.dat
$#ficheros.cconnombrebasedeuncarcterbajoeldirectorioactual
$ls*/?.c
copia/a.ccopia/b.c
$#ficheroscuyonombretienetrescaracteresyelcentralesunpunto
$#eneldirectorioactualyenlosinmediatamenteinferiores
$ls?.?*/?.?
a.cb.ccopia/a.ccopia/b.c
En el ejemplo hemos mostrado diversos usos de los patrones con el comando ls,
pero se pueden utilizar casi en cualquier lugar y siempre que el shell los encuentra los
sustituye de forma automtica por la lista completa de nombres de ficheros que encajan en
el mismo. Por ejemplo:
$echo"Estossonlosficherosdemidirectorio:"*
Estossonlosficherosdemidirectorio:a.cb.cc.c
4. Comillasycaracteresdeescape
Tal y como hemos podido ver hasta ahora, el shell reserva para uso propio ciertos
caracteres. Algunos de ellos son poco comunes en la escritura, pero otros son de uso
frecuente y se necesita del algn mecanismo que nos permita impedir al shell los interprete
con su significado especial.
$ls
f.datmain.c
$echo$SHELL*
$SHELL*
$echo"$SHELL*"
/bin/bash*
$echo$SHELL*
/bin/basha.cb.cbuf.ccopiaf1.datf2.datf3.dat
6
Las comillas permiten delimitar una cadena de texto. Si tan slo queremos interpretar
literalmente un carcter podemos precederlo de una barra invertida.
$ls
f.datmain.c
$echo\$SHELL\*
$SHELL*
$echo"\$SHELL\*"
$SHELL*
$echo$SHELL*
/bin/basha.cb.cbuf.ccopiaf1.datf2.datf3.dat
5. Tuberasycomunicaciones:pipes
Situaciones en las que la salida de un comando se utiliza como la entrada de otro son
muy frecuentes en la prctica. Por ejemplo, supongamos que deseamos obtener un listado
ordenado alfabticamente con informacin acerca de todos los usuarios conectados
actualmente en la mquina. Sabemos que el comando who permite obtener la informacin
acerca de los usuarios conectados y que sort puede ordenarla alfabticamente. Una
posible solucin es:
$who>tmp
$sort<tmp
usuario1:0Sep0919:53
usuario2:1Sep0915:45
$rmtmp
En este caso hemos usado el fichero tmp para guardar de forma temporal la
informacin proporcionada por who antes de usar el comando sort. Una forma simplificada
de hacer esto es usar tuberas, tal y como se muestra a continuacin:
$who|sort
usuario1:0Sep0919:53
usuario2:1Sep0915:45
Uno de los problemas de las tuberas es que el usuario no puede observar cul es la
informacin que corre a travs de ellas. Para conseguirlo se puede usar el comandoteef
que toma su entrada estndar y la vuelca en un fichero de nombre f al mismo tiempo que en
su salida estndar. De esta forma, el comando:
$who|teewho.txt|sort
7
usuario1:0Sep0919:53
usuario2:1Sep0915:45
$catwho.txt
usuario2:1Sep0915:45
usuario1:0Sep0919:53
6. Sustitucindecomandosporsusalida
Las tuberas nos proporcionan un mecanismo sencillo para utilizar la salida de un
comando como entrada de otro. Pero existen multitud de ocasiones en las que lo que
realmente necesitamos es usar la salida de uno o varios comandos como parmetros para
ejecutar otro comando, no como su entrada estndar.
Por ejemplo:
$echoLafechadehoyesdate
Lafechadehoyesviesep0920:08:54CEST2005
El comando date se ha ejecutado entre tildes graves, por lo que todo aquello que
produzca en su salida estndar es capturado y colocado en su lugar.
$echoHoyesdateyhaywho|wclusuarios
Hoyesviesep0920:08:54CEST2005yhay2usuarios
Este tipo de sustituciones resultan muy potentes y tiles en multitud de ocasiones. Por
ejemplo, si quisiramos editar todos aquellos ficheros .txt que contengan la palabra fecha
bastara con ejecutar el siguiente comando:
$vigreplfecha*.txt
8
fecha. Por lo tanto, escribir este comando es equivalente a escribir detrs de vi los nombres
de todos esos ficheros.
7. Secuenciasdecomandos
Para ejecutar varios comandos uno detrs de otro, la forma ms sencilla es escribirlos
en varias lneas, introduciendo un retorno de carro al final de cada uno. Pero existen
situaciones en las que tenemos que escribir necesariamente dos comandos en una misma
lnea.
Por ejemplo supongamos que el comando morosos produce un listado con las
direcciones de correo electrnico de todos los morosos de nuestra empresa en el fichero
morosos.txt. Si deseamos enviar una carta a todos ellos podemos usar la siguiente
sustitucin de comando:
$morosos
$mailcatmorosos.txt<carta
$morosos;mailcatmorosos.txt<carta
Pero pensemos por un momento en que el comando morosos falla por cualquier
razn y no produce el fichero morosos.txt. En este caso el comando cat fallara tambin
al no encontrarlo o bien leera un ficheros de morosos resultado de una ejecucin previa del
comando. Es evidente que tan slo debe enviarse la carta si el programa de morosos se ha
ejecutado correctamente.
$morosos&&mailcatmorosos.txt<carta
9
comando:
$(morosos&&mailcatmorosos.txt<carta)||echoError
Fjese en que hemos utilizado parntesis para agrupar los comandos delante del
smbolo ||. Estos hacen que los comandos en su interior se agrupen y se ejecuten como si
de un nico comando se tratase. De esta forma si cualquiera de los dos falla aparecer en
pantalla el mensaje Error.
8. Expresiones
Bash shell proporciona un rudimentario lenguaje de expresiones con el que podemos
llevar a cabo las operaciones aritmticas, lgicas o de cadena ms comunes. En esta
seccin las estudiaremos todas empezando por las ms sencillas de todas, las variables.
8.1Variables
Al igual que cualquier otro lenguaje de programacin, los programas escritos en
bash shell pueden usar variables para almacenar informacin de forma temporal. La
nica diferencia entre estas variables y las de cualquier otro lenguaje de
programacin de uso habitual es que todas se tratan como si de cadenas de
caracteres se tratase y adems pueden contener datos de longitud arbitraria. Esto
significa que aunque una variable contenga el valor 123, el shell interpretar ese valor
como una cadena de tres caracteres, nunca como un nmero entero.
Nombre Significado
HOME Nombre del directorio con la cuenta
del usuario
10
PATH Un conjunto de nombres de directorio
separados por el smbolo : en los que
buscar los comandos
LOGNAME Nombre del usuario
SHELL Nombre completo del shell que se
est utilizando
TERM Tipo de terminal que se est utilizando
Nombre Significado
PPID Nmero identificador del proceso
padre
PWD Nombre del directorio de trabajo actual
OLDPWD Nombre del anterior directorio de
trabajo antes de ejecutar por ltima
vez el comando cd
RANDOM Un nmero entero generado al azar
PS1 Cadena que presenta el shell cada vez
que solicita un comando
PS2 Cadena que presenta el shell cada vez
que solicita la continuacin de un
comando que ocupa varias lneas de
pantalla
8.1.1Definicinyconsulta
$mi_nombre=juan
$mi_maquina=bicho.es
$mi_direccion=$mi_nombre@$mi_maquina
$mi_cuenta=file://$mi_maquina/$LOGNAME
11
$echo$mi_direccion
juan@bicho.es
$echomi_direccion
mi_direccion
$mi_otra_direccion=mi_nombre@mi_maquina
$echo$mi_otra_direccion
mi_nombre@mi_maquina
Todas las variables que definamos usando este mtodo son variables
locales, y por lo tanto no son heredadas por losshells que se ejecuten a partir
del actual. Para definir una variable de entorno se debe usar el comando
export. Por ejemplo:
$exportmi_direccion=$mi_nombre@$mi_maquina
crea una variable de entorno llamada mi_direccion que ser heredada por
cualquier subshell. Cualquier variable local puede convertirse en variable de
entorno usando el comando export variable. Para ver la lista de todas las
variables de entorno se puede usar el comando export sin ningn parmetro.
8.1.2Consultaavanzadadevariables
Patrn Significado
${v} Idntico a $v. Se utiliza en los
casos de ambigedad
${#v} Nmero de caracteres de la
cadena que contiene v
${#v[*]} Nmero de elementos del
vector v
${vc} Si v ha sido definida su valor,
en otro caso c
${v=c} Si v ha sido definida su valor,
en otro caso le asigna ahora el
valor c
${v+c} Si v ha sido definida c, en otro
caso la cadena vaca
12
Patrn Significado
${v?c} Si v ha sido definida su valor,
en otro caso se muestra en la
salida de errores la cadena c y
termina la ejecucin del shell
script
${v:+c} Similar a los modos de consulta
${v:=c} en que no aparece el smbolo :,
${v:c} pero a las variables adems de
${v:?c} estar definidas se les exige que
el valor que contienen no sea la
cadena vaca.
${v#p} El valor de la variable, pero
${v##p} eliminando del mismo todos los
caracteres iniciales que encajen
en el patrn p. Si usamos # se
elimina la subcadena ms corta
y si usamos ## se elimina la
ms larga.
${v%p} Similar a ${v#p} y ${v##p}
${v%%p} pero eliminando la subcadena
por el final.
$mi_nombre=juan
$mi_maquina=bicho.es
$mi_direccion=$mi_nombre@$mi_maquina
$echo${#mi_nombre}
4
$cdtrash
$echo$PWD${#PWD}
/home/juan/trash16
$echo$HOME
/home/juan
$echo${PWD#$HOME/}
trash
$ls
f.dat
$mi_fichero=f.dat
$cp$mi_fichero${mi_fichero%.dat}.bak
$ls
f.datf.bak
8.1.3Vectores
13
Bashshell ofrece la posibilidad de usar vectores de valores utilizando
una sintaxis con corchetes para los subndices. La nica limitacin en este caso
es que el ndice de los mismos debe estar entre 0 y 511, por lo que tan slo son
posibles vectores de hasta 512 componentes.
$amigos[0]=Juan
$amigos[1]=Lus
$amigos[2]=Mara
$amigos[3]=Ana
$echo${amigos[0]}estcasadocon${amigos[2]}
JuanestcasadoconMara
$echoTengo${#amigos[*]}enlaagenda
Tengo4amigosenlaagenda
$Misamigosson${amigos[*]}
MisamigossonJuanLusMaraAna
La notacin ${v[*]} se utiliza para acceder a todos los elementos del vector
de forma conjunta.
8.2Variablesespeciales
El bashshell permite el uso de algunas variables especiales que se recogen en
la siguiente tabla. Su valor no se puede cambiar de la forma que hemos visto hasta
ahora y generalmente slo se utilizan en los programas escritos en shellscript, nunca
cuando el shellse utiliza de forma interactiva.
Nombre Significado
$$ Nmero de proceso del shell script en el
que se est utilizando
$0 Nombre completo del shell script en que se
est utilizando
$1..$9 $n hace referencia al nsimo
argumento de la lnea de comandos
$? El cdigo de retorno del ltimo
comando ejecutado
$# Nmero de argumentos
$* La lista de todos los argumentos
14
Todas las variables que hemos mostrado son especiales en el sentido de que
no es posible darles un valor utilizando los mtodos que hemos estudiado hasta el
momento. De todas formas las variables de la forma $i son una excepcin, ya que es
posible cambiar sus valores a voluntad, aunque utilizando el comando set y no los
mecanismos habituales.
$date
lunsep1213:08:54CEST2005
$setdate
$echo$4
$setlunsep1213:11:06CEST2005
8.3Expresionesaritmticas
Bashshell ofrece a los usuarios la posibilidad de realizar operaciones
aritmticas sencillas mediante el uso del comando let. Este comando aplicado sobre
una expresin aritmtica devuelve como cdigo de retorno el resultado de evaluarla.
Operador Significado
Menos unario
! Negacin lgica
*/% Multiplicacin, divisin y resto
+ Suma y resta
15
<=>=<> Operadores relacionales
==!= Igualdad y desigualdad
= Asignacin a variable
&& Y lgico
|| O lgico
El nico punto de inters es que dentro de las expresiones del comando let
las variables, pese a que se est consultando su valor, no es necesario preceder su
nombre del signo $. En cualquier caso, podemos hacerlo si as lo deseamos, como se
muestra a continuacin:
$letx=2+3
$echo$x
5
$lety=$x*5
$echo$y
25
((expresin))
let"expresin"
16
$((x=2+3))
$echo$x
5
$((y=$x*5))
$echo$y
25
8.4Elcomandotest
El comando test nos permite llevar a cabo operaciones lgicas sencillas con
ficheros, cadenas y nmeros enteros. El formato de este comando es
testexpresion
O de forma equivalente
[expresion]
Patrn Significado
df Cierto si f existe y es un directorio
ff Cierto si fexiste y no es un directorio
hf Cierto si fexiste y es un enlace
simblico
nc Cierto si la cadena c no est vaca
rf Cierto si se tiene permiso de lectura
en el fichero f
wf Cierto si se tiene permiso de escritura
en el fichero f
xf Cierto si se tiene permiso de ejecucin
en el fichero f
zc Cierto si la cadena c est vaca
c1=c2 Cierto si las dos cadenas son iguales
c1!=c2 Cierto si las dos cadenas son
diferentes
e1eqe2 Cierto si los dos enteros son iguales
17
e1nee2 Cierto si los dos enteros son diferentes
e1gte2 Cierto si e1 es mayor estricto que e2
e1gee2 Cierto si e1 es mayor o igual que e2
e1lte2 Cierto si e1 es menor estricto que e2
e1lee2 Cierto si e1 es menor o igual que e2
!e Cierto si la expresin e es falsa
e1ae2 Cierto si las dos expresiones son
ciertas
e1oe2 Cierto si la primera o la segunda
expresin o ambas son ciertas
\(e\) Los parntesis se usan para agrupar
expresiones y cambiar el orden de
evaluacin
9. Rutinas
El bashshellpermite definir bibliotecas de rutinas de utilidad que pueden ser
compartidas por multitud de shellscripts. Para escribir una rutina se utiliza la siguiente
sintaxis:
nombre_rutina()
{
listadecomandos
}
Para llamar a una rutina basta con escribir su nombre seguida de los parmetros
adecuados, exactamente igual que si estuvisemos ejecutando cualquier otro comando. En
el siguiente ejemplo se muestra una sencilla rutina que muestra un mensaje de saludo. Por
conveniencia, conviene escribir todas las rutinas en ficheros a los que es preciso dar permiso
de ejecucin utilizando el comando chmod.
$cat>saludo.bsh
#!/bin/bash
saludo()
{
echoHola$1!
}
#Principal
saludo$LOGNAME
saludoamigo$LOGNAME
saludo
18
^D
$chmodugo+xsaludo.bsh
$saludo.bsh
Holajuan!
Holaamigo!
Hola!
Fjese en que en la segunda llamada hemos usado dos parmetros y en la tercera ninguno.
En el primer caso el parmetro extra es ignorado y en el segundo es sustituido por una
cadena vaca.
9.1Algomssobreparmetros
Desgraciadamente, el mecanismo de variables $i tan slo nos permite acceder
a los nueve primeros parmetros que se le pasen a la rutina. Si es preciso usar ms
parmetros dentro de una rutina tenemos que recurrir al comando shift. Cada vez
que se ejecuta desplaza los parmetros que se han pasado a una rutina una posicin
a la izquierda, de forma que el primero se pierde, el segundo se convierte en el
primero y as sucesivamente.
$cat>shift.bsh
#!/bin/bash
desplaza()
{
echo$1$2$3
shift
echo$1$2$3
shift
echo$1$2$3
shift
}
#Programaprincipal
desplazaabc
^D
19
$chmodugo+xshift.bsh
$shift.bsh
abc
bc
c
Para terminar este estudio que estamos realizando de los parmetros, pruebe
el siguiente shellscript:
$cat>curioso.bsh
#!/bin/bash
mas_curioso()
{
echocuriosoharecibido$#parmetros
}
curioso()
{
echocuriosoharecibido$#parmetros
mas_curioso$*
}
#Programaprincipal
curioso"hola$LOGNAME"
^D
$chmodugo+xcurioso.bsh
$curioso.bsh
curiosoharecibido1parmetros
mas_curiosoharecibido2parmetros
mas_curioso$*
se expande como
mas_curiosoholajuan
20
que mas_curioso debe recibir dos parmetros: uno con la cadena hola y otro con la
cadena juan. Encerrar la variable $* entre comillas tampoco sirve de mucho, ya que
en este caso si pasamos ms de un parmetro a la rutina curioso, entonces
mas_curioso slo recibir uno.
9.2Valorderetorno
Las rutinas escritas en bashshell j pueden devolver valores de retorno enteros
mediante el uso del comando return. Pese a que este comando se puede utilizar en
cualquier punto de la rutina, provocando su terminacin inmediata, lo ms adecuado
es usarlo siempre al final. Para determinar cul es el valor de retorno de cualquier
rutina se puede usar la variable especial $?.
$cat>suma.bsh
#!/bin/bash
suma()
{
((result=$1+$2))
return$result
}
#Programaprincipal
suma12
echo"1+2=$?"
^D
$chmodugo+xsuma.bsh
$suma.bsh
1+2=3
$cat>suma.bsh
suma12
echo"1+2=$?"
echo"2+1=$?"
21
produce al ejecutarse la salida siguiente:
$suma.bsh
1+2=3
2+1=0
saludo()
{
echo"Hola$LOGNAME."
echodate
}
msg=saludo
echo$msg
9.3Variableslocales
Dentro de una rutina todas las variables que se definan son globales por
defecto, esto es, son visibles no slo dentro del mbito de la rutina sino de todo el
shellscript en el que aparecen. Para introducir una variable de mbito local se utiliza
el comando typeset seguido del nombre de la variable. Cuando la definamos
posteriormente tan slo ser conocida dentro de la rutina en que ha sido declarada.
$cat>typeset.bsh
#!/bin/bash
locales()
{
typesetx
((x=$1+$2))
echolocal:x=$x
return$x
}
22
#programaprincipal
x=$LOGNAME
echoglobal:x=$x
locales12
echoglobal:x=$x
^D
$chmodugo+xtypeset.bsh
$typeset.bsh
global:x=juan
local:x=3
global:x=juan
9.4Bibliotecaderutinas
En muchas ocasiones las rutinas que escribimos para un programa podran
usarse en otros muchos. El bashshell nos proporciona un sencillo mecanismo para
agrupar rutinas en forma de bibliotecas.
Para construir una biblioteca tan slo tiene que teclear las rutinas que la
componen en un fichero, generalmente con la extensin .bsh, que debe encontrarse
en alguno de los directorios que indica la variable $PATH. Para cargar la biblioteca y
poder hacer uso de sus rutinas debemos usar un comando especial llamado ".". No,
no crea que es una errata. El nombre del comando es un punto.
Por ejemplo:
$.saludo.bash
Holapepe!
Holaamigo!
Hola!
$saludoJuan
HolaJuan!
$_
Todos los comandos que no aparezcan dentro de una rutina en una biblioteca
se ejecutan al cargarla. De ah que en el ejemplo anterior apareciesen los tres saludos
iniciales.
A partir de ahora, en todos los ejercicios usaremos una biblioteca muy til que nos
permitir mostrar mensajes de aviso o de error. Mostramos su cdigo a continuacin:
#!/bin/bsh
#error.bash
error()
{
echo"$*"1>&2
exit1
}
warning()
23
{
echo"$*"1>&2
}
10.Sentenciasdecontrol
El bashshell soporta un conjunto amplio de sentencias de control estructurado que
nos permiten tomar decisiones o repetir ciertos grupos de comandos con facilidad. En esta
seccin supondremos que el lector est familiarizado con las sentencias de control de algn
otro lenguaje de programacin, por lo que la descripcin que vamos a realizar de las mismas
ser bastante somera.
10.1case...in...esac
La sintaxis de esta sentencia de control es la siguiente:
caseein
p1,1|p1,2||p1,n1)listadecomandos;;
p1,1|p1,2||p1,n2)listadecomandos;;
pm,1|pm,2||pm,n1)listadecomandos;;
esac
Esta sentencia intenta encajar een alguno de los patrones pi,j y ejecuta la
lista de comandos asociada al primer patrn en que encaje.
$cat>calendario.bsh
#!/bin/bash
mes=$1
case$mesin
[19]|10|11|12);;
[Ee][Nn][Ee])mes=1;;
[Ff][Ee][Bb])mes=2;;
[Mm][Aa][Rr])mes=3;;
[Aa][Bb][Rr])mes=4;;
[Dd][Ii][Cc])mes=12;;
*)echoError
exit
;;
24
esac
set`date`
cal$mes$7
^D
10.2if...then...fi
Este comando permite bifurcar la ejecucin de un shellscript en funcin a un
conjunto de expresiones condicionales. Su sintaxis es la siguiente:
ifl1
then
l2
elifl3
then
l4
elifl5
then
l6
else
ln
fi
$cat>if.bsh
#!/bin/bash
echo"Tecleeunnmero:"
readnum
if((num>0))
then
echo$numespositivo
elif((num==0))
echo$numesnulo
else
echo$numesnegativo
fi
^D
$chmodugo+xif.bsh
$if.bsh
25
Tecleeunnmero:
12
12espositivo
$if.bsh
Tecleeunnmero
1
1esnegativo
En este ejemplo hemos hecho uso por primera vez del comando read que juega un
papel complementario a echo, pues sirve para leer datos desde el terminal.
10.3for...do...done
Los bucles for permiten ejecutar una lista de comandos en varias ocasiones
bajo el control de una variable que toma en cada iteracin un valor diferente. A
continuacin mostramos la sintaxis:
forvinc1c2cn
do
listadesentencias
done
$cat>for.bsh
#!/bin/bash
forfin"LosficherosdecdigoCson:"*.c/tmp/*.c
do
echo$f
done
^D
$chmodugo+xfor.bsh
10.4while...done
La sintaxis de este comando es la siguiente:
whilel1
do
l2
26
done
num=0
while((num<1||num>10))
do
readnum
done
10.5until...done
La sintaxis de este comando es la siguiente:
untill1
do
l2
done
num=0
until((num>=1&&num<=10))
do
readnum
done
27