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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

*$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. utilice un bucle until para ello. #!/bin/bash clear contador=1 until [ $contador -eq 100 ] do echo -n "${contador} " let contador++ done echo -e "\nFin de programa.\n" 20 . Construya un programa que escriba por pantalla una secuencia de 1 a 99.

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

Sign up to vote on this title
UsefulNot useful