shell scripting

23
SHELL SCRIPTING 05/08/2013 Sistemas Operativos: Proyecto Final En este reporte contiene la descripción acerca del proyecto final para la materia de sistemas operativos así como conceptos adicionales que se nos fueron requeridos. Mora Ruiz Alejandro. Pantoja Sánchez Emmanuel. Solís Granados Saúl. Tamayo De La Torre Roberto Eduardo

Upload: roberto-eduardo-de-la-torre

Post on 29-Nov-2015

140 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Shell Scripting

SHELL SCRIPTING

05/08/2013 Sistemas Operativos: Proyecto Final

En este reporte contiene la descripción acerca del proyecto final para

la materia de sistemas operativos así como conceptos adicionales que

se nos fueron requeridos.

Mora Ruiz Alejandro.

Pantoja Sánchez Emmanuel.

Solís Granados Saúl.

Tamayo De La Torre Roberto Eduardo

Page 2: Shell Scripting

Shell scripting

Página 1

Shell scripting S I S T E M A S O P E R A T I V O S : P R O Y E C T O F I N A L

Introducción.

Un Shell Script o un Bash Script no es más que un archivo de texto-plano que contiene comandos del

Shell. Pueden ser ejecutados escribiendo su nombre a una Shell, o poniendo su nombre en otro script de

Shell, básicamente es como si se tratara de programar un ejecutable (.exe) de Windows, solo que en este

caso es de Linux (.sh).

Con el fin de terminar la materia de 6to cuatrimestre, sistemas operativos, se realizó este proyecto final,

que es básicamente sobre el Shell scripting, se nos pidió realizar las dos últimas practicas utilizando base

de datos y a su vez escoger entre ZENITY y WHIPTAIL para realizarlo. En este reporte se encontrara con

una investigación acerca de estos dos, así como las prácticas realizadas.

Page 3: Shell Scripting

Shell scripting

Página 2

Zenity.

Zenity, Zen Dialogs, es un software que permite generar diálogos simples empleando la biblioteca de GTK+,

ideado como sustituto de gdialog para GNOME2 y dialog en consola. Puede usar Zenity para interactuar

gráficamente con el usuario con menús o cajas de diálogos ya pre configurado y combinable entre sí.

Zenity es una herramienta de GNOME que se puede descargar, pero está en los repositorios de algunas

distribuciones y en otras como Ubuntu ya está instalado por defecto

Soporta diferentes tipos de diálogos

Dialogo de calendario.

Dialogo de contraseña.

Dialogo de escala.

Dialogo de formularios.

Dialogo de lista.

Dialogo de mensaje.

Dialogo de progreso.

Dialogo de selección de archivos.

Dialogo de selección de color.

Dialogo para la entrada de texto.

Dialogo para el texto de información.

Icono de notificación.

Dialogo de calendario.

Para utilizar este dialogo se usa la opción --calendar, zenity devuelve la fecha seleccionada a la salida

estándar si no se especifica línea de comando, el dialogo utiliza la fecha actual.

El dialogo de calendario soporta varias opciones:

--text=texto: Especifica el texto que se muestra en el diálogo del calendario.

--day=día: Especifica el día que se selecciona en el diálogo del calendario. «Día» debe ser un

número entre 1 y 31 ambos incluidos.

--month=mes: Especifica el mes que se selecciona en el diálogo del calendario. «Mes» debe ser un

número entre 1 y 12 ambos incluidos.

--year=año: Especifica el año que se selecciona en el diálogo del calendario.

--date-format=formato: Especifica el formato que se devuelve desde el diálogo de calendario

después de la selección de la fecha. El formato predeterminado depende de configuración regional.

«Formato» debe ser un formato que sea compatible con la función strftime, por ejemplo %A

%d/%m/%y.

Page 4: Shell Scripting

Shell scripting

Página 3

Dialogo de contraseña.

Se utiliza la opción --password para crear un diálogo de contraseña.

El diálogo de contraseña soporta la siguiente opción:

--username: Mostrar el campo de nombre de usuario.

Dialogo de escala.

Se utiliza la opción --scale para crear un diálogo de escala.

El diálogo de escala soporta las siguientes opciones:

--text=TEXTO: Establezca el texto del diálogo. (Predeterminado: «Ajustar el valor de la escala»).

