Bucles ”while”, ”for” y ”until”.

Por Jorge Fuertes http://jorgefuertes.com c 2009 Jorge Fuertes Alfranca Revisado a 15 de mayo de 2009

1

´ Indice
1. Introducci´n o 1.1. Los bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Bucles while 2.1. Construcci´n t´ o ıpica . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Bucle infinito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Bucles for 3.1. Construcci´n t´ o ıpica . . . . . . . . . . . . . . 3.1.1. For sobre una secuencia de n´meros u 3.1.2. For sobre las l´ ıneas de un fichero . . 3.2. Bucle for sobre la consola o shell . . . . . . 4. Los bucles until 5. Ejercicios 5.1. Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. Sobre esta unidad did´ctica a 6.1. Notas y advertencias . . . 6.2. Derechos . . . . . . . . . . 6.3. Agradecimientos . . . . . 6.4. Revisiones . . . . . . . . . 3 3 3 3 4 5 6 6 6 7 8 8 8 12 21 21 21 21 21

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

2

a Estas son: while: Ejecutar´ la rutina mientras se cumpla una determinada cona dici´n de carrera.1. o for: Ejecutar´ la rutina a lo largo de toda una secuencia o entrada. Introducci´n o Los bucles Los bucles o loops en ingl´s. que la condici´n especificada debe ser verdadera o o para que el contenido del bucle pueda ejecutarse. Es decir. o 6 Cada ejecuci´n del bucle o rutina. hay tres estructuras que nos permitir´n realizar bucles. a siendo cada elemento de esta secuencia parte de la iteraci´n 6 a trav´s de o e una variable. ıa Tambi´n podr´ construirse un while infinito. Estas construcciones nos permiten ejecutar o la misma rutina 1 repetidamente. o 3 . Supuestamente algo en dicho contenido producir´ variaciones en la condici´n de carrera hasta provocar que a o esta sea falsa. 2 Condici´n que de cumplirse marca el fin de un bucle. por ejemplo con condici´n de e ıa o carrera [ 1 ]. o 3 Por ejemplo de 1 a 10 o de la ”a” a la ”z”. Bucles while Una estructura while se ejecutar´ mientras se cumpla una determinada a condici´n de carrera." let CONTADOR++ done 1 Bloque de c´digo que se ejecutar´ en diversas ocasiones y/o que puede ser llamado desde o a otras partes del programa. 4 Por ejemplo un fichero. u o 2. o 2. o 5 Programaci´n de guiones de Bash. En el bash scripting 5 . son una parte fundamental del control de flujo en e cualquier lenguaje de programaci´n. lo que producir´ la salida del bucle. siendo cada l´ a ınea del fichero objeto de una iteraci´n del bucle. quiz´ el resultado de un cat.1. Construcci´n t´ o ıpica Una construcci´n t´ o ıpica de while es: #!/bin/bash CONTADOR=1 while [ $CONTADOR -lt 10 ] do echo "El contador vale ${CONTADOR} y es menor que 10.1. que siempre ser´ verdadera. y podr´ ıa ıamos forzar la salida en alg´n momento con una instrucci´n exit o break. until: Ejecutar´ la rutina hasta que se cumpla una determinada cona dici´n de carrera. en base a una condici´n de carrera 2 o bien o hasta el final de una secuencia3 o de un flujo de entrada de datos4 . 1.

