universidad don bosco facultad de estudios tecnológicos escuela de

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