--value=VALOR: Establezca el valor inicial. (Predeterminado: 0) Debe especificar un valor que esté

entre los valores mínimo y máximo.

--min-value=VALOR: Establezca el valor mínimo. (Predeterminado: 0).

--max-value=VALOR: Establezca el valor máximo. (Predeterminado: 100).

--step=VALOR: Establezca el tamaño del paso. (Predeterminado: 1).

--print-partial: Imprimir el valor a la salida estándar cuando se cambie el valor.

--hide-value: Ocultar valor en un diálogo.

Dialogo de formularios.

Se usa la opción --forms para crear un diálogo de formularios.

Page 5: Shell Scripting

Shell scripting

Página 4

El diálogo de formularios soporta las siguientes opciones:

--add-entry=nombre_del_campo: Añadir una entrada nueva en el diálogo de formularios.

--add-password=nombre_del_campo: Añadir una contraseña nueva en el diálogo de formularios.

(Ocultar el texto).

--add-calendar=nombre_del_campo: Añadir un calendario nuevo en el diálogo de formularios.

--text=TEXTO: Establezca el texto del diálogo.

--separator=SEPARADOR: Establecer el carácter separador. (Predeterminado: «|»).

--forms-date-format=PATRÓN: Establecer el formato de la fecha que se devuelve. El formato

predeterminado depende de su configuración regional. «formato» debe ser un formato que sea

compatible con la función strftime, por ejemplo %A %d/%m/%y.

Dialogo de lista.

Use la opción --list para crear un diálogo de lista. Zenity devuelve las entradas en la primera columna de

texto de las filas seleccionadas a la salida estándar.

Los datos para el diálogo deben especificarse columna por columna, fila por fila. Puede proporcionar datos

al diálogo a través de la entrada estándar. Cada entrada se debe separar por un carácter de línea nueva.

Se utiliza la opción --checklist o --radiolist, cada fila debe comenzar con «TRUE» o «FALSE».

El diálogo de lista soporta las siguientes opciones:

Page 6: Shell Scripting

Shell scripting

Página 5

--column=columna: Especifica el encabezado de la columna mostrada en el diálogo de lista. Debe

especificar una opción --column por cada columna que quiera mostrar en el diálogo.

--checklist: Especifica que la primera columna en el diálogo de lista contiene casillas de marcado.

--radiolist: Especifica que la primera columna en el diálogo de lista contiene casillas de opción.

--editable: Permite editar los elementos mostrados.

--separator=separador: Específica qué cadena de caracteres se utilizará cuando el diálogo de lista

devuelva las entradas seleccionadas.

--print-column=columna: Especifica qué columna debería imprimirse hasta la selección. La columna

predeterminada es '1', 'ALL' puede usarse para imprimir todas las columnas.

Dialogo de progreso.

Se utiliza la opción --progress para crear un diálogo de progreso. Zenity lee línea por línea los datos desde

la entrada estándar. Si una línea se antepone con #, el texto se actualiza con el texto en esa línea. Si una

línea contiene solamente un número, el porcentaje se actualiza con ese número.

El diálogo de progreso soporta las siguientes opciones:

--text=texto: Especifica el texto que se muestra en el diálogo de progreso.

--percentage=porcentaje: Especifica el porcentaje inicial que se establece en el diálogo de progreso.

--auto-close: Cierra el diálogo de progreso cuando se ha alcanzado 100%.

--pulsate: Especifica que la barra de progreso pulse hasta que se lea un carácter EOF desde la

entrada estándar.

Dialogo de selección de archivos.

Se utiliza la opción --file-selection para crear un diálogo de selección de archivos. Zenity devuelve los

archivos o carpetas seleccionadas a la salida estándar. El modo predefinido de un diálogo de selección de

archivo es «abrir».

Page 7: Shell Scripting

Shell scripting

Página 6

El diálogo de selección de archivo soporta las siguientes opciones:

--filename=nombre_de_archivo: Especifica el archivo o carpeta que se selecciona en el diálogo de

selección de archivo cuando el diálogo se muestra por primera vez.

--multiple: Permite seleccionar archivos múltiples en el diálogo de selección.

--directory: Permite solamente la selección de carpetas en el diálogo de selección de archivos.

--save: Establece el diálogo de selección de archivo en el modo «guardar».

--separator=separador: Especifica la cadena que se usará para dividir la lista de nombres de