10. Como se puede observar el bucle ha sido ejecutado 9 veces. Lo primero que hacemos es un echo diciendo cuando vale el contador a la entrada del bucle y acto seguido lo incrementamos (let CONTADOR++) y este proceso se repite hasta que contador ha sido incrementado hasta 10. o while [ 1 ] do echo "¿Hay alguien ah´?" ı read ENTRADA if [ "$ENTRADA" == "si" ] then echo "Hola." fi done echo "Fin de programa. usuario. o a a 4 . as´ que el buo ı cle comienza a ejecutare. si hay un bucle o infinito en un programa est´ se quedar´ colgado en dicho bucle y no continuar´ e a a nunca. Como $CONTADOR es igual a 1. Bucle infinito En programaci´n un bucle infinito se entiende como un error. 10. 10. respuesta que causar´ la salida del bucle ı.2." elif [ "$ENTRADA" == "no" ] then echo "Pues si no hay nadie me voy. 10. 10. 10. Por ejemplo: o #!/bin/bash # La condici´n [ 1 ] es siempre verdadera." break else echo "No entiendo. 10. cumple la condici´n de ser menor de 10." Este programa estar´ todo el rato preguntando al usuario que si hay alguien a ah´ S´lo se detendr´ al contestar ”no”. con lo que incumple la condici´n de carrera.Este programa producir´ la siguiente salida: a El El El El El El El El El contador contador contador contador contador contador contador contador contador vale vale vale vale vale vale vale vale vale 1 2 3 4 5 6 7 8 9 y y y y y y y y y es es es es es es es es es menor menor menor menor menor menor menor menor menor que que que que que que que que que 10. o 2. Sin embargo podemos aprovecharnos los bucles pseudoinfinitos para conseguir que un programa est´ continuamente funcionando hasta que forcemos la e salida con una instrucci´n break. 10.

en pseudoc´digo. o Son utiles para recorrer secuencias de n´meros. e introducen en una variable el valor de la actual iteraci´n. y esta ultima l´ ´ ınea nunca llegar´ a ejecutarse. expresiones matem´ticas.. l´ ´ u ıneas de un fichero de texto." ser´ ejecutada normalmente." O en c´digo real de Bash: o #!/bin/bash for VAR in $(seq 1 20) do echo "Estoy en la iteraci´n n´mero $VAR" o u done echo "Programa finalizado. haga la prueba en el terminal: #> seq 1 10 1 2 3 4 5 6 7 8 9 10 5 . Bucles for Los bucles de tipo for recorren una secuencia de principio a fin." Como se ver´ el programa real es muy parecido al de pseudoc´digo. si no se sale con un break. ıa Recuerde: Utilize break para salir de un bucle ignorando la condici´n de o carrera. la salida hubiese e o sido total. 3. pr´cticamente a o a s´lo cambia en que hemos introducido el comando seq para generar una secueno cia de 1 a 20. Si a o por el contrario hubi´semos utilizado una instrucci´n ”exit”.. Observe que la l´ o ınea final echo "Fin de programa. a La estructura de un bucle for. ser´ o ıa: para VAR de 1 a 20 hacer decir "Estoy en la iteraci´n n´mero VAR" o u hecho decir "Programa finalizado. ya que s´lo hemos ordenado la salida del bucle. Si desea ver que hace.mediante la instrucci´n break. de todo el programa. etc.

1. n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u n´mero u 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 For sobre las l´ ıneas de un fichero #!/bin/bash echo "Nombres y edades:" echo "-----------------" 6 .1. Construcci´n t´ o ıpica Vamos a ver tres construcciones muy t´ ıpicas. sin escribir un script. la que recorre una secuencia de n´meros y la que recorre las l´ u ıneas de un fichero.1." Lo que har´ bash al ejecutar ese programa es. For sobre una secuencia de n´ meros u #!/bin/bash for VAR in $(seq 1 20) do echo "Estoy en la iteraci´n n´mero $VAR" o u done echo "Programa finalizado. 3. la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o la iteraci´n o finalizado.2. introducirlo en la variable VAR y ejecutar lo que hay entre las l´ ıneas do y done.1. En el caso de este programa el contenido entre estas l´ ıneas ser´ ejecutado veinte veces.3. El resultado por pantalla ser´: a a Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Estoy en Programa 3. por cada uno de los n´meros a u de la secuencia. y adicionalmente veremos como ejecutar un bucle for en la consola.

