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

quiz´ el resultado de un cat.1. 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. o 5 Programaci´n de guiones de Bash. Estas construcciones nos permiten ejecutar o la misma rutina 1 repetidamente. 2 Condici´n que de cumplirse marca el fin de un bucle. a siendo cada elemento de esta secuencia parte de la iteraci´n 6 a trav´s de o e una variable. por ejemplo con condici´n de e ıa o carrera [ 1 ]. Es decir. hay tres estructuras que nos permitir´n realizar bucles. 1. lo que producir´ la salida del bucle. En el bash scripting 5 .1. o 6 Cada ejecuci´n del bucle o rutina. que la condici´n especificada debe ser verdadera o o para que el contenido del bucle pueda ejecutarse. 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 . 4 Por ejemplo un fichero." 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. 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.1. o 3 . son una parte fundamental del control de flujo en e cualquier lenguaje de programaci´n. Bucles while Una estructura while se ejecutar´ mientras se cumpla una determinada a condici´n de carrera. o 3 Por ejemplo de 1 a 10 o de la ”a” a la ”z”. que siempre ser´ verdadera. 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. Supuestamente algo en dicho contenido producir´ variaciones en la condici´n de carrera hasta provocar que a o esta sea falsa. ıa Tambi´n podr´ construirse un while infinito. o 2. a Estas son: while: Ejecutar´ la rutina mientras se cumpla una determinada cona dici´n de carrera. siendo cada l´ a ınea del fichero objeto de una iteraci´n del bucle. u o 2.

10. Como se puede observar el bucle ha sido ejecutado 9 veces. 10." Este programa estar´ todo el rato preguntando al usuario que si hay alguien a ah´ S´lo se detendr´ al contestar ”no”. cumple la condici´n de ser menor de 10. usuario." break else echo "No entiendo. con lo que incumple la condici´n de carrera. 10. si hay un bucle o infinito en un programa est´ se quedar´ colgado en dicho bucle y no continuar´ e a a nunca. o 2. 10. respuesta que causar´ la salida del bucle ı. 10. Bucle infinito En programaci´n un bucle infinito se entiende como un error. 10.2. o while [ 1 ] do echo "¿Hay alguien ah´?" ı read ENTRADA if [ "$ENTRADA" == "si" ] then echo "Hola. 10.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. Por ejemplo: o #!/bin/bash # La condici´n [ 1 ] es siempre verdadera. 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." elif [ "$ENTRADA" == "no" ] then echo "Pues si no hay nadie me voy. 10. o a a 4 . 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." fi done echo "Fin de programa. Como $CONTADOR es igual a 1. as´ que el buo ı cle comienza a ejecutare.

" ser´ ejecutada normalmente. Observe que la l´ o ınea final echo "Fin de programa. a La estructura de un bucle for. 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 no se sale con un break. haga la prueba en el terminal: #> seq 1 10 1 2 3 4 5 6 7 8 9 10 5 ." Como se ver´ el programa real es muy parecido al de pseudoc´digo. expresiones matem´ticas.. o Son utiles para recorrer secuencias de n´meros." 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. 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. Si a o por el contrario hubi´semos utilizado una instrucci´n ”exit”. y esta ultima l´ ´ ınea nunca llegar´ a ejecutarse.mediante la instrucci´n break. la salida hubiese e o sido total. Bucles for Los bucles de tipo for recorren una secuencia de principio a fin. etc. ya que s´lo hemos ordenado la salida del bucle. de todo el programa. en pseudoc´digo. l´ ´ u ıneas de un fichero de texto. ıa Recuerde: Utilize break para salir de un bucle ignorando la condici´n de o carrera. e introducen en una variable el valor de la actual iteraci´n. Si desea ver que hace.

introducirlo en la variable VAR y ejecutar lo que hay entre las l´ ıneas do y done. 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 . 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. la que recorre una secuencia de n´meros y la que recorre las l´ u ıneas de un fichero. Construcci´n t´ o ıpica Vamos a ver tres construcciones muy t´ ıpicas. En el caso de este programa el contenido entre estas l´ ıneas ser´ ejecutado veinte veces.1. por cada uno de los n´meros a u de la secuencia.1.2. 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." Lo que har´ bash al ejecutar ese programa es.1.3. 3. y adicionalmente veremos como ejecutar un bucle for en la consola. 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.1. sin escribir un script.

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

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

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

y que haga despu´s a e un tar. o e 10 . 11. y que compruebe que la primera l´ ınea de cada uno de ellos es ”#!/bin/bash”. el grupo debe ser ”ejercicios”.tgz y que se guarde en /root/backups. 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. haga un gui´n que cree un usuario para cada uno de o ellos en su m´quina. 12. si el usuario no existe debe dar la opci´n de comprimir en un o backup y borrar el directorio de ese usuario fantasma. Escribe un programa que dado un nombre de paquete de Debian.gz (uno s´lo) de todos los directorios de usuario de la m´quina o a (excluyendo a root) con el nombre homes-backup. 8. Escriba un gui´n que repase todos los ficheros de ejercicios que ha hecho o hasta ahora.7. 9. 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. compruebe si est´ instalado o no. Con la misma lista. 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. Antes de probarlo cree varios directorios dentro de /home. o 10. y si no lo est´ de la opci´n de obtener m´s a a o a informaci´n sobre ´l o de instalarlo.

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

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