archivo devuelta.

Dialogo de selección de color.

Se usa la opción --color-selection para crear un diálogo de selección de color.

El diálogo de selección de color soporta las siguientes opciones:

--color=VALOR: Establezca el color inicial ()ej: #FF0000).

Page 8: Shell Scripting

Shell scripting

Página 7

--show-palette: Mostrar la paleta.

Dialogo para la entrada de texto.

Se usa la opción -entry para crear un diálogo de entrada de texto. Zenity devuelve a la salida estándar el

contenido del texto introducido.

El diálogo de entrada de texto soporta las siguientes opciones:

--text=texto: Especifica el texto que se muestra en el diálogo de entrada de texto.

--entry-text=texto: Especifica el texto que se muestra en el campo de entrada del diálogo de

entrada.

--hide-text: Oculta el texto en el campo de entrada del diálogo de entrada de texto

.

Dialogo para el texto de información.

Se utiliza la opción --text-info para crear un diálogo de texto de información.

El diálogo de texto de información soporta las siguientes opciones:

Page 9: Shell Scripting

Shell scripting

Página 8

--filename=nombre_de_archivo: Especifica un archivo que se carga en el diálogo de texto de

información.

--editable: Permite que el texto mostrado sea editado. El texto editado se devuelve por la salida

estándar cuando el diálogo se cierra.

--font=TIPOGRAFÍA: Especifica la tipografía del texto.

--checkbox=TEXTO: Activar una casilla para usarla como «He leído y acepto los términos».

--html: Activar el soporte de HTML.

--url=URL: Establecer un URL en vez de un archivo. Sólo funciona si usa la opción «--html».

Icono de notificación.

Use la opción --notification para crear un icono de notificación.

--text=texto: Especifica el texto que se mostrara en el área de la notificación.

Dialogo de mensaje.

Para cada tipo, se utiliza la opción --text para especificar el texto que se muestra en el diálogo.

Page 10: Shell Scripting

Shell scripting

Página 9

Use la opción --warning para crear un diálogo de advertencia.

Use la opción --error para crear un diálogo de error.

Use la opción --info para crear un diálogo de información.

Use la opción --question para crear un diálogo de pregunta.

Page 11: Shell Scripting

Shell scripting

Página 10

Whiptail

Es un programa que permitirá presentar una serie de preguntas o mensajes en pantalla utilizando los

cuadros de diálogo desde un script de shell. En la actualidad, se aplican estos tipos de cuadros de diálogo:

yes/no text height width- (Texto yes/no)

Aparecerá un yes/no cuadro de diálogo si la altura de filas tamaño por columnas de ancho. La cadena

especificada por el texto se muestra en el cuadro de diálogo. Si esta cadena es demasiado larga para ser

instalado en una línea, se dividirá automáticamente en varias líneas en los lugares apropiados. La cadena