txt) do NOMBRE=$(echo $LINEA|cut -f1 -d":") EDAD=$(echo $LINEA|cut -f2 -d":") echo "$NOMBRE tiene $EDAD a~os.sh Nombres y edades: ----------------Pepe tiene 23 a~os. n Elena tiene 60 a~os. Al ejecutar obtendremos lo siguiente por pantalla: #> sh edades.txt” algo como esto: Pepe:23 Paula:34 Juan:27 Mar´a:54 ı Federico:50 Pablo:32 Sonia:33 Elena:60 El programa recorrer´ cada una de las l´ a ıneas del fichero y la pondr´ en la a variable LINEA.) en lugar de por intros. si es -f1 nos dar´ el primer campo. separando las l´ ıneas por punto y coma (. ı n Federico tiene 50 a~os. por ejemplo: 7 . pasando a ejecutar el bucle. mientras estamos trabajando." Siendo el fichero ”nombres-edades. n Programa finalizado. Lo que hace cut es cortar la l´ ınea por el seaparador. n Paula tiene 34 a~os. n Sonia tiene 33 a~os. es decir el a nombre. Bucle for sobre la consola o shell En muchas ocasiones necesitaremos ejecutar un bucle en la consola.2. 3.for LINEA in $(cat nombres-edades. un bucle que s´lo vamos a utilizar una vez y para el que o no hay necesidad de crear un gui´n. n Pablo tiene 32 a~os. n Juan tiene 27 a~os." n done echo echo "Programa finalizado. Dentro del bucle se ejecutan dos comandos cut para obtener por separado el nombre y la edad. en este caso ”:” y darnos el campo que solicitamos en las opciones. o Para eso podemos teclearlo en la l´ ınea de comandos. n Mar´a tiene 54 a~os.

10.". pero habr´ ıa que teclearlo en una sola. y ll´melo o a ej-bucles-num. 10. ı 4.1. la condici´n de e o carrera debe ser falsa. Por ejemplo: #!/bin/bash CONTADOR=1 until [ $CONTADOR -eq 10 ] do echo "El contador vale ${CONTADOR} y es menor que 10. para no confundir. pero cualquier bucle podr´ ser ıa ejecutado de esta forma. 10. Por ejemplo uno que recorra un fichero y cree cuentas de usuario con los nombres all´ contenidos. 10. do echo "Iteraci´n n´mero $i". Es decir que son exaco tamente iguales pero al rev´s.sh. y para que deje de ejecutarse debe pasar a ser verdadera.#> for i in $(seq 1 10). 5. 10. done ı ı Note que por problemas de espacio el bucle aparece en dos l´ ıneas. o u echo "Podr´amos ejecutar cualquier cosa aqu´. 10. 5. 10. Los bucles until Los bucles until son los ant´nimos de los bucles while. siendo num el n´mero de ejercicio: u 8 . Para que un bucle until se ejecute. El ejemplo es muy sencillo. 10.sh El El El El El El El El El contador contador contador contador contador contador contador contador contador vale vale vale vale vale vale vale vale vale 1 2 3 4 5 6 7 8 9 y y y y y y y y y es es es es es es es es es menor menor menor menor menor menor menor menor menor que que que que que que que que que 10." let CONTADOR++ done El bucle anterior se ejecutar´ hasta que la variable CONTADOR pase a valer a 10: #> sh prueba-until. Ejercicios Enunciados Cree un script o gui´n de Bash para cada uno de los ejercicios.

por ejemplo para la anterior dir´ ”Juan ıa tiene 24 a˜os. u 4. una edad expresada en a˜os. n 7 http://es. Modifique el programa anterior de forma que las palabras se vayan guardando en un fichero ”palabras.txt”.txt” y escriıa ba un gui´n que lo recorra y diga por pantalla ”Tal nombre tiene tantos o a˜os. 5..”. Medio: Cree un script que pida n´meros al usuario hasta que este teclee u la palabra ”promedio”.24”. es decir: 1 + 2 + 3 + 4 + 5. Por ejemplo una l´ n ınea ser´ ”Juan. Escriba un gui´n que admita palabras (seguidas de enter ) por parte del o usuario hasta que este teclee ”salir ”.” para cada una de las l´ n ıneas.wikipedia. Cree un fichero que contenga una lista de cinco nombres de pila y.. u 2.org/wiki/Media_aritm%C3%A9tica 9 . 6. Por ejemplo si introduce ”5”. Despu´s calcule la media aritm´tica7 entre todos e e ellos. Guarde ese fichero como ”nombre-edad. se le devuelva la palabra que introdujo u en esa posici´n. 3. Modifique de nuevo el programa. se le devolver´ la palabra o a n´mero cinco del fichero ”palabras. separadas por una coma. Consiga que si el usuario introduce un n´mero en lugar de una palabra.1. despu´s debe aparecer en pantalla el e n´mero de palabras que se han introducido y una despedida.txt”. Escriba un programa que calcule el resultado de sumar todos los n´meros u del 1 al 100 secuencialmente.

Escriba un gui´n que repase todos los ficheros de ejercicios que ha hecho o hasta ahora. Cree un script que borre todos los usuarios pertenecientes al grupo ”ejercicios” pero antes de borrar a cada uno debe mostrar su nombre por pantalla y pedir confirmaci´n. y que haga despu´s a e un tar.gz (uno s´lo) de todos los directorios de usuario de la m´quina o a (excluyendo a root) con el nombre homes-backup. compruebe si est´ instalado o no. o 10. 9. Escribe un programa que dado un nombre de paquete de Debian. haga un gui´n que cree un usuario para cada uno de o ellos en su m´quina. 8. 11. Haga un gui´n que mire todos los directorios que haya dentro de /hoo me y que por cada uno de ellos compruebe si existe dicho usuario en el /etc/passwd. y si no lo est´ de la opci´n de obtener m´s a a o a informaci´n sobre ´l o de instalarlo.7. o e 10 . el grupo debe ser ”ejercicios”. si el usuario no existe debe dar la opci´n de comprimir en un o backup y borrar el directorio de ese usuario fantasma. Con la misma lista. 12. Antes de probarlo cree varios directorios dentro de /home. y que compruebe que la primera l´ ınea de cada uno de ellos es ”#!/bin/bash”.tgz y que se guarde en /root/backups. Utilizando el fichero del ejercicio anterior haga un gui´n que diga qui´n o e de la lista es el mayor y el menor.

13. 11 . utilice un bucle until para ello. Construya un programa que escriba por pantalla una secuencia de 1 a 99.

u #!/bin/bash # Variables: CONTADOR=0 PALABRA="" # Limpiar pantalla: clear # Bucle: while [ "$PALABRA" != "salir" ] do # Entrada de usuario: read -p "Introduzca palabra: " PALABRA let CONTADOR++ done # Quitamos 1 por "salir": let CONTADOR-# Total de palabras: echo "Has tecleado $CONTADOR palabras. despu´s debe aparecer en pantalla el e n´mero de palabras que se han introducido y una despedida.2.5. Modifique el programa anterior de forma que las palabras se vayan guardando en un fichero ”palabras." 2. Escriba un gui´n que admita palabras (seguidas de enter ) por parte del o usuario hasta que este teclee ”salir ”.txt”. #!/bin/bash clear # Variables: CONTADOR=0 # Creamos o borramos el fichero auxiliar: cat /dev/null > palabras.txt while [ 1 ] do # Entrada de usuario: read -p "Introduce palabra: " PALABRA # Convertir a min´sculas: u 12 . Soluciones 1.

Modifique de nuevo el programa." e echo "Pulsa (’salir’) para terminar.regular si es un n´mero: u if [[ $DATO =~ [0-9] ]] then # Comprobar que la palabra solicitada es de # que ya han sido memorizadas: if [ $DATO -gt $CON ] then 13 . que las memorizar´. se le devuelva la palabra que introdujo u en esa posici´n.txt fi done echo "Has introducido $CONTADOR palabras. Consiga que si el usuario introduce un n´mero en lugar de una palabra. u #!/bin/bash # Limpiar pantalla: clear # VariableS: DATO="" CON=0 # Instrucciones: echo "Introduzca las palabras que quiera. Por ejemplo si introduce ”5”. se le devolver´ la palabra o a n´mero cinco del fichero ”palabras.txt # Bucle: while [ "$DATO" != "salir" ] do read -p "¿Palabra a guardar? " DATO # Comprobar.txt”." 3." # Borrar fichero auxiliar: cat /dev/null > palabras.PALABRA=$(echo $PALABRA|tr "A-Z" "a-z") # Salir del bucle si PALABRA es "salir": if [ "$PALABRA" == "salir" ] || [ -z "$PALABRA" ] then break else # Sumamos 1 palabra: let CONTADOR++ # Agregar palabra al fichero: echo $PALABRA >> palabras. mediante exp.

echo -e "\nERROR: No has introducido tantas palabras." # Sumar VAR a lo anterior: RES=$(expr $RES + $VAR) done # Resultado: echo " El resultado es $RES. es decir: 1 + 2 + 3 + 4 + 5.\nAdi´s.txt|grep -E "^${DATO}"|cut -f2 -d":" fi else if [ "$DATO" != "salir" ] then # Cuento una palabra m´s: a let CON++ # Guardo la palabra con su n´mero correspondiente: u echo "$CON:$DATO" >> palabras.. Medio: Cree un script que pida n´meros al usuario hasta que este teclee u la palabra ”promedio”." 5. #!/bin/bash clear # Variables: CONTADOR=0 8 http://es. Despu´s calcule la media aritm´tica8 entre todos e e ellos.txt fi fi done echo -e "\nTecleaste $CON palabras.org/wiki/Media_aritm%C3%A9tica 14 . #!/bin/bash # VariableS: RES=0 # Bucle: for VAR in $(seq 1 100) do echo "Sumando $RES + $VAR..\n" else cat palabras. Escriba un programa que calcule el resultado de sumar todos los n´meros u del 1 al 100 secuencialmente.\n" o 4.wikipedia.

" n done 7.24”.") echo "$(echo $NOMBRE|tr "_" " ") tiene $EDAD a~os.”. $SUMA / $CONTADOR"|bc|tr ". Por ejemplo una l´ n ınea ser´ ”Juan.") echo "El promedio es $SUMA entre $CONTADOR igual a ${PROMEDIO}. por ejemplo para la anterior dir´ ”Juan ıa tiene 24 a˜os. una edad expresada en a˜os." 6.txt|tr " " "_") do NOMBRE=$(echo $LINEA|cut -f1 -d".") EDAD=$(echo $LINEA|cut -f2 -d". n #!/bin/bash clear for LINEA in $(cat nombre-edad. Utilizando el fichero del ejercicio anterior haga un gui´n que diga qui´n o e de la lista es el mayor y el menor.txt” y escriıa ba un gui´n que lo recorra y diga por pantalla ”Tal nombre tiene tantos o a˜os." PROMEDIO=$(echo "scale=2. #!/bin/bash clear 15 . Cree un fichero que contenga una lista de cinco nombres de pila y. separadas por una coma." ".” para cada una de las l´ n ıneas. Guarde ese fichero como ”nombre-edad.SUMA=0 while [ 1 ] do # Entrada de usuario: read -p "Diga un n´mero: " NUMERO u # Comprobar si nos piden el promedio: if [ "$NUMERO" = "promedio" ] || [ "$NUMERO" = "PROMEDIO" ] then # Romper bucle: break fi let CONTADOR++ SUMA=$(expr $SUMA + $NUMERO) done echo "Ha introducido $CONTADOR numeros.

Con la misma lista." n if [ $EDAD -lt $EDADMENOR ] then EDADMENOR=$EDAD NOMBREMENOR=$NOMBRE fi if [ $EDAD -gt $EDADMAYOR ] then EDADMAYOR=$EDAD NOMBREMAYOR=$NOMBRE fi done echo echo "El menor es $(echo $NOMBREMENOR|tr "_" " ") con $EDADMENOR a~os.txt|tr " " "_") do NOMBRE=$(echo $LINEA|cut -f1 -d".# Variables: EDADMENOR=999 EDADMAYOR=0 NOMBREMENOR="" NOMBREMAYOR="" # Bucle: for LINEA in $(cat nombre-edad." n addgroup ejercicios fi 16 . y que haga despu´s a e un tar." n echo "El mayor es $(echo $NOMBREMAYOR|tr "_" " ") con $EDADMAYOR a~os. haga un gui´n que cree un usuario para cada uno de o ellos en su m´quina.tgz y que se guarde en /root/backups.") echo "$(echo $NOMBRE|tr "_" " ") tiene $EDAD a~os.gz (uno s´lo) de todos los directorios de usuario de la m´quina o a (excluyendo a root) con el nombre homes-backup.") EDAD=$(echo $LINEA|cut -f2 -d". #!/bin/bash clear # Comprobar si exsiste el grupo: cat /etc/group|grep "ejercicios" &> /dev/null if [ $? -ne 0 ] then echo "A~adiendo grupo ejercicios. el grupo debe ser ”ejercicios”." n echo 8.

USUUID=$(echo $linea|cut -f3 -d":") if [ $USUUID -lt 1000 ] then echo "$USUUID es un usuario de sistema..") echo "Creando usuario $NOMBRE.tgz /home if [ $? -eq 0 ] then echo "OK" else echo "ERROR" exit 1 fi 9. o #! /bin/bash clear # Bucle: for linea in $(cat /etc/passwd|tr " " "_") do # Si el usuario tiene UID < 1000 es de sistema # y hay que saltarlo..txt|tr " " "-"|tr "A-Z" "a-z") do NOMBRE=$(echo $i|cut -f1 -d".." useradd -g ejercicios -m $NOMBRE if [ $? -eq 0 ] then echo "Creado correctamente. Cree un script que borre todos los usuarios pertenecientes al grupo ”ejercicios” pero antes de borrar a cada uno debe mostrar su nombre por pantalla y pedir confirmaci´n.\n\n" o echo -n "Creando copia de seguridad de /home." else echo "ERROR creando usuario." 17 ." # exit 1 fi done echo -e "FIN de creaci´n de usuarios." tar czf /root/backups/homes-backup..# Crear directorio de backups: mkdir -p /root/backups # Bucle: for i in $(cat nombre-edad.

echo "El usuario $DIR no existe. Haga un gui´n que mire todos los directorios que haya dentro de /hoo me y que por cada uno de ellos compruebe si existe dicho usuario en el /etc/passwd." userdel -r $usuario if [ $? -eq 0 ] then echo "OK" else echo "ERROR" fi fi fi fi done 10." read -p "¿Comprimimos el directorio y lo eliminamos? (s/n): " \ -n1 SN echo 18 .. si el usuario no existe debe dar la opci´n de comprimir en un o backup y borrar el directorio de ese usuario fantasma. echo "El usuario existe.." else # El usuario no existe." cat /etc/passwd | grep $DIR &> /dev/null if [ $? -eq 0 ] then # El usuario existe.. #!/bin/bash clear for DIR in $(ls -C1 /home) do echo "Comprobando directorio $DIR..else usuario=$(echo $linea|cut -f1 -d":") # Sacar grupos del usuario y ver si tiene ’ejercicios’: groups $usuario|grep "ejercicios" &> /dev/null if [ $? -eq 0 ] then read -n 1 -p "¿Borrar al usuario ${usuario}? (Y/N): " YN echo if [[ "$YN" == "y" || "$YN" == "Y" ]] then echo -n "Borrando usuario $usuario. Antes de probarlo cree varios directorios dentro de /home.

" rm -Rf /home/$DIR echo "El directorio $DIR ha sido comprimido y eliminado." echo for nombre in $(ls ej-bucles*) do linea=$(cat $nombre|head -n 1) if [ "$linea" != "#!/bin/bash" ] then echo El archivo $nombre no tiene la primera l´nea correcta..." ı fi done 12. compruebe si est´ instalado o no. #!/bin/bash clear echo "Comprobando forma 1. o e 19 . y que compruebe que la primera l´ ınea de cada uno de ellos es ”#!/bin/bash”. ı fi done echo -e "\nComprobando forma 2:\n" for nombre in $(ls ej-bucles*) do head -n1 $nombre|grep "\#\!/bin/bash" &> /dev/null if [ $? -ne 0 ] then echo "La primera l´nea de $nombre es incorrecta. Escriba un gui´n que repase todos los ficheros de ejercicios que ha hecho o hasta ahora. # comprimiendo un backup previamente.. echo "Comprimiendo backup de $DIR." tar czf /root/backups/$DIR." fi fi done 11.if [[ "$SN" == "s" || "$SN" == "S" ]] then # Por tanto hay que borrar el directorio fantasma. y si no lo est´ de la opci´n de obtener m´s a a o a informaci´n sobre ´l o de instalarlo.tgz /home/$DIR echo "Borrando /home/$DIR. Escribe un programa que dado un nombre de paquete de Debian..

Construya un programa que escriba por pantalla una secuencia de 1 a 99.#! /bin/bash clear read -p "Introduzca el nombre del paquete: " nombre aptitude search $nombre|grep -E "^i.\n" 20 . utilice un bucle until para ello.*$nombre\ " &> /dev/null if [ $? -ne 0 ] then echo el paquete $nombre no est´ instalado a read -n1 -p "Quiere m´s informaci´n del paquete (P) o desea instalarlo (I): " opci a o echo if [ "$opcion" == "P" ] then echo informaci´n sobre el paquete $nombre o aptitude show $nombre else echo instalando el paquete $nombre aptitude install $nombre fi else echo el paquete $nombre est´ instalado a fi 13. #!/bin/bash clear contador=1 until [ $contador -eq 100 ] do echo -n "${contador} " let contador++ done echo -e "\nFin de programa.

1. asociaciones. por tomarse la molestia de comunicarme las erratas y por darme ideas para mejorar los ejercicios.com.. Revisiones El autor ir´ eventualmente publicando revisiones de esta unidad en su p´gina a a personal. as´ como a todo aqu´l o ı e que publica art´ ıculos. Por supuesto se puede contactar con el autor para contratarle para hacer nuevas unidades.6. Sin ellos el autor vivir´ en la oscuridad: Programadores. Derechos Esta gu´ se cede bajo contrato Coloriuris. y estar´ encantado de recibir sugerencias y dudas en la misma o en su a email: http://jorgefuertes. 6.. los comandos que empiezan por apt. 6..4.3.. manuales y experiencias en Internet. ıa hacktivistas.coloriuris. adaptaciones. Agradecimientos El autor quiere reflejar su agradecimiento a todas las p´ginas de Internet a que ponen a disposici´n de todo el mundo sus contenidos. cursos. ya que otras ıa distros no basadas en Debian podr´ incorporar sistemas diferentes para el ıan manejo de sus paquetes. o a 6. S´lo puede ser utilizada previa ıa o aceptaci´n del contrato de cesi´n sito en: o o http://www. etc. etc. Tambi´n quiero agradecer muy especialmente su ayuda a mis alumnos y e lectores.net/contratos/ef5af6aaa441ab9c213273fade56dca1 Dicho contrato garantiza que estoy cediendo los derechos de uso y modificaci´n sin ´nimo de lucro.2. cursos@jorgefuertes. podr´ ıa a ıa haber peque˜os cambios si se aplica a otras distribuciones de GNU. La informaci´n quiere o o ser libre. pero en n su mayor parte funcionar´ bien con la excepci´n de lo referido al sistema de a o paqueter´ de programas. webmasters. traductores.com. ya que eso favorece a la difusi´n del conocimiento y al desarrollo humano. 21 . modificaciones. Un agradecimiento muy especial a toda la comunidad del Software Libre. 6. Sobre esta unidad did´ctica a Notas y advertencias Debian: Esta gu´ est´ basada en el sistema Debian GNU/Linux.