" 3. Modifique de nuevo el programa." # Borrar fichero auxiliar: cat /dev/null > palabras.txt # Bucle: while [ "$DATO" != "salir" ] do read -p "¿Palabra a guardar? " DATO # Comprobar." e echo "Pulsa (’salir’) para terminar. u #!/bin/bash # Limpiar pantalla: clear # VariableS: DATO="" CON=0 # Instrucciones: echo "Introduzca las palabras que quiera. mediante exp.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 .txt fi done echo "Has introducido $CONTADOR palabras. Por ejemplo si introduce ”5”.txt”. que las memorizar´. se le devolver´ la palabra o a n´mero cinco del fichero ”palabras. Consiga que si el usuario introduce un n´mero en lugar de una palabra.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. se le devuelva la palabra que introdujo u en esa posici´n.

es decir: 1 + 2 + 3 + 4 + 5. Despu´s calcule la media aritm´tica8 entre todos e e ellos." 5. #!/bin/bash # VariableS: RES=0 # Bucle: for VAR in $(seq 1 100) do echo "Sumando $RES + $VAR.." # Sumar VAR a lo anterior: RES=$(expr $RES + $VAR) done # Resultado: echo " El resultado es $RES.wikipedia.\nAdi´s.\n" o 4.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.echo -e "\nERROR: No has introducido tantas palabras.txt fi fi done echo -e "\nTecleaste $CON palabras.. #!/bin/bash clear # Variables: CONTADOR=0 8 http://es.org/wiki/Media_aritm%C3%A9tica 14 . Medio: Cree un script que pida n´meros al usuario hasta que este teclee u la palabra ”promedio”. Escriba un programa que calcule el resultado de sumar todos los n´meros u del 1 al 100 secuencialmente.\n" else cat palabras.

#!/bin/bash clear 15 .” para cada una de las l´ n ıneas.”. 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. separadas por una coma." ".") echo "El promedio es $SUMA entre $CONTADOR igual a ${PROMEDIO}.txt|tr " " "_") do NOMBRE=$(echo $LINEA|cut -f1 -d". Por ejemplo una l´ n ınea ser´ ”Juan.24”. una edad expresada en a˜os." 6. por ejemplo para la anterior dir´ ”Juan ıa tiene 24 a˜os." n done 7.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.") echo "$(echo $NOMBRE|tr "_" " ") tiene $EDAD a~os. $SUMA / $CONTADOR"|bc|tr ".") EDAD=$(echo $LINEA|cut -f2 -d".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. n #!/bin/bash clear for LINEA in $(cat nombre-edad. Guarde ese fichero como ”nombre-edad. Cree un fichero que contenga una lista de cinco nombres de pila y.

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

." else echo "ERROR creando usuario.." # exit 1 fi done echo -e "FIN de creaci´n de usuarios." 17 .\n\n" o echo -n "Creando copia de seguridad de /home.# Crear directorio de backups: mkdir -p /root/backups # Bucle: for i in $(cat nombre-edad.txt|tr " " "-"|tr "A-Z" "a-z") do NOMBRE=$(echo $i|cut -f1 -d". USUUID=$(echo $linea|cut -f3 -d":") if [ $USUUID -lt 1000 ] then echo "$USUUID es un usuario de sistema." useradd -g ejercicios -m $NOMBRE if [ $? -eq 0 ] then echo "Creado correctamente." tar czf /root/backups/homes-backup.. 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. 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.tgz /home if [ $? -eq 0 ] then echo "OK" else echo "ERROR" exit 1 fi 9.") echo "Creando usuario $NOMBRE..

" userdel -r $usuario if [ $? -eq 0 ] then echo "OK" else echo "ERROR" fi fi fi fi done 10.. Antes de probarlo cree varios directorios dentro de /home...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. 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.. 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." else # El usuario no existe. #!/bin/bash clear for DIR in $(ls -C1 /home) do echo "Comprobando directorio $DIR. echo "El usuario $DIR no existe." read -p "¿Comprimimos el directorio y lo eliminamos? (s/n): " \ -n1 SN echo 18 ." cat /etc/passwd | grep $DIR &> /dev/null if [ $? -eq 0 ] then # El usuario existe.

o e 19 ." 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. compruebe si est´ instalado o no.if [[ "$SN" == "s" || "$SN" == "S" ]] then # Por tanto hay que borrar el directorio fantasma. ı 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.tgz /home/$DIR echo "Borrando /home/$DIR." rm -Rf /home/$DIR echo "El directorio $DIR ha sido comprimido y eliminado." tar czf /root/backups/$DIR. y que compruebe que la primera l´ ınea de cada uno de ellos es ”#!/bin/bash”. #!/bin/bash clear echo "Comprobando forma 1.. echo "Comprimiendo backup de $DIR.. y si no lo est´ de la opci´n de obtener m´s a a o a informaci´n sobre ´l o de instalarlo.. Escriba un gui´n que repase todos los ficheros de ejercicios que ha hecho o hasta ahora. # comprimiendo un backup previamente." fi fi done 11.. Escribe un programa que dado un nombre de paquete de Debian." ı fi done 12.

*$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 read -p "Introduzca el nombre del paquete: " nombre aptitude search $nombre|grep -E "^i. Construya un programa que escriba por pantalla una secuencia de 1 a 99. #!/bin/bash clear contador=1 until [ $contador -eq 100 ] do echo -n "${contador} " let contador++ done echo -e "\nFin de programa. utilice un bucle until para ello.\n" 20 .

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

Sign up to vote on this title
UsefulNot useful