de texto puede contener también la sub-cadena "\n" o caracteres de nueva línea `\n' para controlar los

saltos de línea explícitamente. Este cuadro de diálogo sirve para hacer preguntas que requieren que el

usuario responda sí o no. El cuadro de diálogo tiene un botón Yes y un botón No, en la que el usuario puede

cambiar entre presionando la tecla TAB.

Ejemplo:

whiptail - título "Ejemplo de diálogo" - yesno "Este es un ejemplo de un sí / no cuadro." 8 78

exitstatus = $?

if [$ exitstatus = 0] y luego

echo "El usuario selecciona Sí".

más

echo "No. seleccionado Usuario"

fi

echo "(estado de salida fue de $ exitstatus)"

Aparecerá un cuadro de diálogo con dos botones etiquetados Sí y No.

infobox text height width

Un cuadro de información es básicamente un cuadro de mensaje. Sin embargo, en este caso, whiptail

terminará inmediatamente después de visualizar el mensaje para el usuario. La pantalla no se borra cuando

sale whiptail, de modo que el mensaje permanecerá en la pantalla hasta que la llamada de script de shell

lo libere más tarde. Esto es útil cuando se quiere informar al usuario de que algunas operaciones que se

llevan a cabo pueden requerir de algún tiempo para terminar.

Ejemplo:

whiptail --title "Example Dialog" --infobox "This is an example of an info box." 8 78

En el ejemplo anterior, el valor de - título se muestra en la parte superior del cuadro de diálogo. El primer

argumento - infobox es el texto del cuadro de diálogo que se muestra debajo del título. Los siguientes dos

argumentos especifican la altura y el ancho del cuadro de diálogo. La anchura se establece en 78 como la

mayoría de los terminales serán de al menos 80 columnas o más.

msgbox text height width

Un cuadro de mensaje es muy similar a un cuadro yes/no. La única diferencia entre un cuadro de mensaje y

un cuadro yes/no es que un cuadro de mensaje tiene un solo botón OK. Puede utilizar este cuadro de diálogo

Page 12: Shell Scripting

Shell scripting

Página 11

para mostrar cualquier mensaje que usted desee. Después de leer el mensaje, el usuario puede presionar

la tecla ENTER para que whiptail salga y la llamada al script del shell puede continuar su operación.

Ejemplo:

El uso es similar al cuadro de información:

whiptail - título "Ejemplo de diálogo" - msgbox ". Este es un ejemplo de un cuadro de mensaje que usted

debe golpear en Aceptar para continuar." 8 78

inputbox text height width [init]

Un cuadro de entrada es útil cuando se desea hacer preguntas que requieren que el usuario introduzca una

cadena como la respuesta. Si se suministra init se utiliza para inicializar la cadena de entrada. Cuando se

ingresa de la cadena, la tecla RETROCESO se puede utilizar para corregir los errores de escritura. Si la

cadena de entrada es más larga de lo que que se puede insertar en el cuadro de diálogo, el campo de

entrada se desplaza. A la salida, la cadena de entrada se imprimirá en stderr.

Ejemplo:

INIT = Azul

COLOR = $ (whiptail - caja de texto "¿Cuál es tu color favorito?" 8 78 $ INIT - título "Ejemplo Dialog" 3>

& 1 1> & 2 2> y 3)

exitstatus = $?

if [$ exitstatus = 0] y luego

echo "El usuario selecciona Aceptar y entró" $ COLOR

más

echo "El usuario selecciona Cancelar."

fi

echo "(estado de salida fue de $ exitstatus)"

passwordbox text height width [init]

Un cuadro de contraseña es similar a un cuadro de entrada, excepto el texto que el usuario escribe no se

muestra. Esto es útil cuando se pida confirmación contraseñas u otra información delicada. Tenga en cuenta

que si pasa algo en "init", será visible en la tabla de procesos del sistema. Además, es muy confuso para el

usuario que le proporcione una contraseña por defecto que no pueden ver. Por estas razones, el uso de

"init" es sumamente desalentador.

textbox file height width

Un cuadro de texto le permite visualizar el contenido de un archivo de texto en un cuadro de diálogo. Es

como un sencillo visor de archivos de texto. El usuario puede desplazarse por el archivo utilizando las teclas

ARRIBA/ABAJO, RePag/AvPag Y INICIO/FIN disponibles en la mayoría de los teclados. Si las líneas son

demasiado largas para que se muestre en el cuadro, las teclas de izquierda / derecha se puede utilizar

para desplazarse por la región de texto horizontalmente. Para mayor comodidad, también se proporcionan

funciones de avance y retroceso de búsqueda.

menu text height width menu-height [ tag item ] ...

Page 13: Shell Scripting

Shell scripting

Página 12

Como su nombre lo indica, un cuadro de menú es un cuadro de diálogo que se puede utilizar para presentar

una lista de opciones en la forma de un menú para que el usuario elija. Cada entrada del menú se compone

de una serie de etiquetas y una cadena de material. La etiqueta proporciona la entrada de un nombre

para distinguirlo de las otras entradas en el menú. El artículo es una breve descripción de la opción que

representa la entrada. El usuario puede moverse entre las entradas del menú pulsando las teclas

ARRIBA/ABAJO, la primera letra de la etiqueta como una tecla de acceso rápido, o las teclas numéricas 1-

9. Hay entradas de menú de altura se muestran en el menú de una manera, pero el menú se desplazará si

hay más entradas que eso. Cuando WHIPTAIL sale, la etiqueta de la entrada del menú elegido se imprimirá

en stderr.

Ejemplo:

whiptail - título "Ejemplo de Menú" - el menú "Seleccione una opción" 20 78 16 \

"<- Back" "Volver al menú principal". \

"Agregar usuario" "Añadir un usuario al sistema". \

"Modificar usuario" "Modificar un usuario existente". \

"Lista de usuarios" "lista de todos los usuarios en el sistema." \

"Agregar grupo" "Añadir un grupo de usuarios para el sistema." \

"Modificar grupo" "Modificar un grupo y su lista de miembros." \

"Grupos", "Lista de todos los grupos en el sistema".

Los valores dados a - menú son:

El texto que describe el menú ("Seleccione una opción")

La altura del cuadro de diálogo (20)

La anchura del cuadro de diálogo (78)

La altura de la lista del menú (16)

El resto de los valores es una lista de opciones de menú en la opción etiqueta de formato, donde la

etiqueta es el nombre de la opción que se imprime en stderr cuando se selecciona, y el tema es la descripción

de la opción de menú.

checklist text height width list-height [ tag item status ] ...

Un cuadro de lista de verificación es similar a un cuadro de menú en el que hay varias entradas que se

presentan en la forma de un menú. En lugar de elegir una entrada entre las entradas, cada entrada puede

ser activada o desactivada por el usuario. El primer estado encendido / apagado de cada entrada se

especifica por el estado. A la salida, se imprimirá una lista de las cadenas de etiquetas de las entradas que

se activan en stderr.

Ejemplo:

whiptail - título de "Lista de verificación ejemplo" - lista de control \

"Elegir permisos del usuario" 20 78 16 \

"NET_OUTBOUND" "Permitir conexiones a otros hosts" ON \

"NET_INBOUND" "Permitir conexiones desde otros hosts" OFF \

"LOCAL_MOUNT" "permitir el montaje de los dispositivos locales" OFF \

"REMOTE_MOUNT" "permitir el montaje de los dispositivos remotos" OFF

Page 14: Shell Scripting

Shell scripting

Página 13

Al confirmar su selección, una lista de las opciones que se imprime en stderr.

radiolist text height width list-height [ tag item status ] ...

Una caja radiolist es similar a un cuadro de menú. La única diferencia es que se puede indicar que la entrada

está seleccionada, estableciendo su estado activado.

gauge text height width percent

Un cuadro de medidor muestra un medidor en la parte inferior de la caja. El medidor indica el porcentaje.

Nuevos porcentajes se leen de la entrada estándar, un entero por línea. El contador se actualiza para

reflejar cada nuevo porcentaje. Si stdin es XXX, entonces las líneas subsiguientes hasta otro XXX son usados

para un nuevo sistema. Las salidas de calibre cuando se alcanza EOF en stdin.

Ejemplo:

#!/bin/bash

{

for ((i = 0 ; i <= 100 ; i+=30)); do

sleep 1

echo $i

done

} | whiptail --gauge "Please wait" 5 50 0

Page 15: Shell Scripting

Shell scripting

Página 14

MantenimientoTXT.

Esta práctica la realismos en clase y todo fue realizado desde la terminal de Linux, la diferencia ahora es

que se le dio una interfaz gráfica utilizando zenity. En esta práctica realizamos una pequeña base de datos

llamada UPQ con mysql, en la cual ingresábamos la clave, nombre y dirección de un alumno, podiendo

modificarla desde un menú de opciones.

Código sin zenity.

#!/bin/bash

function altas() {

clear

echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@

echo @@@ ALTAS DE ESTUDIANTES @@@

echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@

echo

echo CAPTURA LA CLAVE:

read clave

echo DA EL NOMBRE

read NOMBRE

echo DA LA DIRECCION

read DIRECCION

mysql -u root -p <<EOF 2> /dev/null

use UPQ;

INSERT INTO TEstudiante VALUES($clave, "$NOMBRE","$DIRECCION");

EOF

[ $? -eq 0 ] && echo Alta realizada || echo ya existía el estudiante

sleep 2

}

function bajas() {

clear

echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@

echo @@@ BAJAS DE ESTUDIANTES @@

echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@

echo

echo CAPTURA LA CLAVE:

read clave

para_borrar=`mysql -u root -p UPQ <<EOF

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

