UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO: 01/ 2015 GUIA DE LABORATORIO #4 Nombre de la Practica: Sentencias de control if , else , test Lugar de Ejecución: Laboratorio de Redes, Edificio 3 del CITT Tiempo Estimado: 3 horas MATERIA: Aplicaciones para Redes I. OBJETIVOS Que el estudiante: Conozca las estructuras de control “if, if-else,if-elif,test”. Comprenda el uso de las estructuras de decisión. Pueda crear menús de selección II. INTRODUCCION TEORICA ESTRUCTURAS DE CONTROL: Dentro de las estructuras de control encontramos dos categorías: Estructuras de decisión Estructuras de bucle ESTRUCTURAS DE DECISIÓN Son las que nos permiten decidir por un camino entre dos ó más posibles dada una condición. Si la condición se evalúa como verdadera, se cumplirá el camino inmediato de secuencias, en caso de ser evaluada la condición como falsa, se ejecutará el bloque de secuencias alternativas. Los códigos de terminación En UNIX los comandos terminan devolviendo un código numérico al que se llama código de terminación (exit status) que indica si el comando tuvo éxito o no. Aunque no es obligatorio que sea así, normalmente un código de terminación 0 significa que el comando terminó correctamente, y un código entre 1 y 255 corresponde a posibles códigos de error. En cualquier caso siempre conviene consultar la documentación del comando para interpretar mejor sus códigos de terminación. Por ejemplo el comando if devuelve 0 cuando no encuentra diferencias entre los archivos comparados, 1 cuando hay diferencias, y 2 cuando se produce algun error. Las sentencias return y exit Los comandos UNIX retornan un código de terminación indicando el resultado de una operación, pero qué pasa si estamos haciendo una función: ¿Cómo retornamos el código de terminación? Para ello podemos utilizar la variable especial ?, cuyo valor es $?, y que indica el código de terminación del último comando ejecutado por el shell. Por ejemplo: $cd direrroneo -bash: cd: direrroneo: No such file or directory $echo $? 1 Aplicaciones para Redes 1 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I Al haber fallado el ultimo comando $? vale 1. Sin embargo, si el comando se ejecuta bien $? valdrá 0: $cd direxistente echo $? 0 La variable ? debe ser leída justo después de ejecutar el comando, luego es muy típico guardar su valor en una variable ct=$? para su posterior uso. El otro elemento que necesitamos para devolver el código de terminación de una función es la sentencia return [ct], la cual hace que abandonemos la función devolviendo el código de terminación que pasemos en ct. El parámetro ct es opcional y se puede omitir, en cuyo caso se devuelve el valor de la variable ? en el momento de ejecutarse return. return puede ser usada sólo dentro de las funciones y scripts ejecutados con source. Por otro lado, la sentencia exit [ct] puede ser ejecutada en cualquier sitio, y lo que hace es abandonar el script (aunque se ejecute dentro de una función). La sentencia exit suele usarse para detectar situaciones erróneas que hacen que el programa deba detenerse, aunque a veces se utiliza para “cerrar” un programa. Operadores lógicos y códigos de terminación Podemos combinar varios códigos de terminación de comandos mediante los operadores lógicos and (representado con &&) or (representado con ||) y not (representado con !). Estas operaciones, al igual que en otros lenguajes como C o Java, funcionan en shortcut, es decir el segundo operando sólo se evalúa si el primero no determina el resultado de la condición. Segun esto la operación: if cd /tmp && cp 001.tmp $HOME; then ........ f Ejecuta el comando cd /tmp, y si éste tiene éxito (el código de terminación es 0), ejecuta el segundo comando cp 001.tmp $HOME, pero si el primer comando falla ya no se ejecuta el segundo porque para que se cumpla la condición ambos comandos deberían de tener éxito (si un operando falla ya no tiene sentido evaluar el otro). Por otro lado el operador || ejecuta el primer comando, y sólo si éste falla se ejecuta el segundo. Por ejemplo: if cp /tmp/001.tmp ~/d.tmp || cp /tmp/002.tmp ~/d.tmp then ..... f Aquí si el primer comando tiene éxito ya no se ejecuta el segundo comando (ya que tiene éxito el primer comando). Obsérvese que a diferencia de C, el código de terminación 0 es el que indica verdadero, y cualquier otro código indica falso. El operador ! niega un código de terminación. Por ejemplo: if ! cp /tmp/001.tmp ~/d.tmp; then Procesa el error fi Aplicaciones para Redes 2 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I Test Condicionales La sentencia if lo unico que sabe es evaluar códigos de terminación. Pero esto no significa que sólo podamos comprobar si un comando se ha ejecutado bien. El comando interno test nos permite comprobar otras muchas condiciones, que le pasamos como argumento, para acabar devolviéndonos un código de terminación. Una forma alternativa al comando test es el operador [ ] dentro del cual metemos la condición a evaluar, es decir, test cadena1 = cadena2 es equivalente a [ cadena1 = cadena2 ]. Los espacios entre los corchetes y los operando, o entre los operando y el operador de comparación = son obligatorios. Operadores lógicos con TEST -a -o ! Y lógica, verdadero, si ambos lados del operador son verdaderos. O lógica, verdadero, si cualquier de los lados del operador es verdadero. No lógica, verdadero, si la condición es falsa. Comparación de cadena Los operadores de comparación de cadenas se resumen en la siguiente tabla. Las comparaciones que realizan < y > son lexicográficas, es decir comparaciones de diccionario, donde por ejemplo q es mayor que perro. Operador Verdadero si..... str1 = str2 Las cadenas son iguales str1 != str2 Las cadenas son distintas -n str1 str1 es no nula y tiene longitud mayor a cero -z str1 str1 es nula (tiene longitud cero) Comparación numérica de enteros El shell también permite comparar variables que almacenan cadenas interpretando estas como números, para ello se deben utilizar los operadores de la siguiente tabla. Operador Descripción -lt Less tha (<) -le Less than or Equal (<=) -eq Equal (=) -ge Greater than or Equal (>=) -gt Greater than -ne Not Equal (>) (!=) Comprobar atributos de archivos El tercer tipo de operadores de comparación nos permite comparar atributos de archivos. Existen 22 operadores de este tipo que se resumen en la siguiente tabla. Operador Verdadero si..... -a archivo archivo existe -b archivo archivo existe y es un dispositivo de bloque -d archivo archivo existe y es un directorio Aplicaciones para Redes 3 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I -e archivo archivo existe (equivalente a -a) -f archivo archivo existe y es un archivo regular -h archivo archivo existe y es un enlace simbólico -L archivo archivo existe y es un enlace simbólico -N archivo archivo existe y fue modificado desde la última lectura -r archivo archivo existe y podemos leerlo -s archivo archivo existe y no está vacío -w archivo archivo existe y tenemos permiso de escritura -x archivo archivo existe y tenemos permiso de ejecución, o de búsqueda si es un directorio archivo1 -nt archivo2 La fecha de modificación de archivo1 es más moderna que (Newer Than) la de archivo2 archivo1 -ot archivo2 La fecha de modificación de archivo1 es más antigua que (Older than) la de archivo2 archivo1 -ef archivo2 archivo1 y archivo2 son el mismo archivo (Equal File) La construccion if -then if [condición] then ordenes fi •La sentencia if finaliza con la palabra reservada fi (if escrito al revés). •El sangrado no es necesario, pero hace lucir al código mas elegante. Nota: Los corchetes que están alrededor de las condiciones son necesarios y deben estar rodeados por espacios en blanco. La construcción if -then -else if [condición] then ordenes_en_caso_de_condición_verdadera else ordenes_en_caso_de_condición_falsa fi La construcción if -then -elif if [condicion_1] then ordenes elif [condicion_2] then ordenes elif [condicion_3] then ordenes Aplicaciones para Redes 4 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I else ordenes fi III. MATERIALES Y EQUIPO Para la No. 1 2 realización de la guía de práctica se requerirá lo siguiente: Requerimiento PC de escritorio con CentOS Guía de laboratorio 4 Cantidad 1 1 IV. PROCEDIMIENTO 1. Digite el siguiente script, analice y describa su comportamiento #!/bin/bash echo "Introduzca un numero: " read input if [ $input -lt 5 ]; then echo "El numero es menor que 5" elif [ $input -eq 5 ]; then echo "El numero es igual a 5" elif [ $input -gt 5 ]; then echo "El numero es mayor que 5" else echo "No introdujo un numero" fi ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ ___________________________________________________________ 2. Digite el siguiente script, que busca palabras y nos muestra el total de palabras encontradas, para poderlo realizar tomar en cuenta que se necesitan dos parámetros el primero que es el nombre del archivo y el segundo que es la letra o palabra a buscar. #!/bin/bash if [ $# -ne 2 ]; then echo "Necesito dos argumentos, el primero" echo "es el fichero donde debo buscar y" echo "el segundo es lo que quieres que" echo "busque." echo " " echo "Uso: $0 <fichero> <patron_busqueda>" echo " " exit fi FICHERO=$1 BUSQUEDA=$2 if [ ! -e $FICHERO ] then echo "El fichero no existe" exit fi Aplicaciones para Redes 5 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I NUM_VECES=`cat "$FICHERO" | grep --count "$BUSQUEDA"` if [ $NUM_VECES -eq 0 ]; then echo "El patron de busqueda \"$BUSQUEDA\" no fue encontrado" echo "en el fichero $FICHERO " else echo "El patron de busqueda \"$BUSQUEDA\" fue encontrado" echo "en el fichero $FICHERO $NUM_VECES veces" fi 3. Script que copia un archivo a un directorio determinado por el usuario, tomar en cuenta que se necesitan dos parámetros el primero es el archivo a copiar y el segundo es el directorio en el cual se copiara el archivo. #!/bin/bash if [ $# -eq 2 ] then if test-r $1 then if test-d $2 then cp $1$2 else echo directorio inexistente fi else echo archivo inexistente fi else echo numero de parámetros incorrectos fi 4. Evaluación de cadenas de caracteres #!/bin/bash echo "Comparacion de dos string" echo -n "Ingrese la primera cadena de caracteres: " read var1 echo -n "Ingrse la segunda cadena de caracteres: " read var2 if [ "$var1" = "$var2" ]; then echo expresión evaluada como verdadera else echo expresión evaluada como falsa fi 5. Script que me permite visualizar los comandos digitados por un usuario en especifico #!/bin/bash echo "Especificar el directorio del usuario" echo "EJ: /root" read -s directorio FILE="$directorio/.bash_history" if [ 'test -f $FILE' ]; then echo 'el archivo' $FILE 'existe' Aplicaciones para Redes 6 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I cat $FILE > directorio echo "El contenido del archivo a sido redireccionado al archivo directorio" else echo 'archivo no encontrado' fi 6. Uso del if con test. #!/bin/bash echo "Comprobar si un usuario y su password son iguales" echo udb0108 > usuario.txt echo udb2008 > password.txt usuario_txt=$( cat usuario.txt ) password_txt=$( cat password.txt ) echo -n "Ingrese su usuario: " read usuario echo -n "Ingrese su password: " read -s password echo "" echo echo echo echo "********************************************" "Valor del archivo usuario: " $usuario_txt "Valor del archivo password: " $password_txt "********************************************" echo echo echo echo "********************************************" "Valor de la variable usuario: " $usuario "Valor de la variable password: " $password "********************************************" #tanto la primera evaluacion como la segunda debe dar verdadero #si una de ellas falla fallan las dos if [ $usuario_txt = $usuario -a $password_txt = $password ] then echo "El usuario y el password coinciden" else echo "El usuario y el password no coiciden" fi #con solo que uno de ellos sea verdadero el resultado es verdadero #y entramos al if if [ $usuario_txt = $usuario -o $password_txt = $password ] then echo "Al menos uno de los dos si era igual" else echo "Ninguno de los dos eran iguales" fi Aplicaciones para Redes 7 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I 7. Script que me permite verificar si la variable contiene información. #!/bin/bash clear echo -n "Ingrese usuario: " read usuario if [ -z "$usuario" ] 2>/dev/null then echo "Usted no a ingresado al usuario no puedo dejarlo en blaco" sleep 3 clear ./validaciondeentrada else echo "usuario: $usuario" fi 8. Creación de menus de selección. #!/bin/bash clear #menu de profesor echo -n "Usuario: " read usuario clear echo "------->Usuario: $usuario<-------" echo "[1] Materia a Impartir [2] Crear Evaluacion [3] Ver notas de evaluaciones [4] Agregar alumnos a determinada materia [5] Salir del sistema" echo -n "?: " read opcion #decido que opcion tomar if [ $opcion -eq 1 ] then clear echo "Ingresastes en la opcion uno" sleep 3 elif [ $opcion -eq 2 ] then clear echo "Ingresastes en la opcion Dos" sleep 3 elif [ $opcion -eq 3 ] then clear echo "Ingresastes en la opcion Tres" sleep 3 elif [ $opcion -eq 4 ] then Aplicaciones para Redes 8 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I clear echo "Ingresastes en la opcion cuatro" sleep 3 elif [ $opcion -eq 5 ] then clear echo "| Por favor espere" sleep 1 clear echo "/ Por favor espere" sleep 1 clear echo "- Por favor espere" sleep 1 clear echo '\ Por favor espere' sleep 1 clear echo "| Por favor espere" sleep 1 clear echo "/ Por favor espere" sleep 1 clear echo "- Por favor espere" sleep 1 clear echo '\ Por favor espere' sleep 1 clear exit else clear echo "..::Opcion no valida::.." sleep 3 ./menu_profesores.sh fi 9. Trabajando solo con test en la linea de comando verificando los resultados arrojados por el parámetro $? y analice el por que de estas STR="abcd" test "$STR" = abcd echo $? test "$STR" != abcd echo $? test -z "" echo $? test -n "" echo $? Aplicaciones para Redes 9 Guía # 4: Error: no se encuentra la fuente de referenciaSentencias de Control Parte I Veamos un ejemplo que aclara algunos errores comunes. STR = "abcd " test $STR = "abcd " echo $? test "$STR" = "abcd " echo $? Vemos que STR es "abcd ", (con un espacio al final), en el primer test lo comparamos con "abcd " (también con un espacio al final) y debería dar verdadero pero dio falso, ¿ a que se debe ? Esto se produce porque el interprete primero realiza la sustitución del valor de la variable STR y luego remueve el espacio que tiene al final STR, porque supone que están demás, ósea que el comando test ejecutado queda así : test "abcd" = "abcd " y efectivamente es falso. Para que esto no suceda, en el segundo test la variable STR aparece entre comillas ("$STR"), de esta manera el interprete no le quita el espacio final y test recibe el parámetro correctamente dando la comparación verdadera, esta es la forma correcta de hacerlo. V. DISCUSION DE RESULTADOS 1. Crear un menu el cual llame a cada uno de los script realizado en la practica. 2. Crear un script que me verifique si un archivo cualquiera existe, si existe que me diga “el archivo existe”, sino mandara un mensaje que diga “el archivo no existe” luego creara uno automaticamente, con el nombre indicado por medio de una redireccion. 3. Crear un script que verifique si un archivo tiene permisos de ejecución, si los tiene que diga “el archivo tiene permisos de ejecucion”, sino se le deben dar permisos de ejecución al archivo y luego imprimira un mensaje que diga “el comando fue efectuado con exito”, paso siguiente sera imprimir un mensaje que diga “permisos cambiados exitosamente”. 4. Crear un script que me permita contar el numero de veces que esta conectado el usuario root. VI. INVESTIGACION COMPLEMENTARIA Investigar sobre la estructura de decisión case. VII. BIBLIOGRAFIA Linux. Manual de Administración, Steve Shah, McGraw-Hill 2001 Linux. Guía de instalación y administración, Vicente López Camacho, McGraw-Hill, 2001 Aplicaciones para Redes 10