Está en la página 1de 10

Red social de Ubuntu en espaol

UbuntuHispano
Regstrate ya! | Ingresar
Inicio Usuarios Wiki Videos Foro
Manual de programacin en Bash Shell
Ver Comentarios
Hola, quiero compartir esto que es programar en shell, es de un libro que adquir y tiene licencia gnu, no domino Shell, pero me gusta la consola, lo malo es
que no puedo poner los ejercicios del cd, cuando lo encuentre espero poder poner los ejercicios.
Tabla de contenidos:
1. Introduccin: Qu es un shell?
2. Manejo bsico del shell
2.1. La linea de comandos
2.2. Patrones de sustitucin
2.3. Redireccin de ficheros
2.3.1. Redireccin stdout a fichero
2.3.2. Redireccin stderr a fichero
2.3.3. Redireccin stdin a fichero
2.3.4. Aadir redireccin a fichero
2.3.5. Redireccin "documentos empotrados"
2.4. Tuberas
2.5. Control de procesos
3. Comandos UNIX
4. Programacin shell
4.1. Mira mam, soy un script!
4.2. Variables
4.3. Linea de comandos
4.4. La salida de los programas
4.5. Operaciones aritmticas
4.6. Condicionales
4.6.1. if ... then ... [ else ... ]
4.7. Bucles
4.7.1. for ... in ...
4.7.2. Rompiendo un bucle: break
4.7.3. while ...
1. Introduccin: Qu es un shell?
Volver arriba.
Es una parte fundamental de todo sistema operativo que se encarga de ejecutar rdenes bsicas para el manejo del sistema.
Suelen incorporar caractersticas como:
control de procesos
redireccin de ficheros
leguaje para escribir pequeos programas
Hay muchos:
command.com cmd.exe - DOS y derivados
ksh - korn shell de UNIX
chs - C shell, similar en sitaxis al lenguaje de programacin C
bsh - Bourne shell
tcsh, zsh, ash, ...
bash - Bourne Again shell, el shell mayoritario de sistemas Linux
2. Manejo bsico del shell
Volver arriba.
Introduzcamos cuatro comandos bsicos para ver esta parte:
echo : repite los argumentos en la salida estndar (ej. pantalla)
ls : lista el contenido de un directorio
Principal Wiki Programacin
Envos recientes Usuarios Mi cuenta Informacin Contacto
Li
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
1 de 12 11/04/2014 12:29 p.m.
cat : muestra el contenido de un fichero
more : muestra el contenido de un fichero haciendo pausas entre pantallas si el fichero es muy largo
2.1. La linea de comandos
Volver arriba.
Escribimos:
$ l s
Pulsamos ENTER.
En la linea de comandos podemos usar las siguientes (combinaciones de) teclas:
IZQUIERDA
Se mueve a la izquierda
DERECHA
Se mueve a la derecha
ARRIBA
Vamos hacia atrs en el historial de comandos
ABAJO
Volvemos hacia adelante en el historial de comandos
FIN
CTRL + e
Vamos al final de la linea
INICIO
CRTL + a
Vamos al principio de la linea
CRTL + d
Salir
CRTL + l
Borra la pantalla
Maysculas + RePag
Hace scroll hacia arriba en la pantalla
Maysculas + AvPag
Hace scroll hacia abajo en la pantalla
2.2. Patrones de sustitucin
Volver arriba.
Hay ciertos caracteres que el shell sustituir por otro contenido en base a unas reglas.
*
cualquier cadena de texto
Ejemplo:
$ echo /usr/*
?
un solo caracter cualquiera
Ejemplo:
$ echo /usr/?bin
$ echo /usr/????
[...]
cualquiera de los caracteres entre corchetes
Ejemplo:
$ echo /usr/[aeiou]*
2.3. Redireccin de ficheros
Volver arriba.
Definicin clsica: Un fichero informtico es una entidad lgica compuesta por una secuencia de bits, almacenada en un sistema de archivos ubicada en
la memoria de un ordenador.
En UNIX todo es un fichero. Es decir, se pueden aplicar a todos los objetos las acciones que soporta un fichero en su definicin clsica: abrir, cerrar,
leer, escribir, etc.
Ficheros estndar que estn abiertos para todo programa en ejecucin:
Entrada estndar /dev/stdin (ej. Teclado)
Salida estndar /dev/stdout (ej. Pantalla)
Salida de error /dev/stderr (ej. Pantalla)
Otros ficheros especiales:
/dev/null -> "la nada de UNIX"
/dev/zero -> fuente infinita de ceros
/dev/random -> datos aleatorios
Qu pasa cuando ejecutamos ls?
2.3.1. Redireccin stdout a fichero
Volver arriba.
$ l s > sal i da
$ cat sal i da
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
2 de 12 11/04/2014 12:29 p.m.
2.3.2. Redireccin stderr a fichero
Volver arriba.
$ l s pi r ul ot r opi cal 2> er r or
$ cat er r or
2.3.3. Redireccin stdin a fichero
Volver arriba.
$ cat < /dev/stdin
2.3.4. Aadir redireccin a fichero
Volver arriba.
$ echo aadi r dat os >> sal i da
$ cat sal i da
$ l s uh 2>> er r or
$ cat er r or
2.3.5. Redireccin "documentos empotrados"
Volver arriba.
$ cat << FI NDOCUMENTO
Esto es un documento empotrado. El comando cat va a tomar un fichero desde stdin que acaba cuando encuentra el delimitador...
FINDOCUMENTO
2.4. Tuberas
Volver arriba.
Una tubera es un fichero especial con dos extremos, de forma que lo que escribimos en un lado de la tubera va a parar al otro. En ingls: pipe.
$ l s /usr/bin | more
La salida del comando ls /usr/bin va a parar a la entrada del comando more.
Las tuberas permiten combinar la funcionalidad de distintos comandos. Para ello la mayor parte de los programas permiten acceder a sus
funcionalidades desde la linea de comandos.
2.5. Control de procesos
Volver arriba.
Un proceso es un programa en ejecucin con caractersticas propias (memoria, pila, puntero de programa, nmero identificador nico, etc.).
En UNIX todo proceso es 'hijo' de otro, es decir, es creado por otro proceso, considerado como el proceso 'padre'. Todos los procesos descienden de
un proceso principal llamado 'Init', que al iniciar el sistema tiene el numero de proceso 1.
El proceso 'init' es el nico que no tiene 'padre'. Existe la posibilidad que un proceso 'padre' termine de manera inesperada y errnea (debido a un fallo
de programacin, por ejemplo), este proceso 'padre' terminara, pero podra dejar procesos 'hijo' en ejecucin.
Cuando un proceso 'hijo' queda descolgado del proceso 'padre', se dice que entra en un estado 'zombie' porque su padre no est esperando cuando
acaba. Cuando ejecutamos un comando en el shell se crea un proceso que es hijo de ese shell y el shell espera a que el proceso termine para volver a
tomar el control.
Tambin es importante destacar que cada nuevo proceso creado hereda ciertas caractersticas de su padre, como: las variables de entorno y los
ficheros abiertos.
[ shell ] - ejecuta ls -> [ ls : shell espera ] - fin ls -> [ shell ]
Desde el shell podemos, a parte de crear procesos, manipular a los hijos creados por ese shell.
Control de procesos del shell:
CRTL + c
finaliza el proceso
comando &
permite ejecutar un comando en segundo plano
Ejemplo:
$ l s &

bi n/ doc/ mai l / sr c/ t mp/
[ 1] 23704
[ 1] + Done l s - F
CTRL + z
parar un proceso en primer plano el shell toma el control y 'duerme' al proceso que estaba en ejecucin
Ejemplo:
$ l s /bin/ | more
CTRL + z
[ 1] + Done l s - F / bi n/ |
St opped mor e
jobs
muestra informacin sobre los procesos parados dependientes de este shell
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
3 de 12 11/04/2014 12:29 p.m.
Ejemplo:
$ j obs

[ 1] + Done l s - F / bi n/ |
St opped mor e
fg
continua un proceso parado, en primer plano. Si existen varios procesos parados, podemos ponerle como argumento el ndice que el comando
jobs nos mostr.
bg
continua un proceso parado, en segundo plano. Si existen varios procesos parados, podemos ponerle como argumento el ndice que el comando
jobs nos mostr.
3. Comandos UNIX
Volver arriba.
Hay ms de 300 comandos UNIX distintos. Vamos a estudiar por encima las caractersticas de unos cuantos, los suficientes como para poder hacer
pequeos programas. Aunque los nombres de los comandos siguen una lgica, muchas veces esta se ha perdido con el tiempo. En consecuencia
tenemos muchos comandos que no sabemos lo que hacen y, por lo tanto, no los utilizamos. No hay que saber como funcionan todos los comandos,
pero s es interesante conocerlos y ms o menos saber que hacen. Para un uso ms en profundidad consultaremos la pgina del manual.
ls
muestra el contenido de un directorio
echo
hace eco en pantalla
Ejemplo:
$ echo hol a mundo!
cat
muestra el contenido de un fichero
more
muestra el contenido de un fichero haciendo pausas entre pantallas si el fichero es largo
man
muestra la pgina del manual de un comando
Ejemplo:
$ man l s
clear
borra la pantalla
cp
copia ficheros y directorios
Ejemplo:
$ cp f i cher o_or i gi nal f i cher o_copi a
mv
mueve ficheros
Ejemplo:
$ mv f i cher o f i cher o2
rm
borra ficheros
Ejemplo:
$ r mf i cher o
ln
enlazar (referenciar) ficheros
Ejemplo de enlace "duro" (hardlink):
$ l n f i cher o enl ace
Ejemplo de enlace "suave" (softlink):
$ l n - s f i cher o enl ace_si mbl i co
cd
cambia de directorio de trabajo si no se indica directorio, nos traslada a $HOME
Ejemplo:
$ cd di r ect or i o
pwd
muestra el directorio de trabajo actual
mkdir
crea directorios
Ejemplo:
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
4 de 12 11/04/2014 12:29 p.m.
$ mkdi r di r ect or i o
rmdir
borra directorios (vacos)
Ejemplo:
$ r mdi r di r ect or i o
env
muestra las variables de entorno del programa
head
muestra las n primeras lineas de un fichero (10 por defecto)
Ejemplo:
$ head f i cher o
tail
muestra las n ltimas lineas de un fichero (10 por defecto)
Ejemplo:
$ t ai l f i cher o
grep
busca ocurrencias de una cadena en un fichero
Ejemplo:
$ gr ep cadena f i cher o
ps
muestra los procesos en el sistema
kill
Enva una seal a un proceso indicando su PID (Process IDentifier,
o nmero nico que identifica a cada proceso)
Ejemplo:
$ ki l l 1002
export
Exporta una variable al entorno del programa
Ejemplo:
$ expor t VARI ABLE=val or
read
Lee una linea de la entrada estndar y la almacena en una variable
Ejemplo:
$ r ead l i nea
$
Delante de una variable permite acceder a su contenido
Ejemplo:
$ echo $SHELL
;
Separa dos comandos en una misma linea
Ejemplo:
$ r ead l i nea ; echo se ha l e do: $l i nea
file
indica de qu tipo es un fichero
cal
muestra el calendario del mes actual
wc
cuenta lineas, palabras o bytes en ficheros
Ejemplo:
$ echo hol a que t al | wc
date
muestra hora y fecha actuales
Ejemplo:
$ dat e
Ejemplo de fecha en formato yyyy-mm-dd:
$ dat e " +%Y- %m- %d"
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
5 de 12 11/04/2014 12:29 p.m.
passwd
cambia la contrasea de un usuario
chmod
cambia los permisos de un fichero
chown
cambia el propietario de un fichero
chgrp
cambia el grupo propietario de un fichero
reset
restaura la terminal de texto
whereis
indica donde se puede encontrar un fuente, binario o manual
Ejemplo:
$ wher ei s l s
which
indica donde est un comando
Ejemplo:
$ whi ch l s
locate
busca ficheros
find
bsqueda avanzada de ficheros
who
quin tiene sesin abierta en la mquina
tac
concatena ficheros y los muestra a la inversa
touch
actualiza la fecha y hora de un fichero, si no existe lo crea
Ejemplo:
$ t ouch f i cher o_i nexi st ent e
less
una versin ms elaborada de more que permite desplazarnos por el texto, hacer bsquedas, etc.
df
muestra el espacio libre y ocupados de los discos
du
calcula el espacio de disco usado
mail
programa simple para enviar y leer correo
tar
empaquetar ficheros
Ejemplo empaquetar:
$ t ar cvf f i cher o. t ar di r ect or i o
Ejemplo desempaquetar:
$ t ar xvf f i cher o. t ar
gzip
comprimir un fichero
gunzip
descomprimir un fichero comprimido con gzip
zcat
muestra el contenido de un fichero comprimido con gzip
ldd
muestra las libreras que usa un programa
halt
apaga la mquina
reboot
reinicia la mquina
shutdown
apaga o reinicia la mquina
true
cierto, o uno
false
falso, o cero
exit
termina la sesin y muestra el login del sistema
logout
termina la sesin y muestra el login del sistema
seq
genera una secuencia de nmeros
Ejemplo:
$ seq 1 10
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
6 de 12 11/04/2014 12:29 p.m.
cut
elimina partes de ficheros
Ejemplo:
$ echo hol a que t al | cut - d " " - f 2
awk
escner de patrones y lenguaje de programacin para procesar textos
Ejemplo:
$ echo hol a que t al | awk ' { pr i nt $1 " ! " , $2, $3 " ?" }'
tr
elimina o traduce caracteres
Ejemplo:
$ echo hol a que t al | t r a A
sed
realiza transformaciones en flujos de bytes
Ejemplo:
$ echo hol a que t al | sed ' s/ a/ A/ g'
(substituye las 'a' por 'A' en todo el flujo)
fmt
da formato a cada prrafo de un fichero
sort
ordena ficheros de texto
sleep
detiene el proceso durante n segundos
Ejemplo:
$ sl eep 5 ; echo Han pasado 5 segundos
uniq
lee de stdin y compara lineas adyacentes escribiendo las
lineas nicas a stdout
4. Programacin shell
Volver arriba.
Ahora que sabemos manejarnos con el shell y conocemos unos pocos comandos, vamos a comenzar a hacer pequeos programas que interpretar el
shell.En esta parte necesitaremos un editor de texto plano, como pueden ser: vi, emacs, joe, mcedit, nano, kwrite, gedit, etc. Cualquiera de ellos vale,
siempre que guardemos el texto como text/plain.
4.1. Mira mam, soy un script!
Volver arriba.
Vamos a crear un fichero, script.sh, con el siguiente contenido:
#! / bi n/ sh
echo Mi r a mam, soy un scr i pt !
Intentamos ejecutarlo con ./script.sh y no funciona. Esto es porque la extensin sh no es lo que hace que sea ejecutable. Para que se pueda ejecutar
tenemos que darle permisos de ejecucin:
$ chmod +x script.sh
Ahora s es ejecutable.
El programa consta de dos lineas:
Un comentario, desde la aparicin de # hasta el final de esa linea, donde se indica al shell con la secuencia #!/bin/sh que /bin/sh es el programa
que se debe usar para ejecutar este fichero.
Un comando que muestra un texto en stdin. Es la primera linea "ejecutable", ya que los comentarios son ignorados por el intrprete.
4.2. Variables
Volver arriba.
Una variable es un contenedor. Consta de un identificador que la distingue de otra (su nombre) y de un contenido. La relacin entre variable y contenido
es de equivalencia. Por lo general las variables en shell no tienen tipos asociados y se definen de la siguiente forma:
identificador = contenido
Ejemplos:
# i val e 1
i =1
# I val e echo
I =echo
# msg val e Hol a mundo!
msg=" Hol a mundo! "
Cuidado: si dejamos espacios entre el = y el identificador o el valor el shell creer que son comandos a ejecutar y no la asignacin de una variable. Para
acceder al contenido de una variable empleamos $ delante de su identificador:
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
7 de 12 11/04/2014 12:29 p.m.
$identificador
Ejemplos:
$ i =1 ; echo $i
$ msg=" Mol a mundo! " ; echo $msg
$ f u=echo; $f u goo!
Cuando empleamos $identificador el shell busca el valor almacenado en la variable asociada a ese identificador y lo utiliza para reemplazar esa
ocurrencia de $identificador.
4.3. Linea de comandos
Volver arriba.
Cuando se ejecuta nuestro programa en shell hay una serie de variables que siempre estarn disponibles, entre ellas las que nos permiten acceder a
los distintos argumentos con los que fue ejecutado nuestro script.
$0
contiene el nombre nombre de nuestro script
$#
el nmero de parmetros con los que se ha invocado al shell
$n
los parmetros, con n de 1 a 9 (a $#)
$$
el PID de nuestro proceso
$*
todos los parmetros menos $0
4.4. La salida de los programas
Volver arriba.
Cuando se ejecuta un programa, un comando UNIX es un programa, podemos, a parte de redirigir su entrada y su salida, recoger el resultado de su
ejecucin y su salida. El resultado es un valor numrico, por lo general cero si todo ha ido bien, y distinto de cero si ha habido alguna clase de error. La
salida del programa es lo que obtendramos en stdin y stdout.
$?
resultado del ltimo programa ejecutado
Ejemplo:
$ l s pi r ul ot r opi cal 2> /dev/null ; echo $?
$ l s > /dev/null ; echo $?
$(comando)
la salida de comando (esto es equivalente al uso de comillas invertidas, pero por simplicidad vamos a utilizar esta versin)
Ejemplo:
$ sal i da_l s=$( l s) ; echo $sal i da_l s
exit ENTERO
termina nuestro programa con el valor de salida ENTERO
Ejercicio 1: realizar un script que dado un directorio, cree un archivo tar comprimido con gzip y con nombre igual a la fecha en formato yyyy-mm-dd
seguido del nombre del directorio acabado en .tar.gz. Ejemplo: aplicado sobre tmp obtendramos -> 2004-04-03tmp.tar.gz.
4.5. Operaciones aritmticas
Volver arriba.
Para que el shell evalue una operacin aritmtica y no la tome como argumentos de un comando, por ejemplo:
$ echo 1+1
Si queremos que sustituya la operacin por su valor emplearemos:
$((expresin))
evalua la expresin aritmtica y reemplaza el bloque por el resultado
Ejemplo:
$ echo $( ( 1+1) )
Algunos operadores aritmticos soportados:
+ suma
* mutiplicacin
- resta
/ divisin entera
% resto de la divisin entera
( ) agrupar operaciones
Ejercicio 2: realizar un script que dado un nmero 'n' muestre los diez primeros elementos de su tabla de multiplicar, mostrando el resultado en la forma:
i x n = resultado.
4.6. Condicionales
Volver arriba.
Existe un comando para evaluar condiciones, y que nos permitir que nuestros programas "tomen decisiones":
test expresion
[ expresion ]
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
8 de 12 11/04/2014 12:29 p.m.
Este comando evalua expresion, y si evalua a cierto, devuelve cero (true), o en otro caso 1 (false). Si no hay expresin, test siempre devuelve falso.
Este comportamiento puede ser algo confuso, ya en lgica los valores cierto y falso suelen ser al contrario. Test soporta gran cantidad de operadores,
algunos son:
-d fichero
cierto si fichero existe y es un directorio
-e fichero
cierto si fichero existe, independientemente del tipo que sea
-f fichero
cierto si fichero existe y es un fichero normal
-r fichero
cierto si fichero existe y se puede leer
-s fichero
cierto si fichero existe y tiene tamao mayor que cero
-w fichero
cierto si fichero existe y es se puede escribir sobre l
-x fichero
cierto si fichero existe y es ejecutable
n1 -eq n2
cierto si los enteros n1 y n2 son iguales (equal)
n1 -ne n2
cierto si los enteros n1 y n2 no son iguales (not equal)
n1 -gt n2
cierto si el enteros n1 es mayor que n2 (greater than)
n1 -ge n2
cierto si los enteros n1 y n2 son iguales o n1 es mayor que n2 (greater equal)
n1 -lt n2
cierto si el enteros n1 es menor que n2 (lesser than)
n1 -le n2
cierto si los enteros n1 y n2 son iguales o n1 es menor que n2 (lesser equal)
s1 = s2
cierto si las cadenas de texto s1 y s2 son idnticas
s1 != s2
cierto si las cadenas de texto s1 y s2 no son idnticas
s1 < s2
cierto si la cadena de texto s1 es menor que s2
s1 > s2
cierto si la cadena de texto s1 es mayor que s2
-n cadena
cierto si la longitud de la cadena de texto es distinta de cero
! expresion
cierto si expresion es falsa (negacin)
expresion1 -a expresion2
cierto si expresion1 y expresion2 son ciertas (AND entre expresiones, producto lgico)
expresion1 -o expresion2
cierto si expresion1 o expresion2 son ciertas (OR entre expresiones, suma lgica)
Adems existen los operadores lgicos && (AND, multiplicacin lgica) y || (OR, suma lgica), que se puede aplicar al valor de salida de los programas:
$ t r ue && t r ue ; echo $?
$ t r ue && f al se ; echo $?
$ f al se && t r ue ; echo $?
$ f al se && f al se ; echo $?
$ t r ue | | t r ue ; echo $?
$ t r ue | | f al se ; echo $?
$ f al se | | t r ue ; echo $?
$ f al se | | f al se ; echo $?
El sistema de evaluacin del shell es perezoso y va de izquierda a derecha. Si se encuentra la suma lgica true || ALGO, ALGO no se evaluar porque
se asume que cierto o falso o cierto o cierto siempre es cierto.
Explicacin:
En la suma lgica (OR, es decir smbolo ||) si uno de los valores es true entonces la suma lgica tendr valor true as que no es necesario seguir
envaluando el otro elemento. Por esta razn si se empieza con el valor de la izquierda y este contiene true entonces la operacin se para y se devuelve
directamente true.
Vease suma lgica:
false+false=false
false+true=true
true+false=true fin de ejecucin tras evaluar el primer termino
true+true=true (ojo, suma lgica, no binaria) fin de ejecucin tras evaluar el primer termino
En el producto lgico (AND, es decir smbolo &&) si uno de los elementos de la operacin es false, la operacin devuelve un false. Al empezar por el
termino de la izquierda si este contiene false, se para la operacin y se devuelve un false.
Vease producto lgico:
false*false=false fin de ejecucin tras evaluar el primer termino
false*true=false fin de ejecucin tras evaluar el primer termino
true*false=false
true*true=true
Es algo bueno que el sistema de evaluacin sea "perezoso" porque el tiempo de ejecucin se reduce a la mitad si no se evalua el valor de verdad del
siguiente termino tras la evaluacin del primero.
4.6.1. if ... then ... [ else ... ]
Volver arriba.
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
9 de 12 11/04/2014 12:29 p.m.
Esta es la principal estructura que nos permitir ejecutar un bloque de cdigo, o (alternativamente) otro, dependiendo de como se evalue una condicin.
if CONDICION; then
bloque de comandos
fi
if CONDICION; then
bloque de comandos b1
else
bloque de comandos b2
fi
En el primer caso el bloque de comandos se ejecutar solo si la condicin es evaluada a cierto. En el segundo caso el bloque b1 se ejecutar si la
condicin es evaluada a cierto, y sino se ejecutar el bloque b2. La condicin puede ser, por ejemplo, una llamada al comando test o una operacin
lgica entre los valores de salida de diferentes comandos.
read linea
# comparamos cadenas de texto, as que usamos comillas
i f [ " $l i nea" = "secr et o" ] ; t hen
echo bi ngo!
f i
i f ! $( pi ng - c 1 192. 168. 0. 100 > <em>/ dev/ nul l </ em>) ; t hen
echo La mqui na 192. 168. 0. 100 no r esponde
el se
echo La mqui na 192. 168. 0. 100 est ah !
f i
Ejercicio 3: realizar un script que, dado un nmero, indique si es o no divisible entre 101. Si no se proporciona un nmero debe mostrar como usar el
programa.
4.7. Bucles
Volver arriba.
El shell aporta mecanismos para realizar tareas repetitivas mediante el empleo de estructuras que permiten repetir un bloque de comandos.
4.7.1. for ... in ...
Volver arriba.
Esta estructura permite repetir un bloque de comandos asignando valores de una serie a una variable en cada iteracin.
for VARIABLE in SERIE; do
bloque de comandos
done
En cada iteracin la variable VARIABLE toma un valor de SERIE, que en caso de no contener elementos har que no se ejecute nada y se devuelva un
valor 0. En caso de que se ejecuten comandos, el resultado devuelto tras el bucle es el del ltimo comando ejecutado.
Ejemplos de bucle:
# equi val ent e a seq 1 5
f or i i n 1 2 3 4 5; do
echo $i
done
# l o mi smo per o con pal abr as
f or pal abr a i n uno dos t r es cuat r o ci nco; do
echo $pal abr a
done
Ejercicio 4: realizar un script que dado un nmero 'n' muestre los diez primeros elementos de su tabla de multiplicar, mostrando el resultado en la forma:
i x n = resultado. Emplear un bucle y seq (si est disponible). Si no se proporciona un nmero, mostrar como se usa el programa.
Ejercicio 5: realizar un script que dado una lista de directorios, cree un archivo tar comprimido con gzip con nombre igual a la fecha en formato
yyyy-mm-dd.tar.gz. Adems se generar un fichero yyyy-mm-dd.lst con los nombres de los directorios contenidos en el archivo tar, UNO POR LINEA
usando un bucle. Si el fichero lst existe, mostrar un error y terminar el programa. Si alguno de los elementos no es un directorio, mostrar un error y
finalizar el programa.
4.7.2. Rompiendo un bucle: break
Volver arriba.
En cualquier momento un bucle puede ser interrumpido mediante el uso de break, de forma que tras ser ejecutado ese comando el control pasa al
siguiente comando despus del done.
Ejemplo de uso de break:
f or el ement o i n *; do
echo Pr i mer el ement o $el ement o
br eak
echo Est o nunca se l l ega a ej ecut ar
done
echo Segui mos con el pr ogr ama
4.7.3. while ...
Volver arriba.
Se trata de otra estructura de bucle que permite ejecutar un bloque de comandos mientras se evalue una condicin a cierto:
whi l e CONDI CI ON; do
bl oque de comandos
done
Manual de programacin en Bash Shell | Ubuntu Hispano http://www.ubuntuhispano.org/wiki/manual-programacion-bash-shell
10 de 12 11/04/2014 12:29 p.m.