if [ "${para_borrar}" != "" ]

then

echo $para_borrar

echo "¿Se da de baja (S/N)?"

read op

if [ "${op}" = S ]

then

mysql -u root -p UPQ <<EOF

DELETE FROM TEstudiante where clave= $clave;

EOF

echo Se dio de baja

fi

else

echo No existe el estudiante

fi

sleep 2

}

function modificaciones() {

clear

echo

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@

echo @@@ MODIFICACIONES DE ESTUDIANTES @@

echo

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@

echo

echo CAPTURA LA CLAVE:

read clave

nombre=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

direccion=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT direccion FROM TEstudiante where clave= $clave;

EOF`

if [ "${nombre}" != "" ]

then

echo NOMBRE: $nombre

Page 16: Shell Scripting

Shell scripting

Página 15

echo

echo CAPTURA LA CLAVE:

read clave

nombre=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

direccion=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT direccion FROM TEstudiante where clave= $clave;

EOF`

if [ "${nombre}" != "" ]

then

echo NOMBRE: $nombre

echo DIRECCION: $direccion

echo "¿Se modifica (S/N)?"

read op

if [ "${op}" = S ]

then

echo CAPTURA EL NOMBRE:

read name

echo CAPTURA LA DIRECCION

read direction

mysql -u root -p UPQ <<EOF

UPDATE TEstudiante SET nombre="$name", direccion="$direction" where

clave= $clave;

EOF

echo Se Modifico

sleep 1

fi

else

echo No existe el estudiante

sleep 1

fi

}

function consultas() {

clear

echo

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@

echo @@@ CONSULTAS DE ESTUDIANTES @@

echo

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@

echo

echo CAPTURA LA CLAVE:

read clave

nombre=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

direccion=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT direccion FROM TEstudiante where clave= $clave;

EOF`

if [ "${nombre}" != "" ]

then

echo NOMBRE: $nombre

echo DIRECCION: $direccion

echo Enter para continuar ...

read op

else

echo No existe el estudiante

sleep 1

fi

}

# PROGRAMA PRINCIPAL

while true ; do

clear

clave=0

nb_completo=""

direccion=""

echo "**************************************************"

echo "**** MANTENIMIENTO DE ARCHIVO DE ESTUDIANTES ****"

echo "**** MENU DE OPCIONES ****"

echo "**************************************************"

echo

Page 17: Shell Scripting

Shell scripting

Página 16

Como se puede apreciar en el código, es un programa que se ejecuta desde la terminal de Linux. Ahora se

mostrara el código del proyecto con zenity.

# PROGRAMA PRINCIPAL

while true ; do

clear

clave=0

nb_completo=""

direccion=""

echo "**************************************************"

echo "**** MANTENIMIENTO DE ARCHIVO DE ESTUDIANTES ****"

echo "**** MENU DE OPCIONES ****"

echo "**************************************************"

echo

echo "1) Altas"

echo "2) Bajas"

echo "3) Modificaciones"

echo "4) Consultas"

echo "5) Salir"

read accion

case $accion in

1)

altas

;;

2)

bajas

;;

3)

modificaciones

;;

4)

consultas

;;

*)

exit 1

;;

esac

done

#=======================================================

#Universidad Politécnica de Querétaro

#Ingeniería en Telemática T-601

#Sistemas Operativos

#

#

#Mora Ruiz Alejandro

#Tamayo de la Torre Eduardo

#Solis Granados Saúl

#Pantoja Sanchez Emmanuel

#=======================================================

#!/bin/bash

# Función para insertar un nuevo registro a SQL

function altas() {

clave=$(zenity --entry --title "ALTAS" --text "Capture la clave")

NOMBRE=$(zenity --entry --text "Capture el nombre")

DIRECCION=$(zenity --entry --text "Capture la direccion")

mysql -u root -p <<EOF 2> /dev/null

use UPQ;

INSERT INTO TEstudiante VALUES($clave, "$NOMBRE","$DIRECCION");

EOF

[ $? -eq 0 ] && zenity --title "Mensaje" --info --text "Alta Realizada!!!!!!" || zenity

--title "Error" --info --text "Ya existia el estudiante"

}

#Función para eliminar algun registro de SQL

function bajas() {

text="Introduce el ID"

clave=$(zenity --entry --hide-text --text "$text")

para_borrar=`mysql -u root -p UPQ <<EOF

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

if [ "${para_borrar}" != "" ]

then

echo $para_borrar

accion=`zenity --question`

Page 18: Shell Scripting

Shell scripting

Página 17

#Función para eliminar algun registro de SQL

function bajas() {

text="Introduce el ID"

clave=$(zenity --entry --hide-text --text "$text")

para_borrar=`mysql -u root -p UPQ <<EOF

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

if [ "${para_borrar}" != "" ]

then

echo $para_borrar

accion=`zenity --question`

if [ $? == 0 ];then

mysql -u root -p UPQ <<EOF

DELETE FROM TEstudiante where clave= $clave;

EOF

zenity --info --text="Se dio de baja"

else

zenity --info --text="No existe el estudiante"

fi

fi

}

#Función para modificar algun registro de SQL

function modificaciones() {

text="Introduce el ID"

clave=$(zenity --entry --hide-text --text "$text")

nombre=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

direccion=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT direccion FROM TEstudiante where clave= $clave;

EOF`

if [ "${nombre}" != "" ]

then

echo NOMBRE: $nombre

echo DIRECCION: $direccion

echo "¿Se modifica (S/N)?"

read op

if [ "${op}" = S ]

then

echo CAPTURA EL NOMBRE:

read name

echo CAPTURA LA DIRECCION

read direction

mysql -u root -p UPQ <<EOF

UPDATE TEstudiante SET nombre="$name", direccion="$direction" where clave= $clave;

EOF

echo Se Modifico

sleep 1

fi

else

echo No existe el estudiante

sleep 1

fi

}

#Función para mostrar algún registro de SQL

function consultas() {

text="Introduce el ID"

clave=$(zenity --entry --hide-text --text "$text")

nombre=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT nombre FROM TEstudiante where clave= $clave;

EOF`

direccion=`mysql -u root -p UPQ <<EOF | tail -n +2

SELECT direccion FROM TEstudiante where clave= $clave;

EOF`

if [ "${nombre}" != "" ]

then

zenity --list --column="nombre" "$nombre" --

column="direccion" "$direccion" --width=700 --height=700

else

zenity --error --text="no existe el alumno"

fi

}

function crear(){

accion=`zenity --question`

if [ $? == 0 ];then

mysql -u root -p <<EOF

CREATE DATABASE UPQ ;

USE UPQ

CREATE TABLE TEstudiante (clave int auto_increment primary key, nombre varchar(100),

Page 19: Shell Scripting

Shell scripting

Página 18

Además de que reduce en varias líneas el código, cuando se ejecuta tiene un aspecto más agradable.

Menú Principal.

Aquí se puede observar las principales opciones del programa.

zenity --error --text="no existe el alumno"

fi

}

function crear(){

accion=`zenity --question`

if [ $? == 0 ];then

mysql -u root -p <<EOF

CREATE DATABASE UPQ ;

USE UPQ

CREATE TABLE TEstudiante (clave int auto_increment primary key, nombre varchar(100),

direccion varchar(100));

EOF

fi

}

# PROGRAMA PRINCIPAL

clave=0

nb_completo=""

direccion=""

title="Mantenimiento de Archivos de Estudiantes"

prompt="Menu de Opciones:"

options=("Alta" "Baja" "Modificaciones" "Consultas" "Crear la base de datos" )

while opt=$(zenity --title="$title" --text="$prompt" --list \--column="Options" "${options[@]}"

--width=700 --height=700 ) ;do

case "$opt" in

"${options[0]}" ) altas;;

"${options[1]}" ) bajas;;

"${options[2]}" ) modificaciones;;

"${options[3]}" ) consultas;;

"${options[4]}" ) crear;;

*) exit 1;;

esac

done

Page 20: Shell Scripting

Shell scripting

Página 19

Para dar de alta un alumno escogemos “Alta” del menú principal, después se nos aparecerá otras ventanas,

donde tenemos que ingresar los datos del alumno, Clave, Nombre y dirección. Al hacer la alta aparece un

mensaje de éxito.

Para realizar una baja, seleccionamos “Baja”, y nos pedirá que ingresemos la clave del alumno, después

nos preguntara si estamos seguros.

Para hacer una consulta, seleccionamos “Consulta”, nos pedirá la clave y después de ingresarla nos

aparecerá el resultado.

VideoBase.

Al igual que la practica anterior, esta fue realizada primeramente en terminal de Linux también utilizamos

zenity para darle una interfaz gráfica. Este programa guarda todo en un archivo de texto.

Menú principal

Es un menú sencillo que contiene 3 opciones, agregar película, consultar y salir.

Page 21: Shell Scripting

Shell scripting

Página 20

Para dar de alta una película, seleccionamos “Alta” y nos pedirá el nombre del director, nombre de película,

año y productora.

Para hacer una consulta, seleccionamos “Consulta” y nos da varias opciones para realizarla, por director,

año, nombre de película, o productora.

Código

#=======================================================

#Universidad Politécnica de Querétaro

#Ingeniería en Telemática T-601

#Sistemas Operativos

#

#

#Mora Ruiz Alejandro

#Tamayo de la Torre Eduardo

#Solis Granados Saúl

#Pantoja Sanchez Emanuel

#=======================================================

#/bin/bash

function altas() {

director=$(zenity --entry --title "ALTAS" --text "Escriba el Director de la pelicula")

pelicula=$(zenity --entry --text "Escriba el titulo de la pelicula")

ano=$(zenity --entry --text "Escriba el año de producción")

productora=$(zenity --entry --text "Escriba la productora")

echo "$director $pelicula $ano $productora" >> base2.txt

}

function consultas(){

title="ARCHIVO DE TEXTO DE PELICULAS "

prompt="Menu de Opciones:"

options=("Busqueda por director" "Busqueda por productora" "Busqueda por

titulo" "Busqueda por año" )

op=$(zenity --title="$title" --text="$prompt" --list \--column="Options"

"${options[@]}" --width=700 --height=700 )

case "$op" in

"${options[0]}" )

director=$(zenity --entry --hide-text --text "Nombre del

director")

grep "$director" base2.txt | zenity --text-info --width=700

--height=700

;;

"${options[1]}" )

productora=$(zenity --entry --hide-text --text "¿Cuál es la

productora?")

grep "$productora" base2.txt | zenity --text-info --

width=700 --height=700

Page 22: Shell Scripting

Shell scripting

Página 21

director=$(zenity --entry --hide-text --text "Nombre del

director")

grep "$director" base2.txt | zenity --text-info --width=700

--height=700

;;

"${options[1]}" )

productora=$(zenity --entry --hide-text --text "¿Cuál es la

productora?")

grep "$productora" base2.txt | zenity --text-info --

width=700 --height=700

;;

"${options[2]}" )

titulo=$(zenity --entry --hide-text --text "¿Cuál es el titulo

de la pelicula?")

grep "$pelicula" base2.txt | zenity --text-info --width=700

--height=700

;;

"${options[3]}" )

anio=$(zenity --entry --hide-text --text "¿En qué año se

produjo la pelicula?")

grep "$ano" base2.txt | zenity --text-info --width=700 --

height=700

;;

#./peliculas.sh

esac

}

#PROGRAMA PRINCIPAL

clave=0

nb_completo=""

title="ARCHIVO DE TEXTO DE PELICULAS "

prompt="Menu de Opciones:"

options=("Alta" "Consulta" "Salir")

while opt=$(zenity --title="$title" --text="$prompt" --list \--column="Options"

"${options[@]}" --width=700 --height=700 ) ;do

case "$opt" in

"${options[0]}" ) altas;;

"${options[1]}" ) consultas;;

"${options[2]}" ) exit 1;;

esac

done

Page 23: Shell Scripting

Shell scripting

Página 22

Bibliografías.

http://www.freetux.com.ar/que-es-zenity/

https://help.gnome.org/users/zenity/stable/index.html.es

http://linuxzone.es/2012/06/22/tutorial-dale-vida-a-tus-scripts-con-zenity/

https://help.gnome.org/users/zenity/stable/calendar.html.es

https://help.gnome.org/users/zenity/stable/calendar.html.es

https://help.gnome.org/users/zenity/stable/password.html.es

https://help.gnome.org/users/zenity/stable/scale.html.es

https://help.gnome.org/users/zenity/stable/forms.html.es

https://help.gnome.org/users/zenity/stable/list.html.es

https://help.gnome.org/users/zenity/stable/progress.html.es

https://help.gnome.org/users/zenity/stable/color-selection.html.es

https://help.gnome.org/users/zenity/stable/text.html.es

https://help.gnome.org/users/zenity/stable/notification.html.es

http://lab46.corning-cc.edu/man/

http://linux.math.tifr.res.in/manuals/

http://linux.die.net/man/

http://en.wikibooks.org/