Fundamentos de Programacin en Linux
Fundamentos de Programacin en Linux
.
McGRAW-HILL INTERAMERICANA, S. A. Avenida de las Américas, No. 46-41. Bogotá, D.C.,
Colombia.
PARTE 1
Programación de los shells
1 Introducción a la programación en Linux ....................................... 3
2 Scripts del shell BAZH ................................................................. 33
3 Estructuras de control del shell BASH .......................................... 61
4 Programación del shell TCSH ..................................................... 9 3
PARTE 2
Lenguajes de alto nivel
5 GAWK ...................................................................................... 139
6 Perl ............................................................................................ 187
7 Tcl (Tool Command Language) ................................................. 247
8 T k ............................................................................................ 293
Fundamentos de programación
-
en Linux 9
PARTE 3
Programación en GUI
9 GNOME .................................................................................... 327
10 KDE ............................................................................................... 371
PARTE 4
Apéndice
A Respuestas a las evaluaciones ........................................................... 417
Contenido
PARTE 1
Programación de los shells
1 Introducción a la programación en Linux .................................. 3
Prograniación en Linux ............................................................ 5
Programación del shell BASH ...................................... 7
Programación del shell TCSH ...................................... 8
GAWK ....................................................................... 8
Perl ............................................................................. 9
Tcl (Tool Conimand Language) ................................. 10
T k ............................................................................. 11
Programación en GNOME ....................................... 11
Programación en KDE .............................................. 12
programación en Linux
-9mw-B" <
PARTE 2
Lenguajes de alto nivel
8 T k ................................................................................................ 293
El shell wish y sus scripts .......................................................... 295
Widgets de T k .............................................................................. 295
Proyecto 8-1: Presentar un directorio ............................................ 302
Eventos y uniones ...................................................................... 304
Ventanas ...................................................................................... 31O
Marcos y etiquetas ........................................................................ 314
Proyecto 8-2: Crear un administrador de archivo ........................... 316
Evaluación .................................................................................... 323
PARTE 3
Programación en GUI
9 G N O M E ..................................................................................... 327
Librerías GNOME ...................................................................... 331
GTK+ ......................................................................................... 337
Señales y eventos .......................................................................... 340
Funciones G N O M E ..................................................................... 346
Compilación de programas G N O M E ............................. 347
Proyecto 9-1: GNOME Hello ...................................................... 348
Los widgets G N O M E App. Toolbar y Menu ................................. 351
Proyecto 9-2: Menús Archivo y Editar ........................................... 358
Iconos de G N O M E ....................................................... 360
Cuadros de diálogo ..................................................................... 362
Entradas ....................................................................................... 365
Canvas de GNOME ..................................................................... 367
Evaluación .................................................................................... 369
PARTE 4
Apéndice
xxi
de programación en Linux
Nota . .
1" soporte de programación puede no instalarse automáticamente en
un computador cuando se instala una distribución. Las principales
distribuciones, como Red Hat, Caldera y SuSE, le permiten instalar el
soporte de programación cuando instala el software de distribución,
como parte de un grupo de aplicaciones para el desarrollo.
Programación Linux
Linux se ha desarrollado como un esfuerzo conjunto en Internet.
Ninguna compañía o institución controla Linux, y el software desarro-
llado en este sistema refleja esa condición. El progreso de este tipo de
software siempre se ha desarrollado en el entorno de Internet; su
ación e n Linux
GAWK
GAWK es un lenguaje de programación diseñado para que los usuarios
de Linux creen sus propios filtros. U n filtro lee información desde una
Capítulo 1
Perl
Perl (Practica1Extraction and Report Lanpap) es un lenguaje para scripts
que se diseñó originalmente para trabajar en archivos con el fin de
generar informes y manejar archivos muy grandes. Se puede considerar
a Perl como el sucesor de GAWK y el lenguaje de programación del
shell BASH. Incluye muchas de las mismas capacidades pero con mayor
poder y flexibilidad. Perl se diseñó como un núcleo de programa al
cual se le podían agregar fácilmente más capacidades. Con el paso de
los años, estas capacidades se han ampliado muchísimo. Ahora puede
ación en Linux
Tk
La aplicación T k extiende el Tcl con comandos para crear y administrar
objetos gráficos como ventanas, iconos, botones y campos de texto
utilizando el sistenia X Window. Puede encontrar más información
sobre T k en dev.scriptics.com.
Dentro del sistenia X Window,Tk usa su propio shell, llamado el
slzell wish, para ejecutar los comandos Tk. Para poner en funcionamien-
to programas en Tk, primero debe iniciar el sistema X Window y
después el shell wish ,usando el comando wish; verá una ventana en
donde puede hacer funcionar los comandos Tk. Si está utilizando una
GUI como Open Look o Motif, X Window está disponible de manera
automática.
Programación en CNOME
El G N U Network Object Model Environment, conocido como
GNOME, ofrece un poderoso escritorio fácil de usar, integrado básica-
mente por un panel, un escritorio y un conjunto de herramientas GUI
con las cuales se pueden construir interfaces de programa. Su objetivo
no es sólo ofrecer una interfaz consistente, sino también proveer una
plataforma flexible para el desarrollo de aplicaciones poderosas. Más
información sobre programación en G N O M E se puede encontrar en
developer.gnome.org.
GTK+ es el conjunto de ujidgets que se utiliza en aplicaciones de
GNOME. Los widgets son los botones, iconos, campos y otros objetos
que aparecen dentro de la GUI de una aplicación. GTK+ parece y se
considera como una derivación original de la interfaz Motif GUI (más
adelante, en este capítulo, se profundizará acerca de Motif), creada
pensando en poder y flexibilidad. Por ejemplo, los botones pueden
tener rótulos, imágenes o cualquier combinación de ellos. Los objetos
se pueden consultar en forma dinámica y modificarse en tiempo de
ejecución. GTK+ también incluye un manejador de estilos que les per-
mite a los usuarios cambiar el aspecto y consideración de las aplicacio-
nes que usan los widgets. Incluso con toda esta capacidad, el conjunto
de widgets de GTK+ sigue siendo pequeño y eficiente. Es totalmente
gratuito y distribuido bajo la Library General Public License (LGPL),
lo que les permite a los programadores emplear el conjunto con soft-
ware de uso restringido, así como gratuito.
En esencia, un programa en G N O M E es un programa en C que
incluye funciones de GTK+ lo mismo que funciones GNOME.
Aunque no es tan fácil de usar como el Tk, el G N O M E exige que
usted utilice sólo unas cuantas funciones básicas para crear interfaces de
usuario más simples. La programación en G N O M E hace uso de un
extenso conjunto de funciones y estructuras que se encuentran en
muchas librerías y constituyen los diferentes componentes que funcio-
nan en una aplicación GNOME. Usted puede considerar las funciones
de GTK+ como operaciones en nivel bajo y las funciones G N O M E
como operaciones de alto nivel, fáciles de usar. Usualmente, las funcio-
nes G N O M E incorporan varias funciones GTK+ que facilitan las
tareas de la GUI en el programa. Este capítulo le ofrece una visión
general de estas librerías y la manera de usarlas para crear programas en
GNOME.
Programación en KDE
KDE (K Desktop Environment) está organizado en un modelo de
objetos de C + + : es decir, objetos C + + que contienen funciones con
las cuales usted puede modificar el objeto. Muchas de las funciones son
heredadas y otras estan definidas por un tipo particular de objeto. En
un programa KDE, usted define un objeto y después utiliza sus funcio-
nes públicas y privadas para modificarlo. Por ejemplo, puede crear un
objeto del nienú y después usar las funciones de dicho objeto para
agregarle nuevos ítems de menú. Como un programa en C++ orienta-
do por objetos, el KDE utiliza un extenso conjunto de clases de objetos
jerárquicos que se encuentran en las librerías KDE y Qt. Las clases más
bajas en la jerarquía heredarán miembros de las clases más altas conectadas
en la jerarquía. Usted puede crear sus propias clases y después heredar
miembros (funciones) a partir de las clases de KDE predefinidas. El lengua-
je KDE usa la caja de herramientas de Qt y en la actualidad se basa en ella
directamente (Qt es una caja de herramientas de las funciones de GUI,
que Trolltech desarrolló y mantiene). En KDE se utiliza la Qt Free Edition
y a diferencia de GNOME, que tiene funciones de nivel más bajo, que
administra con cualquier caja de herramientas, KDE únicamente se basa en
Capítulo 1: Introducción a la programación e n Linux
- - -
1 13
la caja de herrainientas de QT; en csei~cia,la programación en KDE es
progrm~acibnen Qt.
E11 la documentación que ofiece en su sitio Web,
developer.lcde.org., el creador de KIIE presenta un listado completo
de las clases de interfaces de usiiario de I<DE. En ese sitio se incluye un
tiitorial detallado y lilaterid de referencia completo para la AI'I I<llE,
lo iiiisiiio que docilmentación para el I<OM ( I W E Object Manager) y
rilaterial de referencia de Qt.Todas las clases se describen en detalle
junto con la declaración de tipo de clase, incluidas siis declaraciones de
las funciones niieriibro y las definiciones. Además, usted debe consiiltnr
los archivos con eiicabezados KDE y Qt. Los archivos .h cuentan con
un listado conipleto de las clases I<DE y Qt con comentarios detallados
que describen sus f~iticionesniieiiibro.
-
script. A diferencia de la prograiilacióii en GNOME y KDE, usted n o
necesita saber C o C++.
Pregunta: ;Cuál es la manera más fácil de escribir programas
para administrar archivos de texto?
Respuesta: Utilice Perl.Tieiie excelentes capacidades de manejo de
archivos. Con unos cuaiitos coliiandos sencillos. usted puede crear, leer o
actualizar archivos.
Pregunta: ¿Qué comandos del shell BASH deberé usar para
crear mis propios filtros para el shell?
Respuesta: Usted rio debe usar conxmios del shell HASM para crear
filtros del shell. En cambio, utilice GAW K, que está diseñado para trabajar
como un filtro, pero incltiye una coiripleta gama de capacidades de progra-
inación.
ación en Linux
a.@GWS e
Prueba de repaso
¿Cuentan los shells de Linux con capacidad de programación?'
-
programación, herramientas de Internet y editores de texto.
estabilidad son las características que lo han convertido eii el sistema oper;itivo
preferido en los servidores de red.
La llegada de Linux
En principio, Linux se diseñó específicamente para coniputadoras
personales basadas en Intel. Se inició como un proyecto personal de un
estudiante de sistemas llaniado Linus Torvalds en la Universidad de
Helsinlu. En esa época, los estudiantes utilizaban un programa llamado
Minix, que contaba con diferentes caractensticas de UNIX. El profesor
Andrew Tannebaum había creado Minix y éste se distribuía ampliamente
a través de Internet a estudiantes de todo el niundo. La intención de
Torvalds era crear una versión de U N I X efectiva en los P C para los
usuarios de Minix. La llamó Linux y en 1991 lanzó la versión O. 11.
Linux se distribuyó ampliamente a través de Internet y durante los
años siguientes otros programadores lo depuraron y le hicieron adicio-
nes, incorporando la mayoría de las aplicaciones y características que
Capítulo 1: Introducción a la prog
"#- w
"-
Nota - a .
Prueba de repaso
O ¿Cuánto cuesta L i n ~ x ? ~
O ¿Más de un usuario puede trabajar al mismo tiempo en un
sistema Linux s e n c i l l ~ ? ~
0 ¿En qué sistema operativo se basó L i n ~ x ? ~
4 Es gratuito.
5 Sí, es multiusuario.
6 En UNIX.
gramación en Linux
w m w a w - e ee
Distribuciones de Linux
Aunque sólo hay una versión estándar de Linux, en realidad existen
diferentes versiones. Distintas compañías y grupos han creado paquetes
de Linux y software de Linux en formas ligeramente diferentes. Cada
compañía o grupo presenta su paquete de Linux, por lo general en
CD-ROM. Más adelante se pueden incluir versiones actualizadas de
los programas o de software nuevo. Algunas de las versiones más popu-
lares son R e d Hat, OpenLinux, SuSE y Debian.
Nota
Varias distribu a y Red Hat, también ofrecen sus
sistemas dentro del software comercial.
Red Hat
En la actualidad, R e d Hat Linux es la distribución más popular de
Linux. Ésta dio origen al sistema de paquetes R P M usado en varias
distribuciones, mediante el cual se instalan y retiran auton~áticamentelos
paquetes de software. R e d Hat también suministra gran parte del desa-
rrollo del so'ftware para el escritorio GNOME. Sin embargo, también
sostiene a KDE. Su distribución incluye a GNOME y KDE. R e d Hat,
como Caldera OpenLinux, mantiene alianzas de software con compañías
OpenLinux
Caldera OpenLinux está diseñado para uso corporativo comercial. El
sistema y los paquetes de software de OpenLinux incluyen todos los
paquetes de software de GNU, lo mismo que los administradores de X
Windows, servidores de Internet, WordPerfect y el K Desktop. Sin
embargo, en la actualidad no incluye a G N O M E , pero cumple con el
estándar POSIX y se ajusta a los de U N I X . Caldera distribuye gratuita-
mente su sistema OpenLinux y también ofrece una línea de paquetes
comerciales y paquetes de uso restringido (requieren autorización).
Debido a esta última condición, los paquetes de software que tienen
licencia no son de distribución gratuita y en ellos se incluyen produc-
tos como Partition Magic, Star Office, Novel1 NetWare y la base de
datos AdabasD. En www.calderasystems.com puede encontrar más
información. En la actualidad sólo soporta la plataforma Intel.
.
E n principio fue una distribución en idioma alemán. SuSE se ha
popularizado mucho a través de Europa y hoy en día es una de las
distribuciones con más rápido crecimiento. Su distribución actual
incluye KDE y G N O M E ; también, WordPerfect, Star Office y KOffice.
Igualmente, está unido a productos comerciales como AdabasD y la
Linux O f i c e Suite. Sólo soporta plataformas de Intel. Para mayor
información, consulte www.suse.com.
Debian
Debian Linux es un proyecto que no tiene ningún carácter comercial y
al que sostiene un grupo de programadores voluntarios. Sin embargo,
en su distribución incluye soporte para muchos productos conierciales.
Debian mantiene asociaciones de software con Corel y Sun, entre
otras.Tanibién sostiene plataformas Alpha, Intel, Mac 68K y Sparc. Más
información en www.debian.org.
Capítulo 1:Introducción a la
"" ----e--
Slackware
Se encuentra disponible e n muchos lugares d e Internet y usted puede
pedir el C D a Walnut Creek Software. Incluye a G N O M E y KDE. La
distribución d e Slackware tiene especial cuidado e n mantenerse tan
cerca de los estándares U N I X como sea posible. E n la actualidad
únicamente soporta plataformas Intel. Puede consultar más informa-
ción en www.slackware.com.
lnfomagic
Infomagic distribuye recopilaciones de software d e Linux. El conjunto
Linux Developers Resource incluye las cuatro distribuciones principa-
les: R e d Hat, OpenLinux, SuSE y Slackware. El Linux Archive contie-
ne sitios de archivos espejo Linux que incluyen KDE, G N O M E ,
XFree86 y G N U . E n la actualidad sólo soporta la plataforma Intel. Más
información en www.infomagic.com.
LinuxPPC
La distribución LinuxPPC ofrece versiones de Linux diseñadas exclusi-
vamente para máquinas PowerPC. La distribución funcionará en cual-
quier máquina PowerPC,-incluidos los sistemas IBM, Motorola y Apple
(con máquinas G 4 e iMac). Ofrece soporte para el USB e n sistemas
Mac. Su distribución actual incluye el escritorio G N O M E y el adnii-
nistrador d e ventanas Enlightennient. Para más información véase
www.linuxppc.com.
TurboLinux
Lo distribuye Pacific HiTech, en versiones en inglés, chino y japonés. Incluye
varios de sus propios paquetes como TurboPkg para aplicaciones con actuali-
zación automática, el escritorio TurboDesk y el servidor Cluster Web
Server. C o m o R e d Hat, soporta paquetes R P M . E n la actualidad es de
amplia distribución en la zona este d e Asia y únicamente soporta la
plataforma Intel, aunque está e n desarrollo una versión para PowerPC.
Para más información véase www.turbolinux.com.
programación e n Linux
P4wSw-a S e
Mandrake
Mandrake Linux es otra distribución popular de Linux con muchas de las
mismas características de Red Hat. Se concentra en suniinistrar las últimas
actualizaciones y una instalación facil y configuración por medio de GUI
fácil de usar. Puede aprender nlás acerca de Mandrake en www.linux-
mandrake.com.
Recursos de Linux
A través de las búsquedas en línea usted dispone de anlplios recursos sobre
casi cualquier tema de Linux. Las siguientes tablas presentan listas de sitios
en donde puede obtener software, ver documentación y leer artículos
sobre los avances más recientes. Sobre programación en Linux hay varios
5itios de interés que incluyen Perl,Tcl/Tk y los sitios GNOME y KDE
(véase tabla 1-1). Para BASH y GAWK puede encontrar documentación e
inforniación en línea en el ~ i t i Web
o de GNU, www.gnu.org.En
www.linuxprogramrning.com y en www.linuxworld.com puede
hallar artículos recientes sobre temas de programación en Linux.
Los sitios Web y FTF', como www.calderasystems.com y
www.redhat.com, ofrecen una amplia documentación y software sobre
Linux (véase tabla 1-2). Usted puede encontrar otras direcciones a través
de páginas de recursosque cuentan con enlaces hacia otros sitios Web.
La documentación de Linux también se ha desarrollado a través de
Internet (como se presenta en la tabla 1-3) y gran parte de ella se
puede bajar en los sitios FTP de Internet. U n proyecto especial, llama-
do Linux Documentation Project (LDP),encabezado por Matt Welsh,
está desarrollando un completo grupo de manuales sobre Linux. La
documentación, en su nivel actual, está disponible en el sitio inicial de
LDP en hhtp://metalab.unc.edu/LDP/, e incluye una guía del
usuario, una introducción y guías de administración. Están disponibles
en texto, PostScript o formato de página Web. La tabla 1-3 presenta un
listado de estas guías. Puede encontrar explicaciones más breves en los
documentos denominados H O W T O (CÓMOHACER PARA) dispo-
nibles sobre diferentes temas, como instalación,impresión y correo elec-
trónico. Los documentos se encuentran en los sitios FTP de Linux,
imalmente en el directorio /pub/Linux/doc/HOW-TO.
Muchos sitios Web de Linux presentan noticias, artículos e informa-
ción sobre el tema; varios se basan en revistas populares como Linux
journal www2.linuxjournal.com/) y Linux Gaxettc (http://
isisesc.supelec.fr/lg) (véase tabla 1-4). Otros operan como portales
Web para Linux, como www.linux.com, www.linuxworld.com y
www.linux.org. Algunos se especializan en tenlas particulares, como
www.kernelnotes.org, con noticias sobre el kernel de Linux y
www.linuxgames.com para los juegos más recientes que se incluyen
en Linux. Los sitios www.gnome.org y www.kde.org contienen
software y docunlentación para los escritorios GNOME y KDE,
respectivamente.
Sitios Descripción
http://metalab.unc.edu/LDP/ Sitio Web del LDP
ftp://metalab.unc.edu/pub/linux/docs/LDP/ Sitio FTP del LDP
Guías Formato del documento y sitios Web
-
'
"
:"
4
.- ,
.. , ,
H e l l o , how a r e y o u
$
36 1 Fundamentos de programación en Linux
-
Usted podría tener que especificar que el script que Lisa en el ino-
iiiento está en su directorio de trabajo actual. Para hacerlo, fija previa-
mente el iionibre del script con una combiilaciói~de punto y barra, ./,
conio en ./hello. E11 el siguiente ejemplo se presenta la inanera como
usted ejecutaría el script hcllo.
- -
$ ./he110
Hello, how are you
S
$ chmod o+r-wx h e l l o
1
"$ chm
6a-
$ he110
H e l l o , how a r e you
$
Comando Ejecución
chmod Cambia el permiso de un archivo o directorio.
Opciones
4- Agrega un permiso.
- Retira un permiso.
r Establece el permiso para lectura de un archivo o direc-
torio. Un archivo se puede presentar en pantalla o impri-
mir. Un directorio puede tener la lista de sus archivos
en pantalla.
w Establece el permiso para escribir en un archivo o direc-
torio. Un archivo se puede editar o borrar. Un directorio
se puede retirar.
Establece el permiso de ejecutar para un archivo o direc-
torio. Si el archivo es un script del shell, se puede ejecu-
tar como un programa. Un directorio se puede cambiar
e ingresar.
Establece permisos para el usuario que lo crea y es due-
ño del archivo o directorio.
Establece permisos para que un grupo tenga acceso a un
archivo o directorio.
Establece permisos para el acceso a un archivo o directo-
rio para los otros usuarios en el sistema.
Establece permisos para el acceso por parte del usuario,
el grupo y todos los demás usuarios.
#!/bin/bash
# The he1 lo s c r i p t s a y s he110
echo "Hello. how a r e y o u "
Variables y scripts
Ileiitro del sliell usted p ~ i e d ecrear programas (programas dentro del
programa) ~ i s a n d ovariables y scripts. C u a n d o ejecuta iin archivo dcl
script, iisteci inicia u n nuevo proce5o qiic tiene \LI propio sliell. l>eiitro
d e &tc, usted piiedc defiiiir variriblcs, ejccutar coimildo\ LIIILISe
ii~cliiroejecutar otros ~ r i p t s .
U n a vnrinhlc es una referencia a u n u t i o q u e contieiie datos q u e se
pueden niodificar diiraiite la ejecución del programa. Dentro d e un
prograiiu d e shell, usted p ~ i e d edefinir variables y ~ s i g n a r l evalores.
i
Uiia v,iriable se define e n u n shell la primera vez q u e usted usa el
nonibre d e la variable. A continuación e ~ t á nlas reglas para usar una
variable.
Evaluación de variables: = y $
Usted asigna un valor con el opozidor dc as(qr?aci(h. Escriba el nonibre
de la variable, el operador de asigiiación y el signo igual a (=) y después
ingrese el vdor asignado. Cualquier conjiinto de caracteres se puede
asignar a una variable. E11 cstc ejeniplo, a la variable de saludo se asigna
la cadena "Hello".
2Nota
N o utilice espacios junto a un operador d e asignación.
- -- -
En tanto usted haya asignado un valor a una variable, puede usarla
coiiio referencia del valor. Por ejemplo, a i~ieiiudopodría usar los
valores d e las variables coino arguiiientos para un coinaiido. Podría
eiiiplear coiiio referencia e1 valor de una variable con cl iioiiibre de la
iiiisiiia precedido por el operador del signo de dinero ($). Este sigilo es
uii operador especial que lisa un iioinbre dc variable conio referencia
del valor de la niisiiia, cvalirhridc~la.La eval~iaciónrecupera el valor de
iiiia variable: un conjunto de caracteres, que reemplaza el iioiiibre de la
variable en la línea de comandos. Por consiguiciite, cada vez que
aparezca el sigilo $ antes del nombre de la variable, éste se reeinplaza
con el valor de la variable.
y sil
Eii el sigiiieiite ejemplo se evalúa la variable del shell,~qr.c~ctiiy,
contenido, "Hello", se utiliza después como el argiinleiito para el
coiiiaiido echo (este coiii;indo simpleoieiite hace eco o imprime un
conjunto de caracteres en la pantalla).
42 Fundamentos de programación e n L i n u x
---
S. echo $notIce
"Thp m e e t i n g w i 1 T bg tomorrow"
C e s w ~ f l - .T 4
sctro Snot ice
Yau can gef U l i s ? o f f i l e s h i t h 1 s *,c
El asterisco
44 1 Fundamentos de programación
- . .- . en Linux
-.
-5ugerenaa
Las comillas dobles no se utilizan para marcar el siano de dinero.
pt:~t:ur
ai iiuiiiuit: ur u i ia val i a u i r y r s i a urriiiu ur Iuiriiiias u u -
bles ("$variable") se evaluará, reemplazando el nombre de la
variable con su valor. Entonces, el valor de la variable, no el nom-
bre de ésta, se convertirá en parte de la cadena.
ecuta el comando)-
.- - - - -
Prueba de repaso
¿Debe definir usted una variable antes de usarla?'
Paso a paso
1. Cree u n archivo llamado greetvar con u n editor de texto estándar
como Vi, Emacs, WordPerfect o cualquiera d e los editores de texto de
GNOME o KDE.
2. lngrese u n p r o m p t usando el comando echo.
3. lngrese u n comando de entrada read con la variable greeting. Todo
lo que el usuario escriba en una Iínea será reemplazado en la variable
greeting.
4. lngrese u n comando d e salida usando echo para transferir la línea
que el usuario escribió. Esto se mantendrá en la variable greeting.
5. Guarde y cierre el archivo.
6. Asigne el permiso de ejecución al archivo greetvar, chmod u+x greetvar.
48 1 F u n d a m e n t o s d e p r o g r a m a c i ó n en L i n u x
-- -
read greeting
echo "The g r e e t i n g you e n t e r e d was $ g r e e t i n g W
3 greervar
Please e n t e r a g r e e t i n g :
hi
The g r e e t i n g you e n t e r e d was h i
8
$ listfiles
Please entei. a f i l e reference:
*.c
The f i l e s you r e q u e s t e d a r e : c a 1 c . c 1 i b . c m a i n . c
Prueba de repaso
¿Puede usar un script del shell para iniciar una apli~ación?~
Argumentos de la línea
-
4 Los scripts del shell se utilizan coii frecuencia coino script de iniciacióii para las aplicacio
nes y permiten que usted verifique el estado o la configuración de su sistema antes de
comenzar una aplicación.
5 Para aplicaciones como editores que leen comandos, podría usar la operación Here para
obtener un listado de un conjunto de comandos de la aplicación dentro del script del shell.
En efecto, usted tiene un programa dentro de un programa.
Capitulo 2: Scripts del shell BASH 1 51
de coinandos coino arguinentos que se pasan a variables del argumen-
to, desde $1 hasta $9. Las variables del arguinento son de sólo lectura y
no se les puede asignar valores. Una vez que se lei dan sus valores
iniciales, no se pueden niodificar. En este sentido, las variables del
argumento fiincionan más como coristantcs (valores que no cambian, en
oposición a las variables) que se determinan mediante los argumentos
de la línea de comdndos. Cada palabra en la línea de con~andosse
analiza en un argumento, a menos que esté nlarcada con comilla~o con
los otros signos indicados. Si usted entra más de un argumento, puede
referenciarlo con el número que le corresponda. En el siguiente ejem-
plo, se ingresan cuatro argumentos a la línea de comandos. El conteni-
do del script greeta[qs se presenta a continuación:
I he first-argument i s : Hello
The secnnd aigument i s z H i
The t h i rd 3rgurricnt +,: S a l u t ~iaris
~t
The f o i i r t h argurnent i s : How a r P you
$
Las variables especiales que usan los argun-~entosdel script del shell
se presentan en la tabla 2-2.
Argumentos de la Iínea de comandos Descripción
$0 Nombre del comando Linux.
La Iínea de comandos enésima
comienza desde 1 , $1 -$n;
puede usar set para cambiarlos.
Todos los argumentos de la Iínea
de comandos desde 1 ; puede
usar set para cambiarlos.
$ s a r g s H e l f o H i Welcome
He1 1 o H i Wel come
He1 1 o H i Wel come
There a r e 3 arguments
Capitulo 2: Scripts del shell BASH ( 53
$ myname="Charl es"
$ e x p o r t myname
En este sentido, usted puede trabajar con muchos shells, uno anidado
dentro del otro. Las variables que define dentro de un shell son locales
para él. Si define una variable en un script del shell, entonces, cuando
el script funcione, la variable está definida con el shell de ese script y es
local para éste. Ningún otro shell puede referenciarlo. En cierto sentido,
la variable está oculta dentro de su shell.
Para ilustrar esta situación con más claridad, en el siguiente ejemplo
se usarán dos scripts, para llamar a uno desde el otro. Cuando el primer
script se ejecuta, genera su propio shell; dentro de éste se ejecuta otro
script que, a su vez, genera su propio shell. En el siguiente ejemplo, el
usuario ejecuta primero el script dispjrst, que presenta un primer
nombre. Cuando el script dispjrst se ejecuta, genera su propio shell y,
entonces, dentro de éste, define la variablejrstname. Después de presen-
tar el contenido dejrstname, el script ejecuta el segundo script, llamado
displast. Cuando se ejecuta displast, éste genera su propio shell, luego
define la variable lastname dentro de su shell y después presenta el
contenido de lastname. Entonces, el script displast trata de referenciar
firstname y presenta su contenido; sin embargo, no lo puede hacer
debido a que firstname es local para el shell de dispjrst y no se puede
referenciar fuera de él. Como resultado, en pantalla aparece un mensaje
de error que indica que para el shell displast, firstname es una variable
indefinida. En la figura 2-1 se ilustra cómo se oculta cada variable
dentro de su propio shell.
firstname
o/
Charles
echo "First name is ffirstname" lastname
displast
I
bdis~'ast lastname="Dickens" 1-
N o hay ningunarvariable
firstname en el subshell de displast
--
Capítulo 2: Scripts del shell BASH 55
TI r s l ; n a m ~ - - - ~ n ai,er,-
r 1
7 a-ispfirst- -í
F i r s t name i s C h a r l e s
L a s t llame iS Dickens
Dickens
sh: f i r s t n a m e : n o t found
$
Variables d e entorno
Si desea el tnisiiio valor d< una variable que usó en el shell y el subshell
de un script, usted siniplemente podría definir la variable dos veces
-una en cada script- y asignarle el mismo valor. Mejor aún, ¿qué pasa
si quiere definir una variable en un shell y tener el valor de la misma
referenciado en cualquier subshell? Por ejeiiiplo, suponga que desea
definir la variable myfile en el script d i s p j l ~y tiene su valor, "List",
referenciado desde el script priri$le, en lugar de definir explícitamente-
otra variable en yriri@le. Coino las variables son locales para el shell en
donde se definen, n o hay manera de que usted pueda hacer esto con
variables ordinarias. Sin embargo, puede usar una variable de etztorno, que
permite referenciar el valor que ella tiene en cualquiera de los
subshells. Las variables de entorno constituyen un entorno para el shell
y para cualquier subshell que se genere, sin importar cuán profunda-
niente anidado esté.
En el shell BASH se exportan las variables del entorno. Es decir, en
cada subshell se hace una copia de una variable del entorno. En cierto
sentido, si la variable myfile se exportara, automáticamente se definiría
una copia en cada subshell. Para crear una variable de entorno, usted
aplica el comando export a una variable que ya haya definido. El
comando export da las instrucciones al sistema para definir una copia
de esa variable en todos los nuevos subshells que se generen, cada uno
de los cuales tendrá su propia copia de la variable de entorno. Este
proceso se conoce como exportar variables. De otro lado, en el shell
TCSH una variable de entorno se define solamente una vez y se puede
referenciar directamente desde cualquier subshell.
Paso a paso
1. Cree u n archivo llamado dispfile con u n editor de texto.
2. Defina la variablemyfile y asígnele el nombre de u n archivo, en
este caso "List". El nombre puede ser el de u n archivo sencillo que
haya creado con u n editor de texto simple.
3. Exporte la variable myfile con el comando export.
->
myfile="Li s t "
-
export myfi l e
echo "Displaying $ m y f i l e W
c a t - n dmyfile
printfile
El contenido del script printfile se presenta a continuación:
g
Displaying L i s t
1 screen
2 modem
3 paper
P r i n t i n g Li s t
$
.
Como se muestra en la siguiente ilustración, cuando se ejecuta
printfile éste recibe su propia copia de myfile y puede referenciar esa
copia dentro de su propio shell. Usted ya no necesita definir explícita-
mente otra variable myfile en printfile.
myfile es tina vari:iblc q u e se
espoi-tci. Uria copia se defiiie
y ubica eii ciinlqiiier subshell.
myfile
pq
-
cspoi-t 11i)~filc
dispfile
e c h o "l>isplayiiig %iiiyfilc"
car -11 Sniyfilc
prilltfileb - pririrfiie
e c h o "Prinriiig $iiiyfile"
Ip Siiiyfile K
58 Fundamentos de programación- en Linux
i
Puede usar conlo operador cualquiera de los que aparecen en la
tabla 2-3.
Prueba de repaso
O ¿Podría crear programas complejos usando varios scripts del
~hell?~
C7 Evaluación I
1. 2Cónio puede operar un script del shell BASH desde el shell TCSH?
2. ¿Qué leería un coninndo read en la entrada del script de un shell si
el arguniento del script es *?
3. ¿Podría asignar el texto de varias líneas a una variable?
4. ¿Cómo referencia varios argumentos de un script como un argu-
mento único?
5. ¿Puede drfinir,variables globales?
6. ¿Cuál es la diferencia entre = = y =?
6 Sí; simplemente asegúrese de exportar las variables necesarias que un script podría usar.
7 Una cadena que representa un número.
.
Los objetivos de este capitulo son:
Aprender a hacer pruebas para las estructuras de control
Inipleiiientar bucles estándar al igual que argumentos read con un bucle for
E ste capítulo tratará los temas básicos para crear un programa del
shell BASH, que se utiliza en la mayoría de los sistemas Linux.
Usted aprenderá cómo crear sus propios scripts, cómo definir variables
del shell, cómo desarrollar interfaces de usuario y dominará tareas más
dificiles como la de combinar estructuras de control para crear progra-
mas complejos. Las tablas que se muestran en este capítulo presentan
los comandos y operadores del shell BASH, y a través de numerosos
ejemplos se enseña la manera de implementarlos.
Este shell tiene un completo conjunto de estructuras de control que
incluyen bucles y enunciados if, lo mismo que estructuras case. Todos
los comandos del shell interactúan fácilmente con las operaciones de
redireccionamiento e interconexión que les permiten aceptar datos
desde la entrada estándar o enviarlos a la salida estándar.
Usted puede controlar la ejecución de los comandos Linux en un
programa del shell con estructuras de control, las cuales le permiten
repetir comandos y seleccionar ciertos comandos sobre otros. Una
estructura de control consta de dos componentes principales: una
prueba y comandos. Si la prueba tiene éxito, los comandos se ejecutan.
De esta manera, usted puede usar estructuras de control para tomar
decisiones acerca de si los comandos se deben ejecutar.
En los programas del shell se utilizan dos tipos de estructuras de
control: de repetición y condicional. Una prueba de repetición repite
comandos, mientras que una de condición ejecuta un comando cuan-
do se cumplen ciertas condiciones. El shell BASH tiene tres estructuras
de control de repetición: while, for y for-in, y dos estructuras de
condición: if y case.
Las estructuras de control while e if se utilizan para propósitos
generales como los de realizar repeticiones y tomar decisiones usando
diversas pruebas.
Las estructuras de control case y for son más especializadas. La
primera es una forma restringida de la condición if y a menudo se
utiliza para implementar menús. La estructura for es un tipo limitado
de bucle que actúa a través de listas de valores, asignando un nuevo
valor a una variable en cada repetición.
Las estructuras de control if y while prueban la ejecución de un
comando Linux.Todos los comandos Linux devuelven un estado de
salida después de haber terminado su ejecución. Si un comando tiene
Capítulo 3: Estru
comando test
Con frecuencia, podría ser necesario desarrollar una prueba para com-
parar dos valores; sin embargo, la prueba que se usa en estructuras de
control es un comando Linux y no una expresión relacional. No
obstante, existe un comando Linux llamado test que puede comparar
dos valores y regresar como estado de salida O, si la comparación tiene
éxito.
Al usar el comando test, puede comparar enteros y cadenas, e
incluso realizar operaciones lógicas. El comando (su sintaxis se presenta
más adelante) consta de la palabra clave test seguida por los valores que
se comparan, los cuales se separan por una opción que especifica cuál es
la clase de comparación que se realiza. Usted puede pensar en opción
como el operador, pero está escrito, como otras opciones, con códigos
de letras precedidos por up signo menos. Por ejemplo, -eq es la opción
que representa la comparación de igualdad. La sintaxis para el comando
test se muestra a continuación:
h - 3 '
1
G-
$ num=5
$ echo $ ?
1
T-nTT=T
Nota
10q
1
--- . -
$ t e s t $num - e q 10
+..
Alteri1ativai11ente, e n cainbio d e usar la palabr,i prueba tcst para el
coiiiando test, iisted puede usar paréntesis cuadrados ([ y 1). El co-
niando test $greeting = "hi" tambikn se puede escribir conlo:
1
Comparación de c a d d
-- . ----
opción -eq.
La estructura if-then
La estructura ifestablece una condición en los comandos. Esa condición es
el estado de salida de un comando Linux específico. Si un comando tiene
éxito y retorna un estado de salida igual a O, se ejecutan los comandos
dentro de la estructura if. Si el estado de salida es diferente de O, el coman-
do ha fállado y los comandos dentro de la estructura i f n o se ejecutan.
El comando if comienza con la palabra clave $y va seguido de un
comando Linux cuy: condición de salida se evaluará. Este comando se
ejecuta siempre. Después del comando, la palabra clave queda en línea.
A continuación puede seguir cualquier conjunto de comandos. La
palabra clavefi termina el comando. Con frecuencia, usted debe elegir
entre dos alternativas basado en si el comando Linux tiene éxito o no.
La palabra clave elsc permite que una estructura if elija entre dos
alternativas. Si el comando Linux tiene éxito, se ejecutan los comandos
que siguen a la palabra clave then. Si el comando Linux falla, se ejecu-
tan los comandos que siguen a la palabra clave else. La sintaxis para el
comando if-then-else se presenta a continuación:
if comando Linux
then
comandos
else
comandos
fi
Capítulo 3: Estruct
Estructuras Función
de control condicional
if comando then if ejecuta una acción si su comando test es verdadero.
comando
fi
if comando then if-else ejecuta una acción si el estado de salida del comando
comando test es verdadero; si es falso, se ejecuta la acción else.
else
comando
fi
if comando then elif le permite anidar estructuras if, permitiendo elegir entre
comando varias alternativas; en la primera estructura verdadera if,
elif comando then sus comandos se ejecutan y el control deja la estructura
comando elif completa.
else
comando
fi
case cadena in case equipara el valor de la cadena con alguno de varios
patrón) patrones; si un patrón concuerda, se ejecutan sus comandos
comando;; asociados.
esac
comando && comando La condición lógica AND regresa un valor verdadero de O si am-
bos comandos regresan un valor verdadero O; si uno de ellos
regresa un valor diferente de cero, la condición AND es falsa y
también regresa un valor diferente de cero.
comando 11 comando La condicnjn Iógica OR regresa un valor verdadero de O si alguno
de los comandos regresa a un valor verdadero de O; si ambos
comandos regresan un valor diferente de cero, la condición OR
es falsa y también regresa un valor diferente de cero.
! comando La condición lógica NOT invierte el valor de retorno del comando.
-r
echo
---
Enter s t o l i s t f i l e s i z e r .
echo o t h e r w i s ~a l 1 f i l e i n f o r m a t i o n i s l i s t e d .
pcho - n "Please enter option: "
read choice
i f [ "$choice" = S 1
then
1s - 5
el s e
1s - 1
fi
echo Gond-bye
$ elsels
Enter ; t o l i s t f i l ~s i z p ? ,
o t h e r w i s e a l 1 f i l i itiformiitirin i , 1 i 5 t e d .
P1ea:e e n t e r o p t i o n : S
total 2
1 inonday 2 today
Yood - h y ~
$
T
3
. a los e x p e r t o s
Pregunte
Pregunta: puedo usar l a estructura if para verificar los argu-
mentos?
ncarrec-
echo $ 3
$ ifarg
Invalid number o f arguments
if comando Linux
then
comandos Linux
el if
70 Fundamentos de programación
-en Linux
comandos Linux
else
comandos Linux
fi
ma .s. -LE?
SlZéS -
termina esta secueilcia con~pletade comandos if-else anidados.
echo 1. L i s t Á i 1 I n f o r m z t i o n
echo-e "Please lrntcr o ~ t - i o n :\ c W
7
read c h o i c ~
i f [ "$cholcen
thel;
- .S 1
1s - S
e l if [ "8chaícen = 1- 1
th~n
1s - 1
el se
echo I n v a l i d B p t i o n
fi
echo Goodbye
.
El siguiente es un ejemplo de la ejecución del script elgs:
' $ ellT1S l
s. L i s t Sizes
1 . L i s t A l 1 F i l e Ininrrnation
La estructura case
La estructura case permite que su programa elija entre varias alternati-
vas posibles. La elección se hace mediante la comparación de un valor
con varios patrones posibles. Cada valor posible está asociado con un
conjunto de operaciones. Si se encuentra una correspondencia, se
realizan las operaciones asociadas.
La estructura case comienza con la palabra clave case, seguida por la
evaluación de una variable y la palabra clave in;después, sigue un
conjunto de patrones. Cada patrón es una expresión regular que termi-
na con un paréntesis de cierre, después del cual se listan los comandos
asociados con este patrón, seguidos por dos signos de punto y coma en
una línea separada, que señalan el final de esos comandos. Después de
todos los patrones listados,la palabra clave esac termina el comando
case. La sintaxis es como sigue:
case cadena in
patrón)
comandos
..
II
patrón)
comandos
comandos predeterminados
..
11
esac
72 1 Fundamentos de programación en Linux
-- -
-5.u g e,reM c ia
Un patrón puede incluir caracteres especiales de cualquier shell, los
cuales son *, [ ,1, ? y 1. Usted puede especificar un patrón predeter-
minado con un solo carácter especial, *. El carácter especial * con-
cuerda con cualquier patrón y, por consiguiente, se convierte en una
opción predeterminada efectiva. Si los demás patrones no concuer-
dan, el * lo hará. De esta manera, la opción predeterminada se
ejecuta; si no es así, se eligen otras opciones. El predeterminado es
opcional y usted no está obligado a incluirlo.
c a s P $ c t i ~ i ¿ ei n
S1
1'; - S
-- - - -- -
Concuerda con cualquier ,
1s * . c
. ,.
'carácter que n o haya
. -
-- -- previamente
concordado
I- --
1
echo l n v a l i d O p t i o n
5a c
Capítulo 3: Estructuras d e control del shell BASH
- -
73
Prueba de repaso
?Cuál operador utilizaría para probar una cadena vacía?'
El bucle while
El bucle while repite con~andos,comienza con la palabra clave w l d e
seguida por un comando Linux. En la siguiente línea está la palabra
clave do. El final del bucle se especifica con la palabra clave done. Esta es
la sintaxis del coniando while:
Capitulo 3: Estructuras d e control del shell BASH
- *
1 75
while comando Linux
do
comandos
done
El comando Linus que se usa en lai estructuras while con frecuencia
es un comando de prueba que se señala entre paréntesis cuadrados. En el
script iriynnrnc, del ejemplo siguiente, se le pide que ingresc un nombre;
luego se imprime el nombre. El bucle se controla poniendo a prueba el
valor de la variable again, usando el paréntesis del comando test.
--
while [ "$againn
do
= y e s 1-IComienzodelbucle
r e a d name
echo "The name y o u e n t e r e d i s $nameV
echo - n "Do you w i s h t o c o n t i n u e ? "
read a g a i n * p 1
done I- - - - -
el usuario escribe
echo Good-bye
. lis, el buclezy_epite/
P l e a s e e n t e r a name: George
The name y o u e n t e r e d i s George
Do y o u w i s h t o c o n t i n u e ? yes
P l e a s e e n t e r a name: R o b e r t
The name y o u e n t e r e d i s R o b e r t
Do you w i s h t o c o n t i n u e ? no
Good - bye
Paso a paso
1. Con u n editor de texto, cree u n archivo llamado helloprog.
2. Defina una variable con el nombre agoin y asígnele u n valor de 1.
Esta es una inicialización de la variable que usted usará para controlar
el bucle.
3. Ingrese u n comando while en donde el enunciado de Linux que se
usó para la prueba es u n comando l e t (véase el capítulo 2). Verifique
si el valor de la variable again es menor o igual a 3.
4. 'Muestre el resultado de la variable again y la palabra Hello.
5. lncremente la variable again usando el comando l e t con una opera-
ción aritmética deasignación.
6. Termine el bucle while con el comando done.
El script helloprg se presenta a continuación:
La estructura until
La estructura until funciona en una forma muy similar a la de la
estructura while. Sin embargo, until sirve para probar si el resultado
de un comando Linux no tiene éxito. Cuando el comando Linux faiia,
la estructura until continúa el bucle. En cierto sentido, until revisa si
la cor:dición de la prueba es falsa; a ese respecto, esta estructura es muy
diferente de las estructuras until que se encuentran en los lenguajes de
programación y se asemeja rnás al operador de los n~ismos,que sirve
para poner a prueba expresiones falsas. La siguiente es la sintaxis de la
estructura until:
until comando Linux
do
comandos
done
La estructura for-in
La estructura for-in está diseñada para hacer referencia secuencialmente
a listas de valores. Utiliza dos operandos: una variable y una lista de
valores.Todos los valores de la lista se asignan uno a u110 a la variable
en la estructura for-in. C o m o el comando while, la estructura for-in
es uii bucle. En cada repetición a través del bucle el siguiente valor de
la lista se asigna a la variable. Cuando se termina la lista, el bucle se
detiene. Al igual que el bucle while, el cuerpo de un bucle for-in
comienza con la palabra clave do y termina con la palabra clave done. La
sintaxis del bucle for-in es la siguiente:
for variable in lista de valores
do
comandos
done
78 1 Fundamentos de programación
-. --
en Linux
$ cbackup
i0.c
1ib.c
rnain.c
$
La estructura for
La estructura for, sir1 una lista de valores específicos, toma como u11 lista
de valores los argumentos de la línea de comandos. Los arg~iinentoi
que se especifican allí cuando se llaina el archivo del shell se convierten
en una lista de valores refereiiciados por el coniaiido for. La variable
Capitulo 3: Estructuras d e control del shell BASH 1 79
que ie uia en este c o n ~ ~ i se~ destablece
o en forma automática y
secueiicial para c a d ~valor de arguineiito en la iecucncia. LJ. primera
vez que atraviesa el bucle, la variable se ajusta al valor del priiner
arguiilento: la icgunda vez, al v~loi-del segundo arguiiiento.
La citructura for iin una liita especificada equivdc a la hita genera-
da por $@, que cs una variable eipecial de arguiileiito cuyo valor ei la
lista de ai-guineritos de la Iíiiea de coiiiaiidoi. En el ejeinplo iiguieiitc,
una Iiita de arcliivoi de progrdinai en C se ingresa en la línea de co-
inandoi cuaiido ie llaiila el ,irchivo del ihell, cbcick~ipcity,en donde un
bucle for i-efei-ciicia autoiniticaii~eiitea cada arguineiito. La variable
backfile ie uia en el bucle for. La primera vez que pasa el bucle,
$backfile iilaiitieiie el valor del primer ~rguineiito,$1. La ieguiidd vez,
$backfile imntiene el valor del icgundo arguinento, $2.
for b a c k f i 1 e
do
cp gbackfile sourcebak/$backfile
echo "8backfile "
done
El comando continue C.
íY
8 WWJ W I 8 Y.W V I I W
w r *- *r -
estructura for-in?
f o r a r g f i n "$@"
do
echo 8 a r g f
do n.e
Prueba de repaso
Si la prueba de un bucle siempre es verdadera, ¿se detendrá
alguna vez?3
¿Existe alguna manera de obligar a un bucle a detener~e?~
Paso a paso
1. Encuentre los directorios que puedan estar en el directorio actual y
luego revise para determinar si hay alguna página Web en ellos. Las
páginas Web son cualquier archivo con las extensiones .html o .htm.
Los nombres de estos archivos se encuentran en cadenas que cons-
tan de comandos HTML, que son hrefs para seleccionar y presentar
en pantalla los archivos. Las referencias HTML están organizadas en
u n listado con las etiquetas <ul> y </ul>, precedidas por una etiqueta
<lb. Los nombres del directorio se usan como encabezados, con la
etiqueta <hl>.
2. Busque u n título dentro de u n archivo HTML y úselo como el texto
de enlace en el índice.
3. Use grep para buscar el patrón <TITLE>. Si encuentra uno, será
enviado a la variable tline.
4. Si n o encuentra el patrón, asigne el nivel de error 1 a la variable de
estado $?
5 . Verifique esta variable para saber si grep tuvo éxito. En caso afirmati-
vo, use u n conjunto de comandos sed para unir los rótulos preceden-
te y siguiente, <TITLE> y </TITLE>, junto con cualquier otro carácter.
6. Asigne el texto del título restante a la variable ntitle.
I (lul>
/h,?>rnywebs<!h2>
l &l>
I < l i i t a href=niywebs/rnypi c s . h t m l i n i y p i c s < / a >
< l i > < a h r e f = i n y w e b s / v a c a t i o t i . h t m l >My Suniiner V a c a t i c i n < / a >
c / u 1 >
CiBODY'
</l-iTML>
docnotes
Usar redireccionamiento
e interconexiones
con estructuras de control
Usted puede considerar una estructura de control conlo un comando
que envía datos a la salida estáiidar. Esta salida se puede redirigir o
intevconectav (transferir a otro comando), igual que la salida de cualquier
comando Linux. En un coniando de una estructura de control, usted
ubica un operador de redirección inmediatamente después de la pala-
bra clave done para enviar la salida de un bucle a un archivo. En el
archivo nrylistsavc, por ejemplo, el coiiiando echo dentro del bucle for-
in pondrá el nombre del ítem en la salida estándar. Estos nonlbres se
envían luego a un archivo 1lainado.foods. El archi~o~foods tendrá, enton-
ces, una lista de todos los artículos de abarrotes.
$ cbackupn
$ c a t cnames
io.c
1ib.c
main.c
l
-ec=yes.
echo "Input format i s <book>:<author>:<price>:<publi sher>"
while [ "8morerec" = yes 1
do
echo - n "Please enter book record: "
read title author price publisher
~ L I I O -e "$title:\tbr7uthor:\t$price:\t$publ isher">> books
icho -n "Do you wish to continue? "
read morerec
done
$ bookrecsR
Input for-inat i s <book>:<author>:<pric2, :<pub1isliPr>
Pl ease e n t ~ ra book recoi d: War and peace:Tolstoy:15.75:Penguin
Clu you d.fisIi to contitiu~?yes
P l sasp enter a book i ecord: Christmas caro1 :Dickens:3.50:Academic
Do you wish to continue! yes
P l e a : ~ ~ n t r ra b o c k recnrd: Iliad:Homer:10.25:Random
Lo yo11 w i s h to continue? yes
P1 C.;ISF, e n t e 1 a book record: Raven:Poe:2.50: Penguin
Dc you wish to cantinue? no
88 Fundamentos de programación
-
en Linux
Usted también puede usar el comando trap para evitar que situa-
ciones externas lleguen a interrumpir la ejecución del programa. Por
ejemplo, suponga que n o desea que el usuario pueda detener el progra-
nla presionando CTKL-C; es decir, quiere que se pase por alto cual-
quier evento externo. El coniando trap puede desviar el evento
C T K L - C y evitar que interfiera con la ejecucióii del prograiiia. Usted
puede hacer esto ingresando un par de coniillas sencillas como primer
argumento del comando trap. Si trap no tiene coniandos Linux para
ejecutar, siriiplcrnente intercepta un evento que pudiera detener el
programa. El comando trap que se presenta a continuación atrapará
todas las ocurrencias de C T K L - C y evitará que el usuario utilice esa
combinación de teclas para detener su progrania.
f o r b a c k f i l e i n *.c
do
c p $ b a c l : f i l ~s o u r c e b a k l $ b a c k f i l e
echo $ b a c k f i l e
done 1 s o r t > cnames
Goodbye
$
$ cbackupG
AC
Goodbye
C7 Evaluación
1. ¿Puede anidar usted estructuras i f ?
1Nota -. -
-iNota
El shell TCSH n o tiene una versión comparable del comando read
del shell BASH.
. _Y
'
El shell T C S H exaiiiiiia el prinier carácter de un archivo para deter-
minar si es o 110 un script. Recuerde que todos los scripts de este shell
deben tener un signo de # como primer carácter eii la priinera línea.
Esto identifica el archivo como un script del shell T C S H . Observe el
carácter # al conlienzo del script greet. Al colocarlo en un lugar dife-
rente al de primer carácter de la priinera línea del archivo, el carácter #
opera coino un carácter ordinario.
98 1 Fundamentos de programación
--
en Linux
- -
* - -
--
P l e a s e e n t e r a q i e e t i n q : he110
. - - ----*
T h i g r e i t i n g you e r i t e r ~ dn a í bollo
>
Arreglos: ( ) y #
En el shell TCSH ii~tedpliedc declarar y us'ir arreglo\, 11,iciendo refe-
rencia a cada eleniciito. declara arreglo\ con el coniaiiclo set y una lista
de valores por cada elenieiito cn cl m-eglo. La liita d e valores se marca
entre p'iréntesii y c ~ d avalor se separa con 1111 eipacio. El arseglo es tan
grande coino el iiúmero de valores asignado. El siguiente ejemplo
decl,ir'i i i i i arreglo llaiiiado weather y le aiigiia tres valorei (vt:crcr figura
4-1). El arreglo weather tendrá tres cIciiieiito\, cada lino con un v ~ l o r
corrcspondieiite:
-
> weather
set =
. r.~iStadeval~q
( h o t col r a i n ) ----
-.
> echo $ w e a t h ~ r
sunny ccild r a i n
100 1 Fundamentos de ~roerarnaciónen Linux
1 2 3
arreglo
weather
hot 1 cold 1 rain
1' ""r", y
TIie w a ' t l l p - t ~ l d a y5 5 cO]d
Toino.rrcy t h i r r ? ,wil'ibe. r;itii
>
Usted puede especificar una gama de elen~eritosmediante la especi-
ficación del comienzo y el final del rango, separado con un guión
corto entre paréntesis cuadrados. El siguiente ejemplo imprime el valor
para los elementos segundo y tercero:
mRwG 1
cold rain
7 Lonjunco ae eiementos
----
aei arregol
---
Capítulo 4: Programación del shell TCSH
-
101
- -
mantiene el número de elementos en el arreg;lo weather es #weather. Como
con cualquier variable, usted puede tener acceso al contenido de #weather
precediéndolo con un signo $, como en $#u reather. En este ejemplo, se
1 , 1 1
imprime ei numero ae elementos en ei arreglo weather:
? greeta-rg He110
The g r e e t i n g y o u e n t e r e d was: H e l l o
7-
echo "The f i r s t argument i s : BargvC11"
echo "The second argument i s : $ a r g v C 2 I w
echo "The t h i r d argument i s : $ a r g v [ 3 1 "
echo "The f o u r t h aryument i s : $ a r g v C 4 I w
R> myargs k e w
The f i r s t argument i s : H e l l o
The second argument i s : H i
The t h i r d argument i s : y o
The f o u r t h argument i s : How a r e y o u
Ejecucióii
del script i r i p y s
myargs
Í echo
echo
echo
echo
"the first argiiiiieiit is SnrgvlIJ"
"tlie secoiid argiiiiieiit is $argv[2J1'
"tlie tliirci argiiniciit ic Sargvl.31"
"the fourth argiiiiieiit is Sargvl41"
L
The w e a t h e r t o r l a y i col (1
r;
Tüniclrrcrw t h p r p w i l l be t ;iin
>
#
echo "The number o f arguments e n t e r e d i s $ # a r g v W
> argnum H e l l o h i s a l u t a t i o n s
The number o f arguments e n t e r e d i s 3
Capitulo 4: Programación del shell TCSH
--
1 105
El script nplist y la figura 4-3 muestran el uso d e las variable? eipe-
cialcs del arguiiiento, argv[*] y #argv. El usuario preienta primero en
pantalla el i~íiinerod e arguinentoi que usan #argv y deipués emplea
argv[*] para preseiitar en pant~llala lista de los arguiileiitos que se
ingresaron.
!Número de argumentos
ii' de la línea de comandos
- - y " - .
eclio "The number o f argurnents e n t e r e d i s $ # a r g v U
echo "The l i s t o f a r g u m ~ n t si s :
1 La lista de argumentos
Ide la línea de comandos
Variables numéricas: @
En el shell TCSH usted puede declarar variables numéricas usando el
c o m a i d o @, en lugar del coinando set y puede realizar operaciones
aritméticas, relacionales y en modo de bits en dichas variables (usaido
los operadores apropiados).-A este respecto, el shell TCSH es sindar a
los lenguajes de prograniación. Las variables nuinéricas y de cadena son
dos tipos muy diferentes de objetos adniinistrados en forinas muy
distintas. Usted no puede usar el comando set en una variable nuineri-
ca. El comando @ consta de la palabra clave @, el noinbre de la varia-
ble, un operador de asignación y una expresión. El sig~iienteejemplo
declara la variable numérica num y le asigna el valor 10.
$#arglist Hello hi yo
Caritidad \ Lista d e todos los argumentos
arglist C echo
echo
"the number of arg~iments=$#argV"
"the list of argunients are=$argv[*IM
(a nurn = 2 10)
> echo d n u m
26
4
1
T n ü i i = $num 'i
> @ nurn += 1
> @ \incremento 1
.
Conio se niuestra eii el siguiente ejemplo, usted puede asignar los
resultados de una expresión aritmética a una variable numérica:
-
m u n t = 3
> @ num = ( $ c o u n t < 10)
> echo $num
1
>
La declaración de arreglos de elementos numéricos se complica por
el hecho de que usted necesita usar el coinando set para declarar
primero el arreglo. Después, puede usar el coniando @ para asignar
valores numéricos a los elementos del arreglo. En el siguiente ejeinplo,
primero se declara el arreglo degrees y después se le asignan valores.
Aunque estos valores pueden ser cualquier núinero, no se consideran
valores nrrrridricos.
,> eechoaegreesll
$degrees[ll
J P 1017
1o0
>
Cada vez q u e se llama u11 script del shell, éste genera su propio
uhell. Si cl w - i p t 5e ejecuta deide otro ucript del shell, tendrá sil propio
shell, ieparado del shell del primer icript. Ahora hay d o i shelli: el shell
padre, q u e pertencce al priiner script, y 1111 subshell, q u e es el nuevo
shell q u e se genera cuando sc ejecutó el segundo script.
. , --- - . . --.
; P.
..ff
setenv myfile "List"
e c h o "Displaying Bmyfile"
c a t - n Bmyfile
printfile
--mspírre
Displaying L i s t
1 screen
2 modem
3 paper
Printing List
Prueba de repaso
;Cómo asigna usted valores a una variable?'
¿Cómo asigna usted valores a una variable n ~ m é r i c a ? ~
¿Qué arreglo especial se usa para mantener los argumentos
de un programa del shell?'
dispfile
echo "1)isplayiiig Siiiyfile"
cnt -11 Siiiyfile
priiitfile
r -1
Figura
:- 4-4 Variable de entorno del shell TCSH referenciada desde un subshell
Estructuras de control
y operadores: while, if,
switch y foreach
Coino en otros shells, el shell T C S H tiene un conjunto de estructuras
de control que le periniten controlar la ejecución de comandos en un
script. Usted pciede usar las estructuras de repetición y las estructuras
d e control condicional para repetir coniandos Lirius o tomar decisio-
nes sobre cuáles coniandos quiere ejec~itar.Las estructuras de control
while e if son niás estructuras de control de propósito general que
realizan repeticiones y toniari decisiones usando diferentes pruebas. Las
estructuras de control switch y foreach son operaciones más especia-
lizadas. La estructura switch es una forma restringida de la condición
if que verifica si cin valor es igual a uno de los valores d e un conjunto
posible d e valores. La estructura foreach es un tipo limitado d e bucle
que fiinciona a través de listas d e valores, asignando iin nuevo valor a
una variable con cada repetición.
Expresiones de prueba
Las estructuras de control iTy while utilizan conlo prueba una cxprc-
sión. Una prueba con resultado verdadero es cualquier expresión que
da como resultado un valor diferente de cero. Una prueba con resulta-
do falso es cualquier expresión que da como resultado un valor de O.
En el shell TCSH, las expresiones relacionales y de igualdad se pueden
usar fácilmente conio expresiones de prueba, porque el resultado es 1 si
son verdaderas y O, si son falsas. Usted puede usar varios operadores en
una expresión, como se muestra en la tabla 4-3. La expresión de prueba
también puede ser una conlparación aritmética o de una cadena, pero
las cadenas se pueden comparar solaniente por igualdad o desigualdad.
A diferencia de los shells BASH y PDKSH, usted debe incluir entre
paréntesis las expresiones de prueba del shell TCSH, if y while. El
siguiente ejemplo muestra una sencilla expresión de prueba para
coniprobar si dos cadenas son iguales:
-( Fundamentos de programación
114 - en Linux
--
1Expresi6nde co~n~araciónl
' ii ( ~ g r e e
.. --
t
.--
i n g 1
' deigualdad
s PI~I
Operadores relacionales
> Mayor que
< Menor que
>= Mayor que o igual a
<= Menor que o igual a
!= No es igual
--
- - Igual
if i $gteeting =
;
4
~Hh3*'P)thP;irr
e c h o Inforinal Greeting
ncordancia con la
expresión regular
--
--
cndi f
Como en el shell BASH, .el shell TCSH también tiene varios opera-
dores especiales que ponen a prueba el estado de los archivos.
Muchos de estos operadores son iguales en ambos shells.
- ----- i
-- -
i c i i o Informal L r i e t i ng
endi f
endif
switch(cadena) Le permite elegir entre varios comandos alter-
case patrón: nativos.
comando
breaksw
default:
comando
endsw ,.
Capítulo 4: Programación del shell TCSH
-- -
La estructura if-then
La estructura if-then pone una condición sobre varios comandos
Linux. Esa condicióil es una expresión. Si la expresión da como resul-
tado un valor diferente de O, la expresión es verdadera y se ejecutan los
comai~dosque se encuentran dentro de la estructura if. Si el resultado
es 1111 valor de O, la expresión es hlsa y los con~andosdentro de la
estructura if no se ejecutan.
La estructura if-then comienza con la palabra clave [f; a la qiie le
sigue una expresióil entre paréntesis. La palabra clave t1w1 sigue en la
expresión. Usted puede especificar cualquier cantidad d e con~andos
Liniix en las líneas siguientes. La palabra clave crid!f termina el coman-
do if. Observe que, mientras en el shell BASH la palabra clave ~ h e n
ocupa una línea, en el shell TCSH tlzm está en la misma línea d e la
expresión de prueba. La sintaxis de la estructura if-then es la siguiente:
if ( expresión ) then
comandos
endif
P l ease e n t e r o p t i on :
in = $<
> ifls
Please e n t e r o p t i o n : S
L i s t i n g f i l e s by s i z e
total 2
1 monday 2 t o d a y
>
C o n frecuencia, usted necesita elegir entre doi alteriiativas, de
acuerdo a si la expresión ei verdadera o no. La palabra clave clsc permi-
tc que una estructura if elija entre dos comaiidos alternativoi. Si la
expreiión es verdadera, se ejecutan los coimiidos que siguen ininedia-
taniente después de la expresión. Si la expresión es falsa, se ejecutan loi
coinaiidoi que siguen a la palabra clave elsc. La sintaxis para el coniando
if-else es la siguiente:
if ( expresión ) then
comandos
else
comandos
endif
B
echo E n t e r S t o l i s t f i l e s i z e s .
echo o t h e r w i s e a l 1 f i l e i n f o r m a t i o n i s l i s t e d .
echo ,-n " P l e a s e e n t e r o p t i o n : "
s e t o p t i o n = $<
1s - 1
endi f
echo Goodbye
Capítulo 4: Programación del shell TCSH
Enter S t o l i s t f i l e s i z e s ,
o t h e r w i s e a l 1 f i l e i n f o r m a t i o n iS 1 i s t e d .
Please e n t e r o p t i o n : S
total 2
1 monday 2 t o d a y
Goodbye
>
. -
usted ingresó. Usar $#argv en una operación de pniel
si el usuario ingresó el núniero correcto de argumento
Si no fue así, puede ser neces~rioque termine el sci
,l t. *,.'.*. m , I I .. I I
120 1 Fundamentos de programación en Linux
> ifarg
I n v a l i d number o f a r g u m i n t c
E n t e r o n l y cine a r q i i i r i ~ n t
La estructura switch
La estructura switch elige entre varios con-iaildos alternativos posiblcs
y e i iiinilar a la eitructiira case del shell BASH e11 el ientido d c q u e se
hace mediante coi~ip~raciói-i d e una cadcxa con varioi patrones posi-
bles. Cada u n o d e estos patrones está '-isociado con un coiijiii~tod e
Capítulo 4: Programaci
Paso a paso
1. Cree u n menú de tres opciones para listar archivos por tamaño, por
información completa del archivo o sólo por archivos C (los que
terminan con extensiones .c). Utilice tres comandos echo sencillos.
2. Pida al usuario que ingrese u n opción, la cual lee después la variable
choice usando el comando set y el operador $<.
3. Utilice una estructura switch para determinar la opción que el usua-
rio hizo. Evalúe la variable choice en la expresión switch, $choice, y
use su valor para verificar si hay concordancia con el valor del patrón
en las entradas case.
4. Configure tres entradas case. La primera es para el patrón S, el cual, si
tiene concordancia, ejecutará el comando Is con la opción -S,
listando los nombres d e los archivos por tamaño. La entrada termina
con el comando breaksw.
5. Utilice la segunda entrada case para mantener el patrón 1, el cual, si
concuerda, listará los archivos con toda la información d e los mis-
mos, incluyendo la fecha del último cambio y los permisos de acceso.
La entrada t e r r n i n a ~ o nel comando breaksw.
6. Utilice la tercera entrada de case para mantener el patrón *.c. Si hay
concordancia aquí, se ejecutará el comando Is*c, el cual presentará
en pantalla todos los nombres de archivo que terminen con los
signos .c (el * es u n carácter especial que completa cualquier patrón).
La entrada termina con el comando breaksw.
7. Para la entrada predeterminada, presente en pantalla u n mensaje de
error "lnvalid Option". También terminará con el comando breaksw.
8. Termine la estructura switch con el comando endsw.
El siguiente es u n ejemplo del script Ischoice:
Capitulo 4: Programación del shell TCSH
-
1 123
B -
echo s . L i s t S i z e s
echo 1 . L i s t A l 1 F i l e I n f o r m a t i o n
echo c. L i s t C F i l e s
switch ($choice)
case S :
1s - S
breaksw
case 1 :
1s - 1
b r e a ksw
case c :
1s * . C
breaksw
defaul t:
echo I n v a l i d O p t i o n
breaksw
endsw
s . L i s t Sizes
1. L i s t Al1 F i l e Information
c. L i s t C Files
Please e n t e r choice: c
i o . c 1 i b . c main.c
7 --
echo s . L i s t S i z e s
e c h o 1. L i s t A l 1 F i l e I n f o r m a t i o n
echo c. L i s t C F i l e s
switch ($choice)
case [SS]:
1s - S
b r e a ksw
case L:
c a s e 1:
1s -1
breaksw
case C:
case c :
1s-k.c
b r e a ksw
defaul t
echo I n v a l i d O p t i o n
b r e a ksw
endsw
-
El siguiente es un ejemplo de la ejecución del script lulschoice:
'">"1ulschoíce clcc.errm
s. L i s t S i z e s
1. L i s t Al1 F i l e Information
c. L i s t C F i l e s
Please e n t e r choice: C
main-c 1ib.c fi1e.c
Capítulo 4: Progra
3
Estructuras de control
de repetición
.
Descripción
La estructura while
El biicle while repite coinaidos; coinieilza con la palabra clave ir~lzilcy
esti seguida por una espresióil entre parkiitesis.
La palabra clave c i d especifica la teriiiiiiacióii del biicle. La sintaxis
del biicle while es la sig~iiei~te:
whi le ( expressión )
comands
end
1s - S
b r e a lisi~r
c a s e 2:
1s -1
b r e a ksw
ca.se 3 :
1s *.c
b r e a ksw
c a s e 4:
s e t a g a i n = no-Hará que la prueba'
echo Goodbye del bucle
- - falle
- t -
breaksw
clefaul t
Capítulo 4: Programación del shell TCSH
- .---
1. L i s t S i z e s
2. L i s t Al1 F i l e Information
3. L i s t C F i l e s
4. Q u i t
Please e n t e r choice: 3
main.c 1ib.c fi1e.c
1- .. l i. s- -t -Y . -
~ ~- P s
2 . L i s t A11 F i l e I n f o r m a t i o n
3. L i s t C F i l e s
4. Q u i t
P l e a s e e n t e r cho i c e : 4
Good - b y e
>
La estructura foreach
La estructura foreach se diselió para hacer referencia en foriila
secuencia1 a una lista d e valores. Es siiiiilar a la estructura for-in del
shell UASH y cuenta con dos operandos: una variable y una lista de
valores entre parkntesis. Cada valor de la lista se a u g m a la variable en
la estructura foreach.Taiito la estructura w h i l e coino la estructura
foreach son buclei. Cada vez que pasa el bucle, a la variable se le
asigna el siguiente valor de la lista. Cuando se llega al filial de ésta, el
bucle se detienc. Loi cuerpos de los bucles w h i l e y f o r e a c h terminan
con la palabra clave c i d . La siiitasis de f o r e a c h es la siguiente:
r - -
&Asigna . . ..
el siguiente archivo
rariable
-reptiticicin~
-
. - - - -
@ argnum = 1
f o r e a c h b a c k f i l e ($argv[*l)
cp Bbackfile sourcebak/$backfile
echo "$backfi l e $argv[$argnuml"
@ argnum = $argnum + 1
end
El siguiente es ~ i r ejemplo
i de la ejecución del script cbnckrq~ay:
e- - -
>
y
Prueba de repaso
¿Qué estructura se podría usar para reemplazar una estruc-
tura switch?'
La estructura repeat
Esta es una estructura que siii~pleriieriterepite deteriiiinado coniando
un núiiiero específico d e veces. Sólo puede repetir un coniando. La
estructura repeat coiiiienza con la palabra clave rqwot, una cifi-a para
indicar el riúinero de repeticiones y el comando que se ha de repetir.
Esta ei la sintaxis:
> repeat num comando
En este ejemplo, el coniando echo se repite tres veces.
T7 ZlFEeTo
_-II
=eat 'a
g
-
he110 a g a i n
he1 l o a g a i n
he1 l o a g a i n
El comando continue
Conio en el ilicll BASH, el coiiiando continue del shell T C S H se usa
con bucles para no tomar en cucnta los enunciados restantes e n el
cuerpo de u n bucle y continuar con la siguiente repetición.
Q num=0
w h i l e ($num < 6 )
0 num = $num + 1
i f ( (8num % 2 ) == O ) c o n t i n u e
echo "8num i t e r a t i o n o f l o o p "
end
echo Goodbye
Capítulo 4: Programación d e l shell TCSH
-.
1Nota - -
while ( 1
i f ($num > 3 ) b r e a k
echo "$num i t e r a t i o n o f l o o p "
@ num ,= $num + 1
end
echo Goodbye
1 i t e i a t i o n o f loop
2 i t e r a t i o n o f loop
sn o f l o o p
f o r e a c h f i lename ( * )
i f ( $filename =- Cn-zl* ) break
echo $ fi 1 mame
e nd
echo "Goodbye"
> 1s
1 i b . c mait1.c resume terrnpaper
> fnamesAM
1ib.c
main.c
Goodbye
Capítulo 4: Program
"'*d " 2
Paso a paso
1. Detecte cualquier directorio en el directorio actual y después verifi-
que si contienen páginas Web (cualquier archivo con extensiones
.html o .htrn). Los nombres de estos archivos se ponen en cadenas
que comprenden comandos HTML, href para seleccionar y presentar
en pantalla los archivos. Las referencias HTML se organizan en una
lista con las etiquetas (ró?ulos) <ul> y </ul>, precedidos por un
rótulo <lb. Los nombres de directorio se utilizan como encabezados,
con la etiqueta <hl>.
2. Utilice el comando foreach con un para comparar todos los archi-
vos y nombres de directorio, ubicándolos en la variable $i.
3. Si encuentra un directorio, busque cualquier archivo HTML en un
bucle interno foreach. Ponga los archivos HTML en la variable j.
4. Busque el archivo HTML para un título y úselo como el texto de
enlace en el índice. Utilice grep para buscar la presencia de un
patrón <TITLE>. S i encuentra alguno, regréselo a la variable tline. Si
no encuentra el patrón, regrese a 1 a la variable de estado $?
5. Revise la variable de estado $? para comprobar si grep tuvo éxito. En
caso afirmativo, use un conjunto de comandos sed para conectar las
etiquetas precedente y final <TITLE> y </TITLE>, junto con cualquier
134 1 Fundamentos de programación en Linux
echo '<html>'
F C ~ Q íhead>'
de alto nivel
. . ' > . '. .*
.. ......
. ,
. . .. . ..
,
A'. .. .,
,, .
.." ..
. ,, . . , . . .. <
. . _ ' ' '
GAWK
El comando gawk
El coniando gawk toma como sus argumentos una instrucción y una
lista de nombres de archivos. La instruccióii GAWK se encierra entre
coinillas siniples y se lee coino ~ i i argumento.
l
Opciones Descripción
-f nombre-archivo Con esta opción, GAWK leerá los comandos des-
de nombre-archivo. Esta opción se estudia más
adelante en la sección "Archivos de instrucción
~ ~ % A w K "de
, este capitulo.
-Fc Esta opción especifica un delirni'tador de campo,
c, para el archivo de entrada. Esta opción se estu-
dia más adelante en la sección "Delimitadores de
campo", de este capítulo.
Búsquedas de patrón
y caracteres especiales
La búsqueda de un patrón en GAWK se identifica con una barra
vertical inclinada hacia la derecha (slash) al coniieiizo y al final, y se
coloca en el segmento patróii, o condiciórr, de la instrucción GAWK.
Capitulo 5: GAWK 1-
143
- v
p..
S gawk ' / P o e / E p r i n t l ' books
Raven Poe 2.50 Pengui n
g gaw s
Tempest Shakespeare 15.75 Penguin
Raven Poe 2.50 Penguin
' $ ga w l - m
Tempect Shak~:pí?ar,? 1 5 . 7 5 Periqtrin
C h r i ::mas Di~kens 3.50 Academi r
11-¡;id Homr r 10.25 Fandom
Raven Poil 2.50 Pengui ti
gg ~ e - ~ -.
"'Tempest
7..-.-- -.
Shakespeare
----1 5 . 7 5 7 K j i ; T r i - - -
>,-
{priiit 52, S I )
Lns vnriablei de cnnipo hacen refereiicia
-
3 los cnnipw en cada Iíiien
1 1
-
Y- -i
7-
Teiiipest Shakespeare 15.75 Penmiin 0
Shakespeare I'eiig~iin
Christiiias lJickens 3.50 Acadeiiiic + gawk-, I>ickens Acadeiiiic
Iliad Homer 10.25 Kandoin Hoiner Ilnndoiii
IJenguin
\
aii th-piib
Teiiipest Sliakespeare
Chri~tiiias Ilickeris
Iliad
Ilavcii
Hoiiier
Ibc
15.75
3.50
10.25
2.50
I'engiiiii
Acadeiiiic
Ilniidoiii
I'engiiin X
Shakcspcarc l'erigiiiii
Dickens
Hoiiier
Delimitadores de campo
Por defecto, GAWK separa campos por medio de espacios o tabula-
ciones. Sin embargo, si usted quiere usar iin delimitador específico,
puede especificarlo con la opción -F, la cual, en realidad, establece una
variable GAWK especial llainada F S que actíia como separador de
campo. C o n la opción -F, puede especificar cualquier carácter que
desee como delimitador.
En el siguiente ejemplo, el archivo b o o k s l utiliza un signo de punto
y coma para separar campos. La opción -F hace que GAWK considere
el signo de dos puntos conio un delimitador de campo.
T
T
'Z
Tm
-
tit $4. '3'3'31;-
print G j T % k s C
Academi c 3.50 Dickens Christmas caro1
Christmas caro1 : Dickens: 3.50: Acadernic
Prueba de repaso
¿Qué sucede si usted especifica una acción sin ningún patrón?'
¿Puede aplicarse la concordancia del patrón de una expresión
regular a campos particulare~?~
Variable Descripción
NR Mantiene el número del registro actual.
NF Número de campos en el registro actual.
$0 Todo el registro actual.
$n Los campos en el registro actual, numerados a partir de 1;
por ejemplo, $1.
FS Delimitador$e campo de entrada; el delimitador predeter-
minado es un espacio o una tabulación.
OFS Delimitador del campo de salida; el delimitador predetermi-
nado es un espacio o una tabulación.
RS Delimitador del registro de entrada; el predeterminado es
un carácter en una Iínea nueva.
ORS Delimitador del registro de salida; el predeterminado es un
carácter en una nueva línea.
OMFT Formato de salida para números; el delimitador predetermi-
nado es O/og.
FILENAME Nombre del archivo de entrada actual.
9 ga'wk v r p r l ' F K V 5 f m ~ k ~ 1
1 Shakespeare Penguin
2 Dickens Academi c
3 Huiiier Randoni
4 Poe Pengui n
Sha kespeare .
Dickens
Horner
Poe
Capitulo 5: GAWK 1 151
Constantes
Lai c o n i t ~ n t e pueden
i ser valorei mtini.ticos o cadenas. Las constx~tes
m t m é t ~ c xie representm con dígitos. El número 56 representa cl v ~ l o r
aritn~ético56. Las constantes de cadena pueden ser cualquier conjunto
de caracteres entre comillas dobles, de inodo que una conitante de
cadena pJra la palabra cdrtrorl es "edition".N o olvide que un núnlero
precedido con un signo de dincro es una variable de cainpo y un
número SIII cse signo ei una conitante aritmética.
consejo -
7 - 7 7 ~riñts'uitr ,i',
<$i pos 1) * bookst
War
Chri stmas
m f 5.1t o i F C e p o r t-
9
p r i n t f here re were %d % S " , 23. " v l s i t o r s . " ) ;
V i s i t o r s Report There w e r e 23 v i s i t o r s .
Wgjwk - ~ m n b eu i r rs f l
The authot i s Shakespca~P p i b l i s h e d by Penguin
The author i s D i i k ~ n spub1 i:h-d b v Academic
Ttir a u t h n r i s Homer pulllim;hed b.v Randoiii
Tht d u t r i i ~ r i s Poe p u b l i s h e d by Penguin
Capitulo 5: GAWK 1 157
Modificadores de printf
.num
- Descripción
Modificador de ubicación del punto decimal
flotante. El punto se usa para dar formato a
valores con punto decimal flotante y especifi-
ca la cantidad de lugares que se deben pre-
sentar en pantalla a la derecha del punto
decimal. Por ejemplo, O/0.2f.
Num Modificador de la longitud del campo. Cual-
quier número que modifique el especificador
del formato determina el ancho mínimo del
campo del valor que se está formateando.
Por ejemplo, %5s.
Justificación a la izquierda (la justificación a la
derecha está predeterminada). Por ejemplo,
%-los para un número justificado a la iz-
quierda, con 10 dígitos.
Modificadores de conversión
ramación en Linux
,.
segmento patrón
como una condición
El segmento patrón de una instrucción GAWK se puede considerar
corno una condición de prueba. Las estructuras de control en los
lenguajes de programación tienen expresiones de prueba para determi-
nar si son falsas o verdaderas; en caso de que la prueba sea verdadera, se
ejecutan los enunciados de la estructura de control. Del mismo modo,
un patrón en GAWK se puede considerar como una expresión de
prueba: si el patrón tiene un resultado exitoso, entonces es verdadero y
se ejecuta su acción GAWK. En este sentido, un patrón es una condi-
.
ción para la ejecución de la acción. Los operadores que usted puede
usar para crear pruebas de este estilo se presentan en la tabla 5-7.
También se incluyen patrones especiales que especifican ciertas condi-
ciones. Por ejemplo, los patrones BEGIN y END ejecutarán el código
antes y después del código principal.
. - - - . . - .
i gawk '$4 -= 'Venguiri" ~ ~ r i ' n t 1 T o o k s - - %
Operadores lógicos
GAWJC tiene 1111 coiijuiito de operadores lógicos que usted piicde usar
para crear condiciones coniplejas. Los operadores lógicos son los
niisiiios que se iisari en e1 lenguaje de programación C y se presentan
en la tabla 5-7. El operador lógico para A N D es i i i i ampersatid doble
(&a),el operador lógico para OR es iina barra vertical doble ( 1 1 ) y el
operador lógico para N O T es 1111 signo final d e admiración sencillo (!).
Los operaiidos para operadores lógicos son las coiidiciones iiiisiiias que,
por lo general. van entre paréntesis.
En el siguiente ejeiiiplo, se iniprinie la lista de todos los libros
publicados por I'enguiii qiie cuestan mis d e $10.00. Esto iiiiplica
comparar el cuarto caiiipo con "l'engiiin" y comprobar si el tercer
campo cs mayor que 20.00,
W4'(;f4 a ~ 4 i t3-'-b 00 k S
- i .
Tenipest Shakespeare 15.75 P e n g u i n
-
busca "niai".
-
-- - -
m $ - 1 / m i > m b o o k ~ - - ' '--'-
Christmas D i c k e n s 3.50 Academic
-nrm
' $'gawk * ( f 4 7 l ~ p j é n g / ' ) - ~ p % t ? ~F O O ~
Tempest Shakespeare 15.75 Penguin
Raven Poe 2 . 5 0 Penguin
Patrones de rango
La utilidad GAWK ~itilizala coma coino un operador e~pecialque se
puede ubicar entre dos coildicioties para recuperar un rango de las
líneas. La primera Iínea en el conjunto es la prinlera línea que cumple
con la primera condición. La últinia línea en el conjunto es la sig~iiente
línea que cuiilple con la seguild'~coildición.
El operador coma resulta d e particular utilidad para seleccionar un
rango de líneas utilizando la variable especial N R , la cual tiene el
núiiiei-o de la línea actual. La condición N R = = 4 seleccioiiará la
cuarta línea porque cuando se alcanza la línea cuatro, el valor de N R
será 4 y la condición ser5 verdadera. N R = =1, N R = = 3 especifica
u n rango de líneas que comienzan con la l í n e ~1 y termiilaii con la
lítiea 3. En el siguieiite ejemplo, solainente se iinprimen las tres priine-
ras líneas.
m
Tempest
-Shakespeare
l. NR ' TO
-~KS
1 5 . 7L8 Periquin
Christrax Dickens 3 . 5 0 Academi c
lliad Hhne:' 1 0 . 2 5 Random
164 1 Fundamentos de programación en Linux
--
Operaciones aritméticas
y de asignaclon
GAWK tiene un conjunto conipleto de operadores aritmbticos. Usted
puede realizar los cálculos de riiultiplicación, división, adición, suitrac-
ción y módulo. Los operadores aritniéticos son los mismos que se usan
en cl lengiiaje d e prograinacióii C y se presentan en la tabla 5-8, junto
con los operadores de asigiiación, los cuales se explican brevemente.
Usted puede realizar cálculos aritméticos con valores numéricos
representados por patrones nuniéricos. U n patrón numérico es cual-
quier seciiencia de d!gitos y una coiistante aritmética es un patrón
numérico obvio. U n cainpo cuyo contenido son dígitos, tainbién es un
patrón numérico. Las constantes aritméticas, las variables de campo y
las variables definidas por el usuario, cuyos valores son patrones i ~ u m é -
ricos, se p~iedenusar coino operandos en operaciones aritniéticas.
Taiiibién hay ciertas variables especiales d e GAWK que se definen
coino numéricas, tales como NR y NF, que taiilbién piiedeii ser
operaidos aritméticos
Las operaciones aritniéticas se piieden usar como el segmento
acción o patrón de la instrucción GAWK. En el siguiente ejeinplo, el
usuario obtiene conio resultado la línea con núniero par. El signo de
porcentaje e%) es un operador de inódulo que da como resultado el
residuo de una división. Si 2 divide igiialinente el iiúiiiero de la línea
sin que haya nirigúii residuo, entonces la Iínea es una Iínea con número
par. Observe que el paréntesis se utiliza para arreglar la expresión.
Capitulo 5: GAWK 1 165
~ [ W
2 Christmas
TBR - . m r r n t R7T'F books
Dickens 3.50 Academic
-
Operadores aritméticos
y funciones Descripción
* Multiplicación
División
Adición
Sustracción
Módulo; el resultado es el residuo de una división
Corta un número de punto flotante, num, para
aproximarlo a su valor entero
cos(num) Presenta el coseno de num
sin(num) Presenta el seno de num
log(num) Presenta el logaritmo natural de num
exp(num) Presenta el exponente de num
sqrt(num) Presenta la raíz cuadrada de num
rand() Presenta un número aleatorio
srand(num) Usa num como una nueva semilla para rand()
Operadores de asignación
-
- ~si&ación
++ Incremento
Decremento
Adición y asignación; i = i + 1 es igual a i +=1
Sustracción y asignación; i = i - 1 es igual a i -=1
Multiplicación y asignación; i = i * 1 es igual a i *=1
División y asignación; i = i / 1 es igual a i /=1
Módulo y asignación; i = i % 1 es igual a i %=l
m m p r 7 n t "T~t'ai-'~,fotl'-tjoo'k~
Tempest Shakespeare 15.75 Pengiiin
Christmas Dickens 3.50 Acadt-ini c
Iliad Homer 10.25 Randorn
Raven Poe 2.50 Penguin
Total- 32
arreglo y con frecuencia se utiliza en bucles para actualizar variables que controlan
un bucle. En el siguiente ejemplo, el iisiiario emplea la varhble linenum para
"a,-.:..
-1
-
"-,Ao+-- A A p,,A.. .
.L.*'%..,. A 1:..&* a,- fiA--l.;n A& .
."e
.- MD L
.-.
...
- "a
IXckens
Hoiiicr
Poe
priiit piibl"lhckeiis"j
(piibl[S?] = $4)
Se drfiiie un arrcglo llamado pub1 y sus
elementos se asignan a los valores del cuarto
caiiipo y se organizan segúri el nombre del gawk Acadkinic
autor cn el segundo campo.
\ books
/ ~ i ~ * r5-21
a Un arreglo asociativo que usa cadenas para organizar los elementos
-1 Fundamentos de programación en Linux
170 - -
Archivos de instrucción
de GAWK
Coilio las iiistruc-cioiies de G A W K se hacen coniplejas, es inás fácil
imnejarlas eii archivos que G A W K pueda leer con f d i d a d . Si usted
necesita hacer algúii cambio, sólo debe modificar cl archivo. La opcicín
-f permite que G A W K lea las instruccioi~csG A W K desdc ~ i i iirchivo,
l cn
lugar de hacerlo desde la Iíriea de comandos (la opción -f se estiidi0 en
una pregiirita de 1ii sección "El coiii;indo gawk" al comit:nzo de este
capítiilo). E11 t.1 ejemplo sigiiicnte, las iiistruccioncs dc G A W K para listar
los libros publicados por I'ei~g~iiiise colocan en ~ i i archil~o
i llamado
Jirirlbk. Entonces, se llama a G A W K con la opción -f y el noinbi-c dcl
archivo.firrdbk.La instruccióii G A W K se leerá desde el archii~o-findbk.
-
BEGIN [ p r i n t "Book L i s t " ;
count = 0;
1
$4 - IPenguinI I
c o u n t = count + 1;
print;
END (
3
-
p r i n t " T o t a l r e c o r d s found i s ", c o u n t :
1
$ gawk - f f i n d b k books
Bool L1st
5li;iko ;noare 15.75 Petiqirin
2.50 Fpnqiiin
is 2
Estructuras de control
GAWK opera como un lenguaje de programación y le permite definir
variables, construir expresiones y asignar valores.También incluye un
conjunto de estructuras de control para permitir la capacidad de repe-
tición y selección. En GAWK hay tres estructuras de control para
construir bucles: while, for y for-in. Existe una estructura de control
de selección: if. Las estructuras de control de GAWK se presentan en la
tabla 5-9 y se describen en detalle en las secciones siguientes. Con
excepción del bucle for-in, estas estructuras de control son similares a
las del lenguaje de programación C.
El bucle while
.
El bucle while consta de la palabra clave while seguida por una exprc-
sión de prueba entre paréntesis. Una acción GAWK sigue a la expresión
de prueba y se pueden combinar varias acciones GAWK en un bloque
de acciones con corchetes, separando cada acción con un signo de
punto y coma.Al colocar un bloque de acciones después de la expresión
de prueba de un bucle while se ejecutan todas las acciones que se
encuentren dentro del bucle. Esta es la sintaxis del bucle while:
3 Sí; GAWK puede leer desde la entrada estándar y escribir en la salida estándar.
4 Sí; usted puede crear scripts de shell que usen comandos GAWK.
amación e n Linux
IConmjb .. .
'books
T~mpest Shakesptá~r-e 15.75
Chri stmas D i ckr.ris 3.50
11 iad íiomer 10.25
Raven Poe 2.50
Usted puede adaptar con facilidad el bucle while para usarlo con
arreglos. La variable que se utiliza para controlar un bucle también se
puede emplear, dentro del bucle, para establecer el índice de un arreglo.
En el scriyt titlearrczy que sigue, los elementos del arreglo title se asignan
C a p i t u l o 5: GAWK 1 175
copi,ido\ por split \e ii\igiia entonces a 11' variable fnum y loi elemento\
dcl arrcglo se inipriiiien u~,iiidofnum c o m o el e i i l ~ c csuperior.
El bucle for
Este bucle realiza las iiiisiiias tareas que el bucle while pero tiene un
formato diferente. La iiiici'ación, la prueba y los coiiiponeiites del
increiiieiito d e uii bucle estliii incorporados en la sintaxis del bucle for,
que cuenta con tres expresiones entre parkiitesis y separadas por punto
y coinii.
for ( expresión 7; expresión2; expresión3)
1I
acciones-gawk;
1
La priiiiera expresión se ejecuta antes de que el bucle realniente se
ingrese; por lo común, consta de una iniciación de iina variable que se
lisa para controlar el bucle. La ieguiida expresióii es la expresión de
prueba, tal c o m o una expresión relaciona1 qiie controln el bucle. La
tercera expresióii se ejecuta dentro del bucle al final. En general, se
ciiiplca para increiiicntar la variable que controla el biicle. llespuks de
las expresiones va la acción GAWK que se ejecuta dentro del bucle.
176 1 Fundamentos de programación en Linux
Usted puede usar con facilidad el bucle for, al igual que el bucle
while, para administrar arreglos. La variable que se usa para controlar
un bucle también se puede emplear dentro del mismo como el índice
del arreglo. En el archivo titlenrrq, los elementos del arreglo title se
asignan al valor de cada título. Despué5, el contenido de cada elemento
se imprime usando un bucle for. La variable i se utiliza para controlar
el bucle. Se inicia en 1, en la primera expresión de for y se increinenta
~ J la
I última expresión; el increniento tendrá lugar después de la acción
print. La segiinda expresión es la expresión de prueba que controla el
bucle.
--
Capitulo 5: GAWK 1 177
Ternpest
Christmas
Iliad
Raven
El bucle for-in
Aunque en los ejemplos anteriores se usó una variable numérica para
referirse a los elei~ientosen un arreglo, no sirve como ayuda cuando
usted necesita aludir a elemeiltos de iin arreglo asociativo, a los cuales
se hace referencia por medio de cadenas, no de números. CAWK tiene
una estructura especial de control del bucle for-in que le permite a
usted hacer referencia a un arreglo asociativo.
Esta estructura del bucle-consta de la palabra clavefor, pero es muy
diferente del bucle for. Es una expresión especializada que usa la
palabra clave ii? como su operador, que es la razón para que el buclc se
describa coino for-in y no sólo como bucle for.
El primer operando en la expresión del bucle for-in es una variable
y el segundo operando es el rioinbre del arreglo. Cuando se ejecuta el
bucle, la cadena qiie contiene el índice de cada elemento se asigna a
esta variable. Entonces, usted puede usar el contenido de esa variable
para referirse al índice de un elemento dentro del arreglo. N o se per-
mite ningún otro tipo de expresión. El bucle for-in para un arreglo
asociativo es muy restrictivo en este sentido. La sintaxis para el bucle
for-in es como sigue:
for(variab1e in nombre-arreglo)
í
I
acciones-ga wk;
1
-1 Fundamentos de programación
178 - .
en Linux
- -- .- .
La estructura de control if
GAWK tanibikri tienc una estructura dc control de selección que
perniite seleccionar acciones alteri~ativas.Esta estructura, if, c~ieiitacon
una cspresión de prueba entre paréntesis y después de la pruebn sigue
uiia acción (;AWI<. Si la priieba es verdadera, se realiza la acción. En
caso contrario, la acción se pasa por alto. Esta es la siiitaxis d e la estruc-
tura i f
if(expresión de prueba)
{
acciones-gawk;
1
Capitulo 5: GAWK 1 179
if (expresión de prueba)
acciones-ga wk;
else
acciones-ga wk;
JNota
Tenga especial cuidado y observe que no haya ningún signo de
punto y coma al terminar las acciones de CAWK que se realizan antes
de else. La estructura if-else de CAWK es similar a la estructura if-
else del lenguaje de programación C, con esta excepción. Si usted
usa lenguajes de programación, puede agregar inadvertidamente un
punto y coma, algo que se considerará un error porque un punto y
coma en CAWK separa acciones. - --.
' C
i f ( S 3 > 10.00)
$3 - $ 3 + (0.10 * $3 )
el se
$3 -
p r i n t $0
$3 + ( 0 . 2 0 * $ 3 1;
El enunciado getline
Este enunciado le permite controlar la lectura actual de las líneas de
entrada. Por lo común, GAWK leerá una línea de entrada a la vez y
aplicará todos los comandos y acciones que hay en un archivo GAWK
a esa línea; getline le permite leer una línea de entrada dentro de una
acción GAWK. Usted puede realizar, entonces, unas pocas operaciones
específicas sobre la línea, en lugar de tener que aplicar en ella todos los
comandos y acciones.
Por ejemplo, suponga que desea realizar una acción, pero no en la
línea que se encuentra conlparando, sino en la siguiente. Usted puede
usar las poderosas capacidades de comparación de patrón de un co-
mando gawk para localizar la línea que necesita y después, usando
getline,leer la siguiente línea y realizar en ella la operación que desee.
El comando getline lee una línea de entrada y la ubica en la varia-
ble $0. La primera vez que usted usa getline en una acción, ese co-
mando reemplaza la línea de entrada que GAWK acaba de leer
automáticamente. Asegúrese de realizar las operaciones que necesite en
la línea de entrada cuando GAWK hace la lectura, antes de salir con su
enunciado getline.
Cuando use getline en un bucle es necesario que verifique una
condición de terminación de archivo; getline no detendrá a GAWK
automáticamente al final de un archivo sino que presenta un O, si llega
a esa parte. En caso de que no llegue al final de archivo, presenta un 1.
Usted puede asignar este valor de retorno a una variable y después
-
Capítulo 5: GAWK 181
!"\ .TSr
endfile
C
- 1: *
w h i l e I ( e n d f i l e !- 0) && ( $0 !- / " \ . T E / 1
(
endfile
1
-
p r i n t $0;
getline;
p r i n t $0:
1
IC o n ~ e ~ b
Es importante poner a prueba esta condición de fin de archivo cuan-
do usted usa bucles con getline. Sin ella, getline continuará tratan-
do de leer, desde su entrada, incluso cuando se encuentra al final del
archivo. El bucle mismo continuará como un bucle infinito hasta aue I
l~abla5-10
- 1 Operaciones d e entrada y salida de GAWK c o n archivos
7
getl i n m e r p u b < "publíst";
while ( ( g e t l i n e bufferpub
3
pubarrayCbufferpubl -< "publlst")
1;
!- 0)
C
.-
C en un archivo 1
I~scribiendo-datos
-
c o u n t c 1:/
p r l n t $1 >> " t i t l e l i s t " ;
p r i n t $2 >> " a u t h o r l i s t " :
J
1
END (
p r l n t " T o t a l r e c o r d s found I s
1
". count
' i4iwk - i - g e
T o t a l r e c o r d s found i s 3
r
- - - --- 4
$ cat t i t l e l i s t
Tempist
11 i a d C .
Raven
S c a t a u t h o r l is t
Shakespeare
Homer
Poe
Paso a paso
1. Cree un archivo de script llamado field3 en donde pueda ubicar la
instrucción CAWK. La instrucción imprimirá los primeros tres campos
de cada Iínea.
2. Marque entre comillas la instrucción CAWK, comenzando con una
comilla sencilla antes del corchete de apertura y termine con otra
después del comando gawk.
3. Cree un bucle for que iniciará una variable llamada i y la
incrementará tres veces.
4. Cree enunciados printfque usen el valor de i para referenciar un
campo, comenzando con el primer campo y terminando con el
tercero.
5. Cree un enunciado final printf que dé como resultado un carácter de
nueva Iínea después que el bucle termina.
6. En la última Iínea, después de la comilla sencilla de cierre y luego del
corchete de cierre, ingrese el nombre del archivo que ha de leer
CAWK (books).
7. Establezca el permiso de ejecución para el archivo de script, y des-
pués ejecute ese archivo ingresando simplemente el nombre del
mismo.
A continuación presentamos el contenido del script field3:
186
,-
1 Fundamentos de programación en Liniix
-
p r i n t f ( " % s \ t m , S i 1:
1
p r i n t f("\nW);
1 ' books
Administrar entradas y salidas de Perl para archivos, para entrada y salida estándar y error
Operaciones'con la línea
de comandos de Perl
Perl puede ejecutar un comando Perl que se ingresó en la línea de
comandos o un archivo de comandos Perl. Los archivos de comandos
se utilizan más comúnmente, permitiéndole crear lo que, en esencia,
son programas Perl. Perl se llama usando el comando perl; después de
ingresarlo, se necesita introducir una opción para especificar si está
ejecutando un script de Perl o un comando Perl simple: -e para un
comando simple y -f para leer comandos de un archivo. Las opciones
de Perl se presentan en la tabla 6-1.
Capitulo 6: Perl 1 189
Opción d e la Iínea d e comandos Descripción
-e Entra una línea de un programa Perl
-n Lee desde los archivos que se listan en la línea
de comandos
-P Lleva cualquier dato leído hacia la salida
estándar
Vr1 -e 7
Scripts de Perl
Usualiiiei~te,los co1ii:indos de l'ei-1 se ponen en un archivo que
dcspués lee y ejecuta el comando Perl. En efecto, usted est5 crcando
u11 sl-iell en donde se e ~ e c u t a nsus coinandos l>erl.Los archivos que
coiitieneii coinandos Perl deben tencr la extensión .pl. Esto identifica
el archivo coino un script de l'crl que se piwde leer con el coiriando
perl. Hay dos maneras d e usar este coiiiaiido con el fin d e leer scripts
d e I'erl.
La primera opción es ingresar el coiiiando perl en la línea de
c o i m i d o s del shell, seguida por el noinbi-c del script de I'erl. Este leerá
y ejecutará los coii~andos.En el siguiente ejcniplo se ejccuta un script
dc Perl Ilaiiiado 1rello.yl.
p r i n t "hellb\n":
g u n t e -a los expertos
9
Pregunta: ¿Cuáles son algunos errores comunes en la sintaxis?
Respuesta: Aunque Perl es ui~leriguajeinterpretado, todo el script de I'er
se valida primero antes de ejecutarlo, verificando si hay errores en tirnipo dt
A ..,.. a-.-..
.. c- ?A",. ,.c-..-.
L..- L b - " .-,.-A A- -.,.".. ..-.. +,.ll,. :c-.-.,a- l
inncio d o , como en el C J W de C.
varihle5 siempre deben estdr prefijjadas con un h h a l o de dinero
Esto es muy diferente de GAWK y C.
192 1 Fundamentos de programación en Linux
Entrada y salida
Un script de Perl puede aceptar entradas desde diferentes f~ieiites.
Puede leer entradas de diferentes arcliivos, desde la entrada estándar e
incluso desde interconesiones. Por esta razón, usted tiene que ideiitifi-
car dentro del progrania la fuente de su entrada; y a diferencia de
GAWK, pero como en un programa de shell, tiene que darle instruc-
ciones explícitas al script de Perl para leer la entrada. Una fuente de
entrada en particular se identifica por medio de un \\lnrrejador de archivo,
un nombre que usa un progrania para hacer referencia a una fuente de
entrada, corno en el caso de uri archivo en particular. Perl ya cuenta
con un manejador de archivo para la entrada estándar y para la salida
estándar, lo nlismo que para el error estándar. El manejador de archivo
para la entrada estándar es STDIN.
Lo mismo se aplica para la salida. Perl puede llevar a muchos destinos
diferentes, sean archivos, interconesiones o la salida estándar, y los
manejadores de archivo se utilizan para identificar archivos e interco-
nexiones cuando se usan para entrada o salida. El manejador de archivo
STDOUT identifica la salida estándar y STDERR es el archivo para el
error estándar. Primero estudiareinos cómo usa Perl la entrada y la salida
estándar y después cónlo se trabaja en los archivos. En la tabla 6-2 se
presenta una lista de los distintos coiiiandos de entrada y salida.
~ a ~ i t u6:l oP e r l 1 193
Sintaxis d e l c o m a n d o
d e entradalsalida Descripción
open(manejador de archivo, Abre el archivo identificado por el manejador
permiso-con-nombre de archivo) de archivos.
close(manejador de archivo) Cierra el archivo identificado por el
manejador de archivos.
Lee el archivo con el nombre filename.
Lee la entrada estándar.
Lee archivos cuyos nombres se encuentran
e n la lista d e argumentos cuando se llamó el
programa.
print <manejador de archivo> text; Escribe en u n archivo; si el manejador de ar-
chivos n o se especifica, escribe e n la salida
estándar, y si n o se especifica ningún texto,
escribe el contenido de $-.
printf <manejador de archivo> Escribe una cadena formateada en u n archi-
"Format cad ",valores ; vo; los especificadores de conversión, format-
cad, se usan para dar formato a los valores.
Si n o se especifica el manejador de archivos,
escribe en la salida estándar; si n o se especifi-
can valores, usa el contenido de $-.
sprintf cad-var " format-cad ", Escribe los valores formateados en una ca-
valores; dena, usando los especificadores d e con-
versión, format-cad, para dar formato a los
valores. Si no se especifican valores, se usa
el contenido de $-.
$ =iSTD 1IN? :
p r i n t "Ttiis i s w h a t 1 e i i t p r ~ d : 8 - " ;
$ myread
l a r i s a and a l e i n a
T h i z i s w h u t 1 e n t e r e d : l a r i s a and a l e i n a
print "hello\nW;
$num = 14 ;-
$inyti;.ime = " L a r i s a " ;
p i i n t f "Tor l u n c h % S a t P %d a p p l e s \ n " . $myname. 4num;
#! / u s r / b i n / p e r T -- - ---
{ -
c--o m o argumentos
- para elscript
..
..-
A de-Perl-
A----- /
p r in t :
I
Manejadores de archivos
U ~ t e demplea el comando open a fin de crear un manejador de archi-
vo para un archivo o una interconesióil. El coiiiando open toma dos
argumentos: el ilombre del manejador de archivo y la cadena del
nombre del archivo. El nonlbre del manejador de archivo puede ser el
que ustcd desee y por convención se escribe en mayúsculas. La cadena
del nombre del archivo puede ser el nombre del archivo o la variable
que detenta el nombre del niismo. Esta cadena también puede incluir
diferente5 modos de abrir un archivo. Por defecto, un archivo se abre
para lectura; pero usted también puede abrirlo para escribir, insertar o
para leer y escribir. La sintaxis de open es la siguiente:
--
Capitulo 6: Perl 1 197
open ( m a n e j a d o r d e a r c h i v o , nombre de a r c h i v o - c a d e n a ) :
l f i l e n = "reports";
open ( R E P S . $ f i l e n 1;
o p e n ( R E P S , "+> r e p o r t s m) :
I
print;
t -
clase R E P S :
close PREP:
closi PTF;
Prueba de repaso
¿Qué c o m a n d o se utiliza para leer desde la entrada estándar?'
¿Cuál e s la variable predeterminada q u e se p u e d e usar para la
1 <STDIN.
2 S-.
3 +>.
ación en Linux
B t i t l e L w ~ o c k e ~ " :
Bauthor = "Dylan Christopher";
p r i n t <<"BKINFOW; 1 ~ t i q.u e t-
- - arotulada
-- - -
The t i t l e o f t h i s b o o k i s $ t i t l e
The a u t h o r i s $ a u t h o r
The n e x t e d i t i o n i s u n d e r d e v e l o p m e n t
BKINFO
Variables y expresiones
Las variables de Perl pueden ser nuinéricas o de cadena. Su tipo está
determinado por el contexto o manera como se usan. Usted no tiene
que declararlas. Una variable a la que se asigna un valor nuniérico y re
emplea en operaciones aritméticas es una variable numérica, y todas las
demás se tratan como cadenas. Para hacer referencia a una variable en
su programa, anteponga al noinbre de la variable el signo de dinero ($)
tal como lo haría con una variable de shell.
Usted puede utilizar el mismo grupo de operadores con las variables
Perl como con lar variables C , except~iaildolos operadores para cade-
nas. Lai cadenas usan los mismos términos especiales de comparacióii
que se emplean en el shell BASH. Los operadores de comparacióii
estándar ertán reservados para variables iluiiiéricas. Sin embargo, otros
Capitulo 6: Perl 1 203
operadores, coi110 loi de asignación, funcionan tanto en las variables de
cadena como en las variables numéricas. Los operadores aritméticos y
los operadores aritil~éticosde asignación funciorian con valores nunié-
ricos. En la tabla 6-4 se presentan los diferentes operadores de I'erl.
En el siguiente ejeniplo, la variable myname está asignada a la
cadena "Aleina". El operador de asignación es el símbolo de igual (=).
Operadores de Perl
204 1 Fundamentos de programación
.--.
en Linux
"Trnyrium =T
Bprice = 54
Justin Petersen
J u s t i n P e t e r s e n j u s t r a n t h i s program
IConsqb -.-
Arreglos y listas
En Perl usted crea un arreglo asigiilndole una lista de valores. Una lista
en Perl consta de un c o i i j ~ ~ i i de
t o valores entre parkntesis y separados
por signos d e conia. La siguiente es una lista d e cuatro valores.
1Nota
Observe que usted utiliza u n signo d e dinero ($), n o u n símbolo (@),
antes d e u n elemento del arreglo. El símbolo @ se usa para hacer
referencia a todo el arreglo y se emplea cuando usted le está asig-
nando listas completas d e valores. El signo $ hace referencia a u n
elemento en particular, que esencialmente es una variable.
memerit- T a l u - e ~ ~ f ? n ~ ;
p r i n t $myelement;
1Consqo
Los arreglos que utilizan números secuenciales para identificar los
diferentes elementos de un arreglo, como los que hemos estudiado
hasta ahora, se conocen como arreglos escalares. Más adelante
estudiaremos los arreglos asociativos que usan cadenas para el índice
de los elementos en lugar de números.
ri
1Nota
Si la cantidad de valores presentes en la lista es superior al número
de elementos del arreglo a los que se hace referencia, entonces los
valores restantes se pasan por alto. Si hay más elementos referen-
ciados que valores en la lista, los elementos restantes del arreglo se
asignan a una cadena nula.
V P r e g - un t e a l o - sexper-tos
Preguntar puedo asignar varios elementos, a la vez, de un arreglo
a otro?
Las tajadas se pueden usar para los elementos del arreglo que se van a
asignar y para el arreglo al cual están asigmios. En el siguiente ejemplo, el
tercer y q u i n t o elementos del arreglo mynums están asignados al segundo
y cuarto elementos del arreglo newnums.Entonces, los elementos segun-
do, cuarto y q u i n t o del arreglo mynums [l, 3,4] se asignan a los ele-
mentos tercero, cuarto y q u i n t o del arreglo partnums [2..4].
v.-- . . I C-mi
Icity = ('Sa??amento'. pizad-i-
- --
' F a l l o n ' , 86.
.
.-m
'Napa', 7 ,
' A l a m e d a ' , 53 ; 1 -
-
-- - -- - .- - .
Valor del elemento]
.-
p b 7 m 1'oñ7') ;
pI-ñsac,a,,ñFo;Ti;
Ch- -_ .
1Nota
Para retirar t o d o el arreglo, usted utiliza la operación undef, q u e
funciona e n arreglos escalares o asociativos. C o n ella se elimina el
arreglo completamente, liberando memoria.
-
Prueba de repaso
" ¿Puede asignar valores a diferentes eletnentos en un arreglo,
al mismo tiempo?"
¿Qué clase de arreklo se puede indexar usando palabra^?^
Estructuras de control
Perl tiene un conjunto de estructuras de control similares a las que se
Lisa11 en los lenguajes de programación GAWK, C-sliell y C. I'erl tiene
biicles con los cuales usted puede repetir coniandos y condiciones que
le permiten elegir entre c o n ~ ~ n d específicos.
os Existen dos conjuntos
diferentes de operadores para las expresiones de prueba, para usar con
cadeiix y valores iiiiméricos.Tambiéii puede eiiiplear operaciones
patrón que le periniten utilizar expresiones regiilares.
-- -- -
4 Sí; simpletnente especifique los elementos separados por comas, como en @ i i i ) iiiiiii\(-1.0.171.
5 Un arreglo asociativo.
ogramación en Linux
Expresiones de prueba
Perl tiene diferentes grupos de operadores para comparaciones nunié-
ricas y de cadena. Debe tener cuidado de no niezclar operadores
distintos. Los operadores de cadena son códigos con dos letras, siniilares
a los que se utilizan en el shell BASH. Por ejeniplo, el operador eq
pone a prueba la igualdad de dos cadenas y el operador gt realiza la
prueba para ver si una es mayor que la otra. De otro lado, las compara-
ciones numéricas emplean sínibolos siniilares a los que se encuentran
en los lenguajes de prograniación como operadores. Por ejemplo, >
representa mayor que, y = = sirve para la prueba de igualdad; en
esencia, son los mismos operadores de comparación que se usan en el
lenguaje de programación C. Estos operadores se presentaron previa-
mente en la tabla 6-4. Hay dos excepciones importantes: patrones de
cadena y patrones.
El operador del patrón de cadena, =-, pone a prueba un patrón en
una variable de cadena. El operando de la derecha es el patrón y el de
la izquierda es la cadena. El patrón puede ser cualquier expresión
regular, que hacen de ésta una operación niuy flexible y poderosa.
Los patrones realizan la comparación de una cadena o del contenido
de la variable especial -$. El operador patrón consta de dos barras
oblicuas que encierran el patrón que se busca, /pattern/. El patrón
puede ser cualquier expresión regular.
También hay varias pruebas que usted puede realizar en un archivo
para verificar su estado. Por ejemplo, puede usar el texto -e para asegu-
rarse de que un archivo existe, o -S para verificar si está vacío (véase
tabla 6-7).
.
foreach variable ( lista de valores)
{
foreach está diseñado para usar con
listas de valores, tales como las que se
enunciados; generan en u n arreglo; al operando
1 variable se asignan consecutivamente
los valores en la lista lista de valores.
El bucle while
El bucle w h i l e coiiiieriza con la palabra clave while, a la que sigue una
expresión entre parbntesis. U n bloque sigue a la expresión, por lo
común en la línea siguiente. Este bloque puede contener varios enun-
ciados y termina con punto y coma. U n bloqiie es ~ i i conjuiito
i de
eiiuiiciados entre corchetes.
Usted puede adaptar fáciln~cnteel biicle w h i l e para eniplearlo con
arreglos. La variable que se emplea para controlar un bucle también se
puede usar, dentro de éste, para controlar el índice de un arreglo. En el
script titlpnrv.yl que sigue, los elementos del arreglo del título se obtie-
nen d e los valores de los títulos. Ilespués, el contenido de cada elemen-
to se imprinie usando u11 bucle while. Observe que $#title contiene
la cantidad de elementos en el arreglo; $#title se usa en el enlace
superior de la espresión de prueba del bucle w h i l e para verificar
cuándo se detendri el bucle.
Bucles for
El bucle for consta de tres expresiones segiiidas por un bloque de
enunciados. Las tre5 expresiones se enciieiitran entre paréntesis y
separadas por punto y conia, y el bloque que se va a ejecutar dentro del
bucle for Te sitúa después de las expresiones.
Las tres expresiones corresponden a las que se eniplearon para
adniinistrar iin bucle while: de iniciación, prueba y actualización. La
Capitulo 6: Perl 1 223
e n u n c i ados ;
l
A ineniido 1111bucle for se utiliza para implementar bucles siii~ples
de conteo. En el siguiente ejemplo, el bucle for implernenta un bucle
de conteo usando la variable i. En la expresión de iniciación, a i se le
asigna el valor O. Esta expresión se ejecuta una vez, antes de entrar al
bucle. Luego, la expresión de prueba verifica si el valor de i es nlenor
que 3. Cuando i es niayor o igual a 3, entonces la prueba es filsa y el
bucle for termina.
En cada repetición del bucle se ejecuta el bloque que sigue a la
expresión for y, en este caso, se ejecuta el enunciado print. Despiiés de
él, se ejecuta la expresión de actualización, que aquí es un iricreiliento
de la variable i. Este incremento se realiza al final d e cada repetición:
iisted debe considerar la expresión de actualización como el íiltimo
enunciado en el bucle. Mientras que la espresión de iniciación se
cjeciita solaniente iim vez antes del bucle, la espresión de act~ialización
se ejeciita con cada repetición como el último enunciado dentro del
bucle. En este ejemplo, la expresión de actualización increnientará la
variable i en 1, con cada repetición. En la tercera repetición, i se fijará
en 3, haciendo que la expresión d e prueba sea falsa y terininando el
bucle for.
- -
-3-T ?; Bi++j
p r i n t " T h i s i s t h e $ii t e r a t i o n \ n l ' :
I
224 1 Fundamentos de programación en Linux
- -.- -
Bucles foreach
El biicle f o r e a c h está disellado para hacer referencia e n forma
seciiencial a iina lista de valores. Es miiy similar a la estriictiira for-in del
C-shell. El bucle foreach toma dos operandos: iina variable y una lista de
valores entre paréntesis. Cada vez que pasa el biicle, se asigna el siguiente
valor en la lista a la variable del bucle; ciiando se llega al final de la lista, el
biicle se detiene. Coino e11 el biicle while, la expresión va seguida de un
bloque de enuilciados. La sintaxis para el bucle foreach es la sipiente:
-
foreach, asignando cada uno a $mynum.
f o r e a c h Brnynurn ( (!%y1 i s t 1
I
p r i n t "8rnynurn \ n " :
1
foreach 8 i ( O .. WARGV)
I
p r i n t "Copying $ARGVT$il\n";
oprn(SF1 LE, " < $ARGV[$i]");
o p p n ( B F I L E , "> snurcebak/$ARGVC$il");
while(<SFILE>) (
p r i n t BFILE ;
1
clnse(SFILE1;
c l o s r ~ E F I L E ;)
. .
Capitulo 6: Perl 1 227
El siguiente es un ejeniplo de la ejecución del script ybackrrycli~.pl:
v
5- pbackuparg.pl mafn.c 1 l b . c 1o.c
Copyi ng ma i n .c
main.c
Copying 1 i b . c
1ib.c
Copying i o . c
i0.c
else( expresión ) {
enunciados;
1
if( expresión ) { elsif le permite anidar estructuras if, permitien-
enunciados; d o la selección entre varias alternativas; en la
1 primera expresión verdadera if, sus enunciados
elsif( expresión ) se ejecutan y el control deja la estructura com-
enunciados; pleta elsif.
1
else( expresión ) {
enunciados;
1
unles( expresión ) { unless ejecuta enunciados si su expresión de
enunciados; prueba es falsa.
1
L A BEL:{
if(expr){enunciados;
último LABEL};
. Esta estructura simula una estructura switch
usando los enunciados i f listados dentro de u n
bloque, con el último enunciado haciendo re-
} ferencia a u n rótulo para el bloque.
elsif
La estructura elsif le permite anidar operaciones if-else. Con elsif, usted
puede elegir entre varias alternativas. La primera se especifica con la es-
tructura i f y va seguida por otras alternativas,cada una especificada con su
propia estructura elsif. La alternativa para la Última estructura elsifse
especifica con un else. Si la prueba para la primera estructura if fdla, el
control pasará a la siguiente estructura elsif y se ejecutará la prueba. Si fdla,
el control pasará al siguiente elsify su prueba se verificará. Este proceso
sigue hasta que una prueba sea verdadera, caso en el cual elsifha ejecutado
sus comandos y el control pasa de la estructura if al siguiente comando.
230 1 Fundamentos de programación en Linux
unless
El coniando unless realiza la prueba opuesta a L I comando
~ i f Si la
prueba del coniando unless es falsa, se ejecutan los enunciados; si la
prueba es verdadera, los enunciados n o se ejecutan. La sintaxis es la
inisma del comando if C o n frecuencia, unless se usa para pruebas en
donde usted desea verificar si hay operaciones fallidas. A menudo lo
ver5 con el comando open para probar una operación open de archivo
que fracasó, como se muestra a continuación:
,) Rt
u n l e s s ( 0 p e n ( R E P S . "+> b f i l e n " ) l
d i e " C a n ' t open $ f i l e n M :
1
switch
N o existe una estructura de control switch en Perl, aiinque se puede
simidar. En una estructura switch clásica, se hace una elección conipa-
rando un valor con varios patrones posibles y cada valor posible se
asocia con un conjunto d e operaciones. Si se encuentra una concor-
dancia, se realizan las operaciones asociadas.
Usted puede siiniilar un switch en Perl usaiido un bloque y un
comarido last. Los bloques son estructuras de control válidas por sí
mismas. Usted puede presentar un bloque en forrila de lista y sus
Capitulo 6: Perl ( 231
p r i n t "The f i r s t s t a t e m e n t \ n N ;
p r i n t " t h e second s t a t e m e n t \ n n :
1a s t :
p r i n t "The t h i r d s t a t e m e n t \ n w ;
1
LABEL: {
if(expr) {enunciados; last LABEL);
1
El siguiente ejeinplo siniiila un switch usando un bloqiie de estruc-
tiiras if. El bloque está niarcado con MYSW, situado antei del corchete
de apertura. Cada estructura i f prueba los valores de la misma variable,
n u m . Si una prueba es verdadera, entonces se ejecuta su bloque de
eniiiiciados. El último enunciado en cada i f es un comando last que
saldrá del bloque i n á ~externo.
MYSW: I
i f ($num == 1 ) ( p r i n t "The f i r s t c h o i c e " ; l a s t M Y S W ; ) ;
i f ($num == 2 ) ( p r í n t "The second c h o i c e " : l a s t M Y S W ; ) ;
i f ($num == 3 ) { p r i n t "The t h i r d c h o i c e " ; l a s t MYSW;I;
print "Invalid Option";
1
232 1 Fundamentos de programación en Linux
- -.
Directorios
Perl también tiene incorporado un completo conjunto de coniandos
pnra el nianejo de directorios que operan de manera muy similar a los
comalidos de archivo, tales como open y close. El coniando opendir
abre un directorio, d e forma niuy seniejante a cuando se abre un
archivo. Al directorio se le asigna un rrimicjador de dircrtorio, iiiuy similar
a uii inanejador de archivo. En el siguiente ejeniplo se abrir,? un direc-
torio llamado reports y se asignar5 a la variable repdir que entonces
se convierte en el ~nanejadordel directorio.
Prueba de repaso
¿Cuántas expresiones tiene un bucle for?"
Paso a paso
1. El programa debe generar primero el código HTML para establecer el
título para "My Index" y el encabezado para "lndex of HTML Files".
El comando print de Perl se puede utilizar para llevar los caracteres a
la salida estándar. 5
íf i
1
'
1
"tldit'name18fi:en" &8 ( Sfilen - /
u n l e s s i l~pori(Hf[LE, "< O d i r n a i - i e / $ f i l e n W ) ) l
d i p "d:otlnt no opeii f i l e I d i r n a m e i
Capitulo 6: Perl 1 235
$tline = Shllne:
-
1
Bfound = 1 ;
I
I
close(HFI1 E ) ;
i f ( Bfound
l
-O )
Funciones de cadena
l'erl cuenta con varias fiinciones y operadores para manipular cadenas,
los ciiales se resumen en la ctdbla 6-1 1 .
Las funcioi~eslength, index y substr realizan operaciones estándar
de cadena, tales con10 obtener 1'1 longitud de una cadena o copiar iina
siibcadena desde una cadena; split realiza una tarea especial, genera un
arreglo a partir de una cadena dividiéndola en valores del elemento del
arreglo (vinse la sección antcrior: "Funciones de manejo de arreglos
escalares: operaciones de lista"). El operador dot coilcatena cadenas
y el operador x genera cadenas formadas de caracteres repetidos. La
función chomp reducirá una línea de retorno d e carro, un espacio o
una tabulación que puede ser el final d e una cadena. Resulta útil retirar
el carácter de la nueva línea anexo a las cadenas que se leen desde la
entrada estándar, <STDIN> (el texto que el usuario entra en forma
interactiva en un programa Perl).
236 1 Fundamentos de programación en Linux
--
-
Concordancia de patrones
Como en GAWK, Perl puede buscar patrones. La sintaxis para las
diferentes búsquedas se presentan en la tabla 6-12.
print;
, 1
1
Usted puede utilizar una técnica d e esa clase para buscar archivos
línea por línea. Suponga que hay un archivo d e títulos llamado
newtitles e n donde cada línea ei el título d e un libro. El siguiente
progranla buscará todos los títulos con el patrón "Christnias"
leyéridolos uno por uno (una línea a la vez) y asignándolos a la variable
$title.la cual se biisca entonces.
-
whi l e ( $ t i t l e = < N T I T L E S >
l
i f ( S t i t l e =- /Christmas/ )
I
print $ t i t l e ;
1
Prueba de-repaso
¿Cuáles son las dos piezas de información que usted necesita
para obtener una subcadena de una cadena?'
Funciones: sub
En su script I'erl, usted puede definir subrutinas, que le permiten
organizar mejor su programa. En lugar de iiria larga serie de eiiuncia-
dos, puede definir subrutinas separadas para tareas específicas. Las tareas
í
print "Please enter in name of file to be dispiayed: ";
chomp($filename = < S T D I N > ) ;
system("cat Bfilenamen):
i - n ~ s p r i e a r g r-myri l e - . ) ;
kdispfilearg " m y f i l e " ;
Alcance
El nkcnrrcc le permite definir variables que esisten sólo dentro de una
subrutina o arcliivo. Quienes están faiiiiliarizados coii el alcance en
otros lenguajes de programación encontrarán algunas diferencias con
Perl. C o n la operación my, usted puede definir una variable local
conocida solamente para uiia subrutina.
La operación my restringe el alcance de una variable a la f~incióno
bloque dentro del ciial se definió. Una variable definida con my es
tt.ciiicainente una variable estática, aunque dentro de una subrutina, y
funciona conio una variable autoniática en C. Sin enibargo, si usted
define una variable con 13 operación my fuera d e cualquier subrutina
en la parte superior del arcliivo, entonces opera como una variable
estática de C. Una variable d e esta naturaleza se conoce eii todas las
subrutinas dentro de ese script d e Perl pero no en los deiiiás scripts que
pueden constituir u n progrania en Perl.
La operación my f~incionadentro de bloques, lo inisiiio que dentro
de subrutinas. Usted puede definir un bloque, sin hacer que foriiie
parte de una definición d e f~inciónni d e una estructura de control.
Cualquier variable que usted defina en 61 con la operación my sola-
mente se conocerá dentro de él. Debe definir una variable coii la
operación my dentro de un bloq~iey dcspuks seguirla con uiia
s~ibrutinataiiibién ddiiiida dentro de ese bloque, de nianera que así la
variable será visible para la subrutina.
..
-E-1
.i
:t.ib .:.$ar,,:h-fi 1 F ;
sub s s ? l e r t - t i e l ? :
..l.ib get-::irl+?:
p i - i r ~ t " HTiil \ \ ~ i f H E A E > \ , n ' T ! T l F'1.l~ Irid-x. ! T í T L E > \ i i < ! H E , A D > \ n < B O [ i Y i \ r i " :
p i , i i - , ~" t H l > l i i r l ~ u v f PTI:l 1:ile:~;Hl \,II":
up~ndir!CúTR. " . " ) ;
f r ~ t . ? d c l - i :,>?i
t ii"111k( r e i i d d ! I ~ ~ L E I F : )
I
i i ! - d ! d i ? ~ - i t \ i n i ,&& ! L $ J i r r ~ . l i n e =- l b \ , / ) )
I
p r i n t ",tiP'.Yd i I i~;iir~!~<I'l-~C \ n * ii l ':n";
n p ~ ~ i i d i r ( H I 1 I K ." L J i t r i . ; r n r * " ) :
f ~ : r c , ? ~ : l i: b f i l ? t i 1 ( r ~ ~ . . ~ : i ~ l i r ( l i E l )R ' ~
s u b select-t i t lo
1. iCuáles son los sinibolos que usted utiliza para leer la entrada de un
archivo?
247
ogramación en Linux
-"-
Nota
Los lengu tán organizados de acuerdo con diferentes
tipos de objetos gráficos, como ventanas, botones, menús y barras
desplegables. Dichos objetos se conocen como widgets. Para saber
más sobre el tema, véase el capítulo 8.
(La forma tk* en este código compara el nombre del directorio qiie está
integrado por tk y su núnicro de vc-rsibii,coiiio tk8.3 parca la versibn 8.3).
Eii la vciitaiia Xterin dcl escritorio GNOME, iiigrese el coiiiaiido widget
para poiicr a fiiiicionar el progniiia de deinostraciciii. Usted taiiibitii puede
exaiiiiiiar los archivos deiiio por separado y inodificarlos coiiio desee. Si ha
iiistalado una vcrsión deTk por sil cueiita en el directorio /i.rsr//oc.ii//bii~y no
en /rrsr/l~iw,t.1 directorio rlernos se locdimrá en /wr/locnl/lih/tk*.
Extensiones y aplicaciones
E11 la actualidad, Scriptics, coi-iipafiía f~iiidadaen 1997 por Jolin
Ousterhout, desarrolla y soporta a Tcl y T k . Las vei-sioiies actiiales (al
rogramación en Linux
m -e% - *
.
empleando una estructura de prograniación orientada por objetos.
Nota -. e
' $ms3- -
% s e t age 11
% p u t s Bage
11
%, e x i t
8
. Comandos de Tcl
El lenguaje de programación Tcl es ficil de usar. Sus enunciados c o n -
tan de un coiiiando seguido por argumentos; también cuenta con un
252 1
- Fundamentos de programación
--
en Linux
.-
Así como en GAWK y Perl, los tipos están determinados por el uso.
Una variable asignada a un entero se considerará un entero y una
asignada a una cadena será un arreglo de caracteres. Para los
lectores que estén familiarizados con Lisp, este formato de coman-
dos parecerá familiar.
---
Usted puede utilizar varios coiiiandosTc1 para realizar tareas del sisteiiia,
como detener un script (exit),cambiar un directorio de trabajo (cd) o
detectar errores (catch).Eri la tabla 7- 1 se presentan estos coiiiaiidos.
Expresiones
Lai cxprcsiorlcls tainbién se iiiaiiejan coino coiiiandos en Tcl. El coman-
d o expr se evalíia como una expresión y regreia su valor resultmte
Capítulo 7: Tcl (Tool C o m m a n d Language)
.- - -
C o m a n d o Tcl Acción
catch Detecta y atrapa errores
cd Cambia el directorio d e trabajo
clock Regresa las cadenas d e tiempo y formato
de fecha
error Elimina u n error
eva l Evalúa c o m o u n comando una lista d e ar-
gumentos
exec Ejecuta u n comando Linux
exit Termina el programa y sale
pwd Retorna el nombre del directorio de trabajo
actual
info Consulta el estado del intérprete d e Tcl
trace Verifica los valores d e las variables
. .
I I wv
J LAI r YW c/1 I V VI\
~
r vi W V ~
Variables
Tcl soporta variables numéricas y d e cadena, lo mismo q u e arreglos,
incluidos los iirre$os crsoíicrtivos, los cuales se estudian e n la siguiente
sección.Todas las variables cuentan con una cadena coiiio contenido.
Sin embargo, aunque el contenido d e una variable es una cadena, ésta
se puede usar coi110 u n valor a l t e r o o un valor real en una expresión
aritmética, considerando q u e la cadena consta de núnleros. Cada vez que
se einplea una variable d e esta clase c o m o u n operando en una opera-
ción aritniética, su contenido se convierte primero e n u n entero o en u n
valor real. La operación se realiza y después los valores aritniéticos y el
resultado que se obtiene por nledio d e expr se convierten en una
cadena. Esto significa q u e usted n o tiene que preocuparse por declarar el
tipo d e variable ni, incluso, por definirla.Todas las variables se definen
automáticamente cuando se utilizan por primera vez e n u n enunciado.
C o r n o hemos visto, a las variables se les puede asignar valores usan-
d o el comando set, el cual toma coino su arguniento el nombre d e la
variable y el valor asignado. El nombre d e una variable puede ser
cualquier conjunto d e caracteres alfabéticos o nuniéricos niás el signo
d e subrayado (-). La puntuación y otros caracteres n o se permiten.
Cuando usted necesita usar el valor de una variable dentro d e un
eniinciado, primero debe evaluarla; al hacerlo, se sustituye el nonibre coi1
su valor y anteponiendo el signo $ al nonibre de la variable se realiza dicha
evaluación. I'ara utilizar el valor d e una variable c o m o un operando en una
espresión, usted debe ei~aluarla variable precediendo el nonibre d e la
niisma con el signo $. Eii el siguiente cjerriplo, el valor 5 se asigna a la
variable mynum; cntonces, esta variable se evalúa en una expresión,
$mynum, s~iiiiinistrandosu i~alor,5, c o m o u n operando en esa exprcsión.
p-
ie-t rnynurn 5 .--
e x p r 1 0 * Srnynurn
-
r 1
s e t m y s t r "My narne i s $rnynamen
Comando Descripción
set Asigna u n valor a una variable
global Declara variables globales
incr lncrementa una variable en u n valor entero
unset Borra variables
u pva r Hace referencia a una variable con u n alcance diferente
variable Declara espacio para variables
array Especifica las operaciones de acceso al arreglo, tales c o m o
las búsquedas
expr Ejecuta expresiones matemáticas
- ...- -. .- -
Prueba de'repaso
¿Qué tipo de valor produce una expresión numérica?'
Arreglos
Loi elenientos de un arreglo son valores definidoi y asignados usando el
coniando set con un ai-g~imentoque se agrega para el índice. En el siguiente
ejemplo se asigna el número 23 al primer elemento del arreglo mynum.
1 Una cadena.
2 Si; use los operadores aritméticos de asigiiación. tales c o m o =+.
Capítulo 7: Tcl (Tool C o m m a n d Language)
- .
Tcl taiiibién cuenta con arreglos asociativos, los cuales usan cadenas
como índices. Los eleineiitos de los arreglos asociativos son valores
definidos y asignados que emplean el coniando set con un arguinento
agregado para la cadena del índice, la cual se encuentra entre paréntesis
y se pone inmediataniente después del nonibre del arreglo y prece-
diendo el valor. Los siguientes enunciados agregan dos eleiiientos al
arreglo city con las cadenas del índice Napa y Alameda.
TTFymqm &
Las opciones get y names permiten que tenga acceso a valores del
elemento y del índice. Estas opciones pueden tomar u n argumento
agregado especificando un patrón que puede utilizar para recuperar
valores del elenlento o de los índices. La opción get presentará en
pantalla valores del elemento e índices, en tanto que la opción names
solamente presentarlí índices. Si n o hay ningún arguinento, se presentan
todos los valores de elementos o de índices.
z array get c i t y
Napa 34 Alameda 1 7
% a r r a y names c i t y
Napa Alameda
% a r r a y names mynum
1
1Nota
Usted puede buscar uno a uno los elementos del arreglo, con las
opciones startsearch, nextelement y anymore. Con la opción
donesearch termina su búsqueda.
Comando Descripción
set lista valores Crea una lista y le asigna valores
lsearch lista patrón Busca u n patrón en los elementos de una lista
lindex lista índice Retorna el valor del elemento de la lista que
tiene ese índice
llength lista Retorna el número de elementos en una lista
lrange lista primero último Retorna u n subrango de la lista especificado
por primero y último
linsert lista índice lista de valores Inserta u n nuevo elemento en una lista des-
pués del índice
lreplace lista índice lista de valores Reemplaza el elemento del índice con u n
nuevo valor
lappend nombre de lista Adjunta nuevos valores a la lista
lista de valores
concat listas
. Combina elementos de varias listas en una
lista
list listas Combina listas en una lista mayor, cuyos ele-
mentos son las listas respectivas
split delim de cad Divide una cadena en una lista usando u n
delimitador para separar valores
join lista Une elementos de una lista en una cadena
lsort list Ordena la lista alfabética o numéricamente
/p\
'Set weather Isun r a l n wlnd; l
a-
" % ir a m a l h z ? i 2
r a i n wind
P
- 1% b l t ~ o w 1l 2 p u F p l e a q u i t a n
red p u r p l e a q u d t a n
8 ;6 ecno myrist
r e d b l u e y e l l ow
Xlappend m y l i s t p u r p l e aqua t a n
r e d b l u e y e l low p u r p l e a q u a t a n
red b l u e aqua t a n
.
niando concat creó una lista d e cuatro elementos.
-*
v e ! laqua tan).
% echo $ l i s t
{red bluel (aqua t a n )
Prueba de repaso
¿Se puede hacer un índice de un arreglo con nombres ordi-
nario~?~ -
¿Una lista de ítems podría contener c o m o uno de sus ítems a
otra lista o una operación que genera una I i ~ t a ? ~
gets s t d i n l i n e
Si usted desea usar una operación siiiiple puts para obtener el coiite-
nido de varias variablcs, debe hacer que tstas forineii parte de una sola
cadena. I'ara hacerlo, ponga las variables dentro de comillas dobles. Eii el
siguiente ejeniplo, firstname y lastname eiitraii a forniar parte de iiiia
sola cadena que entonces se puede obteiier con puts:
--> --,
p ü t s ' " 8 f i r s t n a m e $1 astnarne"
il e i na
; 1 entered: lnris? anlj rlleina
wmrmat 9FmymRl -
Interconexiones
C o n el coniando open se pueden crear iiitercoiiesiones que transfie-
ran el resultado de un comarido a la entrada de otrc) comando, en lugar
de acceder a los archivos reales. Despuks, puede utilizar los coniaiidos
puts o gets para extraer o introducir datos a una iriterconesión. Parn
especificar el noiiibre de una interconexión, me el síiiibolo 1 entre
corchetes, así: { 1 ).Taiiibiéii puede incliiir cualquier comando Linux
que desec en los datos de entrada o de salida. El niodo de arcliivo para
266 1 F u n d a m e n t o s d e programación en Linux
-
Estructuras de control
Tcl tiene un conjunto de estructuras de control sinlilares a lai que se
usan en los lenguajes de prograinación Perl, GAWI<,TCSH y C.Tcl
tiene bucles con los qiie puede repetir comandos y condiciorres que le
permiten elegir entre comandos especificados. En la tabla 7-4 se pre-
senta la lista de las estructuras d e control deTcl.
.
Estructuras d e control Descripción
if Prueba condicional que selecciona comandos y se
extiende con los bloques else y elseif
switch Estructura de selección
while Repite comandos
for Como se usa en los bucles en lenguaje C, repite
comandos
foreach Bucles a través de una lista o listas de valores
break Obliga a la salida del bucle
continue Pasa por alto el resto del bloque y continúa con la
repetición del siguiente bucle
l ~ a b i a7-41 Estructurar de control de Tcl
$f. (test-expresslonl 1
T c l commands
El script ijls que se presenta más adelante permite que usted liste los
archivos s e g h su tamaño. Si ingresa una S en el prompt, se listan los
archivos del directorio actual, seguidos por el núinero de bloques que
ocupan. Si ingresa algún otro carácter, la prueba i f falla y el script no
funciona. Observe que el corchete de apertura para el bloque de la estruc-
tura i f se localiza despuks de la expresión de prueba if, en la niisma línea:
p ú t s "Please e n t e r o p t i o n : "
-
gets s t d i n option
if ( B o p t i o n -= " s n l {
p u t s " L i s t i n g f i l e s by s i z e "
p u t s Cexec 1s -SI
I
Please e n t e r o p t i o n : S
L i s t i n g f i l e s by s i z e
total 2
1 monday 2 today
if {expresión de rueba) {
comandos cl
) else {
f
comandos Tcl
1
270 1 Fundamentos de programación en Linux
- ---
p u t s Goodbye
La estructura elseif
La estructura elseif le permite anidar operaciones if-then-else; su
nombre deriva d e "else if". Al usarla, el shell p ~ i e d eelegir entre varias
alternativas. La primera se especifica c o n la estructura if seguida p o r
otras alternativas, c a d a ~ u n aespecificada p o r su propia estructura elseif.
La alternativa para la última estructura elseif se especifica con u n else.
Si la prueba para la primera estructiira if falla, el control pasará a la
siguiente estructura elseif. La prueba se realizará. Si falla, el control
pasará al siguiente elseif y su prueba se verificará. E ~ t eproceso coiiti-
núa hasta q u e el resultado d e una prueba sea verdadero. El elseif con
resultado verdadero ha ejecutado sus coinandos y el control pasa d e la
estructura if hacia el siguiente comando después d e la palabra clave-fi.
A continuación se presenta la sintaxis d e la estructura elseif N o olvide
q u e la palabra clave elseif d e b e estar e n la n ~ i s i n alínea del corchete
Capítulo 7: Tcl (Tool C o m m a n d Language)
- -.
$!/usr/bin/tclsn
puts "s. L i s t Sizes"
puts "1. L i s t Al1 Inforrnation"
p u t ~" P l e a s e e n t e r o p t i o n : "
getz s t d i n choice
i f l B c h o i c e == " S " ) {
p u t s [exec 1 s -SI
l e l s e i f ($choice = "1") 1
p u t s Cexec 1s - 1 1
)else l
puts " I n v a l j d Option"
1
p u t s "Goodbye"
5 ./eiseitis
s. L i s t Sizes
1. L i s t A l 1 F i l e Inforrnation
Please e n t e r o p t i o n :
1
total 2
w - r - x 1 c h r i s w e a t l i e r 568 Feb 14 10:30 t o d a y
- r w - r w - i - - 1 c h r i s w e a t h ~ r 308 Feb 1 7 12:40 Monday
gramación en Linux
m 8xW-s
La estructura switch
La estructura switch elige entre varias alternativas posibles. La selec-
ción se hace comparando el valor de una cadena con varios patrones
posibles. Cada patrón tiene su propio bloque de coniandos Tcl. Si se
encuentra una concordancia, se ejecuta el bloque asociado. La palabra
clave predeterminada señala un patrón que tiene concordancia con
todo. Si alguna de las otras comparaciones falla, se ejecuta el bloque
asociado con la palabra clave predeterminada. La estructura switch
comienza con la palabra clave switch, después sigue con las opciones
prefijadas con el signo - y después el patrón de la cadena que se ha de
comparar seguido por un bloque que contiene todos los patrones con
sus bloques. La sintaxis de la estructura se describe a continuación:
switch -opciones patrón-cadena {
patrón {
comandos Tcl
1
patrón {
comandos Tcl
1
predeterminado {
comandos Tcl
1
1
-
Las opciones especifican las capacidades de concordancia de patrón.
Esta estructura soporta las siguientes opciones.
Opción Descripción
-exact Usa concordancia exacta cuando se compara una cade-
na con un patrón. Está predeterminada.
-glob Cuando se compara una cadena con el patrón, utiliza la
comparación de estilo global.
-regexp Cuando se compara una cadena con los patrones, em-
plea la comparación de la expresión regular (es decir, la
misma que implementó el comando regexp).
-- Marca el final de las opciones. El argumento que sigue a
esta opción se tratará como una cadena, inclusive si co-
mienza con un guión -.
m--- r"-.." ". U' h"."" \ , ," "0" C"."" " '..-S r" y'"" ""C. .A"'""" ""'.W"> "U',
patrón, esto le permitirá efyecificar más de una posible coiicordancia. Por ejeinpl
con c 1 C se conipararh la C mayí~sciilay la c riiiiiúscula. En el siguierite ejeni
I h I , . ? .
El bucle while
Los bucles de Tcl son while, for y foreach. El bucle while es el qiie
tiene más propósito general niientrai que for y foreach son niucho
más restrictivos. El bucle while repite comandos. En Tcl, este bucle
comienza con el coniando while y toma doi argumentos: una expre-
sión y un comando simple Tcl o un bloque de comandos Tcl. La
expresión va entre corchetes. U n bloque de coniandosTc1 coinieiiza
con un corchete de apertura en la niisina línea del coiilando while.
Después, las líneas siguientes contienei-i los coniandosTc1 que se repe-
tirán en el bucle. El bloque termina con un corchete de cierre, usiial-
mente en una línea. La sintaxis para el bucle while con un enunciado
Único se muestra aquí:
while {expresión ) {
comando Tcl
comando Tcl
1
La mayoría de los bucles requieren tres componentes pdra trabajar
de nianera apropiada: una iniciación, una prueba y un incremento.
Todos f~incionansobre una variable qiie se utiliza para controlar el
bucle. En el ~iguienteejemplo, el programa tcliriyloop señala al usuario
LIH nombre y luego lo miprime tres veces. La variable i se usa para
controlar el bucle. La variable se inicia primero antes de entrar el bucle;
desp&s, se pone a prueba en una operación relaciona1 con la expresión
de prueba del bucle para determinar cuándo detener el bucle. Eiitoil-
ces, la variable se iiicreimenta cada vez que se ejecuta éste. Cuando la i
llega a 4, la expresión de prueba del bucle es falsa y tste Fe detiene.
#!/usr/bin/tclsh
p u t s "Please e n t e r your name: "
g e t s s t d i n myname
set i 1
w h i l e { $<= i 31 1
p u t s "Your name i s $myname "
incr i 1
1
IF! / u s r / ~ ni / t c I s n
a r r a y s e t t i t l e Il Tempest 2 I l i a d 3 Ravenl
s e t num 3
set i 1
w h i l e ( $<= i $numl {
p u t s $ t it l e ( $ i )
incri 1 *
1
Tempest
11 i a d
Raven
El bucle for
El bucle for realiza las mismas tareas del bucle while. Sin embargo,
tiene un forinato diferente porque toiila cuatro argunieiitos: los tres
primeros son expresiones y el últiino es un bloque de coiiiaiidosTcl.
Los tres primeros arguinentos son expresiones que incorporan loi
componentes d e iniciación, prueba e incremento de un bucle. Estas
expreiiones van entre corchetes. El último argumento, el bloque de
conlaildoi Tcl, comienza con un corchete de apertura y despuei conti-
núa con conlandos Tcl eii las líneas siguientes, teriiiiiiando con u11
corchete de cierre. Eita es la iintaxis:
for {expresiónl} {expresiónZ} {expresión3} {
comandos Tcl
1
La prinlera expresión suele reservarse para una iniciación de una
variable que se Lisa para controlar el bucle. Esta expresión se ejecuta
antes de que el bucle coniience realmente. La segunda expresión es la
de prueba, como una expresión relaciona1 que controla el bucle. La
tercera expresión se ejecuta dentro y al final del bucle. Usiialiiieiite, se
emplea para incrementar la variable que sirve para controlar el bucle. A
continuación de las expresiones va el bloqiie de coniandos de Tcl que
se van a ejecutar dentro del bucle. La tercera expresión se ejecuta
después del bloque de coniandos.
for {iniciación} {expresión de prueba} {incremento} {
comandos Tcl
1
En el siguiente ejemplo se muestra un bucle for simple. Observe
cómo el bucle for es mucho inás coinpacto que el bucle while.
Usted puede utilizar con facilidad el bucle for al igual que el bucle
while para adniiiiistrar arreglos. La variable que se emplea para contro-
lar un bucle también se puede usar dentro de éste para el índice de iin
arreglo. En el script tcltitlearray que sigue, los elemeiitos del arreglo title
se asignan al valor de cada títiilo. Entonces, el contenido de cada ele-
mento se iinprinie usando un bucle for. La variable i se eiiiplea para
controlar el bucle; comienza en 1 en la primera expresión de for y se
incrementa en la íiltiiiia expresión. El incremento tendrá lugar después
de la acción de iinprimir. La segiiiida expresión ei la expreiióil de
prueba que controla el bucle.
278 1 Fundamentos de programación
---
en Linux
- - -- .
m ---
#! / u ~ r / b l n / t c l s h
a r r a y s e t t i t l e 11 Tempest 2 I l i a d 3 Ravenl
s e t num 3
f o r ( s e t i 11 l $ i <- Bnumt l i n c r i l í
puts $ t i t l e ( $ i )
I
La estructura foreach
La estructura foreach se diseñó para hacer referencia secuencia1 a iina
lista de valores. Es siiiiilar a la estructura for-in del shell C. La estruc-
tura foreach toma tres argumentos: una variable, una lista y un bloque
de coiiiandos Tcl. Cada valor en la lista está asignado a la variable en la
estructura foreach.Al igual que la estructura while, la estructura
foreach es un birle. Cada vez que pasa el bucle, a la variable se le
asigna el siguiente valor de la lista. Cuando llega al final de la lista, el
bucle se detiene. Coino el bucle while, el bloque de comandosTc1 va
entre corchetes. La sintaxis para el bucle foreach es la siguiente:
foreach lista de variables lista de variables lista de variables .. .. {
comandos Tcl
1
En el ~ c r i p booklist
t el usuario ~implementeobtiene una lista de
títulos integr~dapor i a lista de valores que leyó el bucle foreach.
Cada título se aiigna consecutivainente a la variable booktitle.
'set 1 1
while í i >= 11 i
c
while < fái 101 (
e-. 4 1
incr i 1
i f ( $ i %2 ==O) (
c o n t i nue
I
p u t s " T h i s i s an odd i t e r a t i o n $in
1
7
[NombredPjrch i 3 L
s e t m y f i l e [open " r P p o r t s "
A
r]
Ogciones open para archivosJ
-- --. .-.
ser t 1 r en=- r e p o r t s -
s e t m y f i i e rnpen $ f il e n r l
Al usar l o comandos
~ gets y puts, usted puede emplear un
nianejador de archivo para leer y escribir en un archivo específico. El
coniando gets toma dos argumentos: un nianejador de archivo y una
variable; por niedio del nianejador leeri una línea del archivo al que
hace refereiici'i y lo pondri en una cadena en la variable. Si n o se
especifica ningún nianejador de archivo, gets lee en la entrada e~tándar.
El siguiente coiiiando lee iiria línea de un archivo usando el manejador
en la variable myfile. La línea se lee en la variable line:
m e x i ' t s reps
-
de la niodificación y si es propiedad del usuario.
... - . .. .. -
file i s f i l e reps
file s i z e reps
fil e executable myreport
/=lo de argumentos
- de- --
la línea de coman dos^
i f l$argc != 21 1
puts "Please enter two filenames\nm
exi t 1
1.
set sourcefile [ lindex Bargv O 1
set destfile [ lindex Bargv 1 1
ser shandle [ open Bsovrcefile r 1
i ~ dth a n d l ~Copen Bdestfile w 1
w h i l e ICqets Sshandle l i n ~ l )1
puts I d h a n d l e d l i n ~
1
C a p í t u l o 7: Tcl (Tool C o m m a n d Language)
-
myseárch"'~ r n y l i s t p a t T i
-
set i O
s e t . l e n C l e n g t h $myl i s t l
w h i l e l $i< B l e n 1 {
i f I r l i n d e x $ m v l i s t $il
== $ ~ a t )
286 1 Fundamentos de programación en Linux
Comando Definición
proc Define un procedimiento Tcl
return Regresa un valor de un procedimiento
source Lee y ejecuta comandos Tcl en otro archivo
uplevel Ejecuta un comando en un alcance diferente
--
El comando string range regresa una subcadena de una cadena
específica.Toma tres argumentos: la cadena y los índices inicial y final. La
cuenta comienza en O. El término end se usa para que el archivo final
copie autoináticamente el resto de la cadena, conlo se muestra en el
ejemplo siguiente. El primer ejemplo presenta "ave" y el segundo, "ven".
- . .
s t r i n g range 3 end
Capitulo 7: Tcl (Tool Command Language) 1 287
Comando Descripción
binary Hace conversiones entre cadenas y datos binarios
regexp Compara una cadena usando expresiones regulares
regsub Realiza sustituciones empleando patrones con expresio-
nes regulares
split Divide una cadena en elementos de lista
string Realiza operaciones en cadenas
subst Realiza sustituciones en una cadena
# F u n c t i o n t o copy a f i l e
proc c o p y f i l e { t I
puts " F i l e t o Copy: "
gets s t d i n s o u r c e f i 1e
puts "Name o f f i l e : "
gets stdin destfile
exec cp $ s o u r c e f i l e $ d e s t f i l e
1
# Function t o erase a f i l e
proc erasef i l e { 1 i
p u t s " F i l e t o Erase: "
gets s t d i n e f i l e
exec r m e f i l e
I
# The Rename f u n c t i on
proc renamefile { 1 l
p u t s " F i l e t o Copy: "
g e t s s t d i n origname
p u t s "Name o f f i l e : "
g e t s s t d i n newname
exec mv $ origname $ newname
I
# Main menu
puts " F i l e Managemenf O p e r a t i o n s \ n \ n U
puts "1. Copy a f i l e . \ n U
puts " 2 . Erase a f i l e . \ n W
puts " 3 . Rename a f i l e . \ n W
puts "4. Quit.\n\nW
puts -nonewline "Please e n t e r choice: " ; f l u s h s t d o u t
gets s t d i n choice
switch $choice I
1 I
c o p y f i1 e
1
2 1
e r a s e f i 1e
1
2, (
renamef i 1e
1
4
290 1 Fundamentos de programación
- -
en Linux
ex1 t
1
default [
puts " I n v a l i d Option"
1
Expect
La aplicación Expect agrega varios coiiiandos a los scripts de Tcl que
usted puede utilizar para interactuar automáticamente con cualquier
prograina en Liilux, inás una utilidad que le indica respuestas. Por
ejemplo, el procediiniento login para diferentes sisteinas que usan ftp o
telnet se puede programar autoiliáticanieilte con un script Tcl, usando
conlandos Espect. Usted puede informarse más acerca de Expect en
www.expect.nist.gov. Los comalidos Espect están disellados para
trabajar coi1 cualquier prograina interactivo. Los coinaildoi esperan una
respuesta de un programa y después envían la respuesta especificada en
el script Tcl. Usted puede eliminar el script con un coimildo sencillo
CTRL-D, e iiiteractuar con el programa directamente.
Tres coniandos blísicos Espect agregados a los scriptsTc1 son send,
expect e interact.El coina~idoexpect esperara para recibir una cadena,
o valor de l a i aplicacioiiei, con la que uitcd está interactuaiido. El co-
inando send eiiviard una cadena a esa aplicacióii. El comando interact
lo ileva a una interacción directa con la aplicación, terminado el script
EspecdTcl. En el siguiente script, expect ie usa para realizar un login
anbiiimo con cl progrania.pp. El comando spawn coniienza dicho
programa. Se supone que la dirección de iiiteriiet del sitio FTP sea un
argumento de este script, y, como tal, se inaiiteiidi-á en la lista argv
-
#!'/üsr/bln/expFct
spawn f t p
5end "open $ a r q v \ r V
e:'prct "1 i ~ g i n ":
send "eiioriyriiciu::,\rm
~ x p ? r t" w i i r d : "
s r n d " r j r h 1 p i I - t i 1 r t 1 i-.mytrek.corn"
intrract.
Capítulo 7: Tcl (Tool C o m m a n d Language)
expect I
"connection refused" I p u t s " F a i l e d t o connect"; e x i t l
"nameH p u t s " c o n n e c t i o n s u c c e s s f u l "
l
2. ¿Qué operación usaría para leer un registro que consta de una línea
que tiene campos separados por un delimitador de dos puntos?
0 Asociar una acción con un evento particular que tiene lugar en un objeto
_a Nota
Cuando se crea un script independiente, asegúrese de cambiar los
permisos con el comando chmod para permitir la ejecución. Enton-
ces, puede ingresar el nombre del script para operar el programa.
Puede conocer más sobre este tema en el capítulo 2 de este libro. 1
C
- b . ,
$ mydirl
Widgets de Tk
U n tipo de w d g e t Fe con~iderauna clase y cada clase de widget tiene su
propio cotnnrrdo de clasc para crearlo. El coinando correspondiente creará
una rmtancia en particular de esa clase de widget, es decir, un widget
particular de cse tipo. Por ejemplo, usted puede crear un botón con el
coiiiando button o una ventana con el coinando window. Los objetos
gi-áfico~,como botones y marcos (que se estudian más adelante en la
~ección"Marcos y etiquetas"), también se conocen a inenudo conio
En la tabla 8-1 se presenta la lista de los widgets disponibles en Tk.
1%-~dgets.
programación en Linux
-
Widget Propósito
Button Un botón para hacer clic
Canvas Una ventana para dibujar objetos
checkbutton Un botón de verificación
Entry Un cuadro de entrada
Frame Un widget simple cuyo propósito primario es actuar como un
espacio o contenedor para distribuciones complejas de pantalla
lmage Una imagen para presentar dibujos
Label Un rótulo
Listbox Un cuadro con una lista de elementos elegibles
Menu Una barra de menús
menubutton Un botón de menú para acceder al menú
Message Un área de mensaje que se usa para crear y manipular widgets
de mensaje
radiobutton Un botón excluyente
Scrollbar Una barra de desplazamiento
Text Una caja de texto que se puede editar
Scale Una escala
Una línea de código de Tk puede ser muy larga y usted tal vez quiera
dividirla en dos o más líneas en su script para facilitar la lectura. Sin
embarao. Dara dividir en dos una línea de códiao única. debe Doner
Prueba de repaso
¿Cuáles son los diferentes administradores de geometría para Tk?'
¿Cuál es el comando que usted usa para llamar a Tk?'
cuadros de entrada y botones, puede usar una casilla para situar los widgets en
diferentes partes del forniulario. Para hacer referencia a una celda en particular de la
cuadrícula, debe especificar fila y colunina.
birüiday
docl .txt
doc2.1xt--
doc3.txt
inig4.gif
nionday
niydiri
-- .- - . - -.
1~ i ~ u 8-1
r a 1 Cuadro de lista de Tk y barra de desplazamiento para mydirl
--
5
Paso a paso
1. Defina la barra de desplazamiento usando el comando scrollbar:
asígnele el nombre .scroll y únala con el comando .list yview. Esto
le da instrucciones a la barra para que quede unida en forma vertical
al cuadro de lista, sobre el eje y.
C a p i t u l o 8: Tk ( 303
# L r r d t n a s c r o l l b a r and l i s t b o x
s c r o l l b a r . s c r o l l -command " . l i s t y v i e w "
l i s t b o x . l i s t - y s c r o l l " . s c r o l l s e t " r e l i e f sunken -width 15 -height 15 - F t g r i * l vilc
pack . l i s t . s c r o l l - s i d e l e f t - f i l l h i ~ t b- e x p a n d y e s - a n c h o r w
Eventos y uniones
U n programa T k ei un evento dirigido, lo ciial iignifica que ciiando
fiinciona eipera que ocurra algo, conio un inovimieiito con el ratón o
con el teclado, para r&lizar una acción. U n evento con el ratón puede
ser un clic, un doble clic o, incl~iiive,subir o bajdr el r ~ t ó nUn
. evento
o n~oviniicntocon el teclado puede ier presionar una tecla de control
o una coiiibinación de teclas o presionar la tecla E N T E R al final de loi
datos d e entrada. Cuando el programa detecta uii evento en particular,
toma una acción que puede ser otra operación gráfica, conio presentar
en pantalla otro nienú o puede ser la ejecución de un prograili'l en Tcl,
Perl o un ihell.
Las acciones están conectadas explícitamente a eventoi dados usail-
d o el conlando bind, el cual toma como iui argunientoi el nombre de
u n objeto o clase, el evento por conectar y la acción que ie ha de coiiec-
tar con cie evento. Cada vez que ocurre el cvento dentro de ese objeto,
se ejecuta IJ acción eipecificada.A continuacióii se preieiita un ejemplo
de una entrada conectada. El evento de presionar la tecla CTRL-C
realizará la acción de destruir todoi loi widgets, terminando el progrdiria.
Capitulo 8: Tk 1 305
proc I i s t a i rsTunc 0 1 r í
. l i s t d i r d e l e t e O end
. l i s t d e l e t e O end
cd f d i r
foreach i [exec 1 s - a 1 í
i f [ f i l e isdirectory $ i l I
. l i s t d i r i n s e r t end $ i
l else (
. l i s t i n s e r t end b i
1
t
1
# Display d i r e c t o r i e s a n d f i l e s t h e f i r s t time
1 is t d i rsfunc $di r
m d i ' r '¿ b ~ e - ~ u t t o no ~ n t 1r
t
1 i s t d i rsfunc $i
9rus r7Bii7wi~fi-- f
# Create scroll bar and list box for directories
scrollbar .scrolldir -command ".iistdir yview"
listbox .listdir -yscroll " .scrolldir set" -reliefanken -width 15 -height 15 \
-setgrid yes
pack .listdir .scrolldir -side left -fill both -expand yes -anchor w
# Create scroll bar and 1 ist box for files
scrollbar .scroll -coirimand ".list yview"
listbox .list -yscroll ".scroll set" -relief sunken -width 15 -height 15 -s~tgridyes
pack .list .scroll -side left -fill both -expand yes -anchor w
/¡ Check to see if an argument was entered
i f Sargc>O lset dir [lindex Sargv 031 else lset dir ' . " I
Prueba de repaso
0 2 Los programas en Tk son eventos dirigido^?^
3 Si.
4 Las acciones están unidas a eventos con operaciones biiitl.
310 1
- Fundamentos de programación
---
en Linux
Ventanas
Uno de los coiiiponeiites báiicos de un prograiii'i en T k ei la vcrrtarra.
Usted puede crear taiitai ventanas coi110 quiera, abrikndolas y cerrándolas,
lo nusiiio que agre@dolei widgets conio inenús, barras de herramientas y
barras de desplazar~iiento.C o n el coniando wm puede configurar dife-
rente$ características para las ventanas conio título, taniaño y nombre del
icono.
El pi-ograma rriydw.3 tnuestra cómo crea usted otra ventana con sus widgcti
propios, lo mismo que cóii~oacceder a archivos ( v h e figm 8-3).La fiinción
dispfle crea una ventana separada para presentx el testo de un archivo.
I'rimero, se define la variable de ventana, w, con el nonibre .dispf, así:
, . -.
s e t tr . d i s p f
i E::::
hng4.gY The L i n m o p e r a t i n q s y s t r n h a s become a v i a b l e
: ilionflay a l t e r n a t ~ v cEor myone m t h a P C I t bririqa
a 1 1 t h e power and f l e x i h i l i t y o € a Unix
mydirl
w o r k s t a t i o n ar w e l l a s a complete s e t o €
Intcrnet applications m d a f u l l y functional
1
1
deaktop m t e r f a c c i A l 1 o € t h i j cari e a s i l y be
i n s t n l l e d on any PC o r w o r k s t a t i n n T h i s buak
1
'. deeigned n o t o n l y t o he a cninplete
referente ori Liriux, h u t a l s o t o p r o v i d e c l e a r
m d d e t a i l e d e x p l a n a t i o n s o € Linux feaiJirs5
No p r i o r h o w l e d q e of Unix is assuned. L i m
i x m o p e r a t i n q systoi* mycine can u s e . !
The jecond e d i t i o n o € t h i s book i d e n t i f i e s
f o u r major Linwr t o p i c s ; Environments. t h e
'
I n t e r n e t , S e r v e r s , Applicaticins. m d
h d a i n i s t r a t i o n . Por Envircinnents. Linux h a s :
Ventanas de Tk
'~at~ti I C I ~
t o p l evel
wm t i t l e
wm iconna
Capitulo 8: Tk 1 311
Dentro de esta ventana se define un marco llaniado .buttons. El
comando button define el botón dismiss conio parte de este niarco:
.button.dismiss. El texto que se niiiestra en pantalla dentro del botón
es "I>isniiss". El comando que se ejecuta cuando se hace clic en el
botón es destroy $w, que destruirá la ventana. El marco que n~antieiic
el botón se ~ibicaen el centro de la pdrte inferior de la ventana.
$ i ~ i r l c t i o nt o D i r p l a y a f i l i . A window w i t h i t . 5 w n
I,! tixi box, rol 1 lh,ir, a n d 1 ; u t t o r i s
pror d i s p f i l r file 1
,i! , r e a t e d i s p l d y uiriílow, \rri:idow t i t l e . l i i d i c o n r i m ? .
--
Capitulo 8: Tk 1-
313
t o p l e v e l fw
wm t i t l e $w ' D i s p l a y F i l e "
wm iconname %w 'Di s p l a y F i l e W
-
i! C r e a t e t e x t b o x t o d i s p l a y t e x t
t e x t $ w . d i s p t e x t - r e l i e f sunken - b d 2 - y s c r o l l c o m m a n d \-
" 8 w . s c r o l l s e t " - c e t g r i d 1 - h e i g h t 30 - w r a p word - w i d t h 80
pack $ w . d i s p t e x t - e x p a n d yes - f i11 b o t h Obsi
/una línea separada
-
1
# Open t h e f i l e and r e a d i n t h t~9 < t
LoadFi 1e T e x t $w b f i1e -)me el archivo especificadol
1 -- -
/enla caja de texto - -
J
# C r e a t e window t i t l e f o r m a i n window.
# M a i n window i s r e f e r e n c e d w i t h a p e r i o d .
if A l s o c r e a t e i c o n name 111rm a i n window __ . .
# C r e a t e d i r e c t o r y 1 i q t b o x and s c r o l l l d r
s c r o l l b a r . s c r o l l 4 i t - ~ m i r i a i i d" . l i s t d i i y v i e w "
l i s t b o x . l i s t d i r - y s c r ú l l " . s c r u l l d i r s e t " -reliaf z u n i e n \
w i d t h 1 5 - h ~ i g h t1 5 ; r t g r - d y r s
pack . l i s t d i r . s r r o l l d i r - s i d ~l e f t - f i 1 1 t i o t i i \
-2xpand yes - a n r h o r w
fi C r c a t e f i l e l i 5 t b o x an!d s c r o l l b a r
s c r o l l b a r . s c r o l l - c ~ m m a n d" - 1 i s t y v i e w "
l i s t b o x .li s t - y : s r r ~ l l " . s c i , o l 1 5 - t " - r e 1 ieF s u n k p n \
- w i d t h 15 - 1 i e i g h t 15 - s u t g r l d ye;
pack . l i s t . s c r o l l - 5 i d e l e f t f i l l b u t h \
-exparid yr!, - a n r h n r w
wm m i i i s i : ! ~ . 1 1
# F u n i t i o n t o s e l e r t a f i : e f o r di;pl,?y
proc s e l ? r t f i l ? i d i i f i l c t :Verifica si I
-. .-. ---- .---I
i f / L f j l e i s t j l s f , f i l < ] I t h r n 1-~existeelarchivoi
.
di:7pfile $ i i l e
1 y -t 1
p11t:\
<~, ,,
.l 11,~, , -.
~ -
...
-~- -
- . . -.
~
Llamado a di>pFilc
-. -
para-presentar
. -el_ archivo!
. . 1
- -
,
i f $argc>O l s e t d i r [ l i n d e x Bargv 011 e l s e I s e t d i r "."I
# F u n c t i o n t o d i s p l a y f i 1-5 and d i r e c t o r i e s
pi'nc l i s t d i r s f u n c d i r I
. l i s t d i r d e l e t e O end
. li s t d e l e t e O erid
cd $ d i \ -
set n d i r [exec pwdl
f o r e c c h i Cexec 1.: - a 1 I
i f [ f i l e i s d i r e c t o i y Bil 1
. l i r , t d i r i r i s c r t t n d $i
1 else I
. l i s l i n c e i t end $i
1 ,u; coFdo-ble c l r l
1 st.lectfilc para presentar
1 len pantalla un archivo
1 i s t d i rsfi.lnc $ d i r
# S@t olj b i n d i n g s f r ~ rt h e d i r e c t v i . i e s and f i l c : . .
b i n d a l 1 I C o n t * r n l - c ; l J ~ s t r n y. 1
b i n d . l i s t <Double-Eiil-.tan-J ? l s e t i [ s c - i e c t i o n g e t l \
selectfile ddir s i \ .
\CjlisrdinCunrparapresenta
- -
:Une con doble clic a
b i n d . l i $ t d i r <Doiible-Button-1, l s e t i [ r e l e c t i o n ~ e t l
1 i s t d i r s f u n c $i l
wparita1!auri.b;_i_~~,
Marcos y etiquetas
En lugar de crear distintas ventaiias para diferentes operaciones, usted
puede usar mnrcos que se pueden presentar en pantalla en una sola
ventana. Cuando se elige una nueva operación, ella reemplaza a la que
se estt' presentando en ese n ~ o i ~ ~ e nEn
t o efecto,
. todas las operaciones
tienen su propio iiiarco que, cuando se elige, se presenta en la parte
inferior de la ventana. Cuando se termina la operación, el niarco
desaparece, contrayendo, eii consecuencia, la ventana principal. En la
figura 8-4 se presenta un ejemplo de algunos marcos en una ventai~a.
Las ctiqiretas le permiten seleccionar los elementos presentados en
pantalla para ubicarlos en una ventana, simplemente haciendo clic en
ellos con ei ratón. Las etiquetas le periniten crear selecciones de nienú
sencillas usando cualquier objeto que se muestre en su ventana. En la
figura 8-4, el menú principal es sólo tres líneas de testo, que coinienza
con los números 1 , 2 y 3. Pasando el ratón sobre una de estas líneas
cambia el color de fondo de la 1ínea.Al hacer clic en una línea, ésta se
selecciona y se ejecuta la acción asociada con ella. Las líneas de texto
operan conio un menú debido a las etiquetas. Cualquier texto en un
cuadro se puede niarcar con etiquetas. Una etiqueta puede definir
características del texto mismo, como fuente, tamaño, color o fondo, y
una etiqueta también puede estar unida a acciones, tal como los even-
tos de teclado. Con las etiquetas, el texto de un programa en Tk puede
funcionar conio un hiperenlace en una página Web: cuando usted hace
clic en determinado texto, puede ejecutar una función.
S~mpleFile Operations - 0 1
2. Erase a (ile.
3.Renarne a Me.
Fik in Cnpy: d o c l M
Prueba de repaso .
0 ¿Qué comando se utiliza para determinar las características
de una ventana?=
0 ¿Qué comando define una caja de texto?6
5 El comando wiii.
6 El comando text.
7 Las etiquetas se usan para implementar un menú
316 1 Fundamentos de programación en Linux
- --
Paso a paso
1. Cree una ventana principal con una barra de menú con la cual un
usuario puede elegir una opción quit para salir del programa. Prime-
ro, defina un marco para la barra de menú, llamado .menuBAR y
ubíquelo en la parte superior de la ventana.
2. Después, defina un botón de menú para el menú File, llamado
.menuBAR.file usando el comando menubutton.
Capítulo 8: Tk
-
%urce j o i n icrogdir
318 ( Fundamentos de programación
- en Linux
-=
pack .meiivYAR.filo - s i d c
# C r e a t e t i t l e and d i r e c: t o r y t e x t b o x f o r p a t h name
t raac . topfrarne
pack . t o p f r a m e - s i d e t o i1
l a b e l . t o p f r a m e . t i t k - 1: e x t "My F i lerrianager"
l a b q l .t o p T r r i m i . d i r l a b e ' I - t e x t " D i r e c t o r y "
e i i t r y . t o p f rame.dirnome - w i d t h 30 -. - t e x t v a r i a.b l -
e d- i r
p a c k . t o [ i i r a m e . t i t l e -:ide tcip
p a c k . ttopframe.di r l a t e l . t o p f r a r n e . d i r n d m - s i d e l e f t
O C r e a t e a s c r o l l b a r and l i s t b o x f o r D i r e c t o r i e s
# i n t h e i r own f r a m r , . d i r s
f ! . ? r n ~ d rs
i
p a c k . d i r s - s i d e l e f t - f i l l x -pady 2m
label .dirs.dirns -text "Directories"
5 c r o l l n a r . d i r s . s c r o f l d i r -comman81 " . d i r s . l i s t d i r yvit8t:"
l i s t b o x . d i r s . l i s t J i r -yscroll " .dirs.scrolldir set" \
- r e l i e f s i ~ i i k t . n -i.ridth 15 - h e i g h t 15 - ; ~ t g r i d ye:;
pack . d i r s . d i 1-ns - s i d e t a p
pack .di!-:..;ci-olldir . d i r ? . l i : , t i i i r .:Id? rigl-it. \
- f j l l brbtli -e~p..tn(lp 5 - 8 ~ n c 1 1w1 ~ ~ ~
P L r e a t i a s c r o l l b a r d n d l i s t t ~ u xí o r F i l e s
i/ i n t i i e i r clwn Franic, . i i l ~ ' i
Capitulo 8: Tk 1 319
pack . f i l e s - s i d e r i g h t - f i l l x -pady 2m
label . f i l e s . f i l e n s - t e x t "Files"
s c r o l l h l a r . f i l e s . s c r o l l -command " . f i l e s . l i s t yview'
listbox . f i l e s . l i s t -yscroll ",files.scroll set" \
i e l i e f runken - w i d t h 15 - h e i g h t 15 - s e t g r i d yes
pack . f i l e s . f i l e n s - s i d e t o p
pack . f i l e s . l i s t . f i l e s . s c r o l l - s i d e l e f t \
- f i l l b o t h -expand yes -anchor w
wm m i n s i z e . 1 1
// D i s p l a y a t e x t f i l e u s i n g d i s p f i l e and d i s p l a y a g r a p h i c
!/ f i l e u s i n g dispimage. Cal1 t h e separate d i s p f i l e and
// dispimage s c r i p t s w i t h t h e source command. p r o g d i r needs t o
# h o l d t h e f u l l p a t h name f o r these two s c r i p t s .
proc s e l ~ r t f i l el d i r f i l e l I
global progdi r
if ( \
[regexp ( \ . g i f S l \ . t i f f $ l \ . b m p S
S f i l e 1 = 11 \
t hen
source [ f i l e j o i n S p r o g d i r dispimage 1
) e l s e i f I [ f i l e i s f i l e S f i l e l l then (
source [ f i l e j o i n S p r o g d i r d i s p f i l e 1
I else I
puts stdout \
" \ " $ f i l e \ " i s n ' t a directory or regular f i l e "
I
1 -
#Set d i r when program f i r s t s t a r t s
i f Bargc>O l s e t d i r [ l i n d e x $argv O 1 1 e l s e l s e t d i r " . * l
JL r z l l 4h- A:---+ A - . . l:-&h-., ..:&h A:---L --.. --A +
h
.. r:l-
r I I I LIIY U I r ~ L L UyI I I ~ L U U A w I L r I U I r r L w r y r1a111e ~ I I UL I I V r I l e
l i s t b o x w i t h f i l e name. The l i s t b o x e s a r e d e l e t e d b e f o r e
b e i n g f i l l e d . n d i r h o l d s t h e complete p a t h name o f t h e
c u r r e n t d i r e c t o r y and i s used t o f i l l t h e .topframe.dirname
textbox
proc l i s t d i r s d i r (
. d i r s . l i s t d i r d e l e t e O end
. f i l e s . . l i s t d e l e t e O end
cd S d i r
f o r e a c h i [pYec 1s -a 1 l
i f Cfiie isdirectory S i l 1
. d i r s . l i s t d i r i n s e r t ~ n $i
d
t rlss I
. f i l e s . l i s t i n s e r t end B i
I
1
320 1 Fundamentos de programación en Linux
- ---
s e t n d l r texec pwdl
.topframe.dirname d e l e t e O end
.topframe.dirname i n s e r t O S n d i r
I
W i f a user e n t e r s i n a d i r e c t o r y i n t h e .topframe.dirname
# t e x t b o x . t h i s commdnd w i l l c a l 1 l i s t d i r s f o r i t
proc g e t d i r I 1 I
s e t d i r [.topframe.dirnarne getl
listdirs $dir
# T n i t i a l y f i l l i n g o f t h e d i r e c t o r y and f i l e l i s t b o x e s
l is t d i r s $ d i r
set w .pict
c31ch Idestroy Bwl
t 3 p l evel b!
Capítulo 8: Tk
wm t i t l e Sw " D i s p l a y Imagen
wm iconname I w " D i s p l aylmage"
# C r e a t e b u t t o n f o r q u i t t i n g window
frame $ w . b u t t o n s
pack $ w . b u t t o n s - s i d e b o t t o m - f i l l x -pady 2m
.#ui.rv,i vi. i " u * u " i i d . ..b i W d b rLr\* u i v4c. L W i i i i i i U i i U UL., r i "J ,.v.
3ack $ w . b u t t o n s . w c l o s e - s i d e l e f t -expand 1
% D e t e r m i n g image t y p e
i f [regexp (\.bmp$) B f i l e 1 {
s e t imagetype b i tmap
1 else I
s e t imagetype p h o t o
1
// C r e a t e image w i t h name imageName. Then c o n f i g u r e t h a t
1 image name w i t h t h e s p e c i f i e d image f i l e . Then c r e a t e a
1 l a b e l i n t h e window f o r t h a t image name.
!/ PacL t h l~a b e l t n d i s p l a y t h e image
image c r e a t e $ i m a g e t y p e imageName
imageName c o n f i g u r e - f i l e $ f il e
1 a b e l $ w . image - image imageName
pack $w.image - s i d e t o p - a n c h o r w
ri S c r í p t f o ddispTay t h e c 3 n t e n t s o f a f i l e .
set w . t e x t
catch Idestroy $ w t
t o p l e v e l $w
m ti t l ? $w " D i s p l a y F i l ? "
:AII iconname $w "tii qpl ayFi 1e"
/\ Create q i i i t buttnri
f. r.a-...-
r n ? Bw hiit tnnq
-,..-..-..-..-
pack $ ~ . b t i t t o n s - s i d e bottom - f i l l x -pady 2m
b u t t o n $ ~ w . b u t t o n s . q u i t - t e x t O u i t -command " d e s t r o y $ w "
pal:k $ w . b u t t o n s . q u i t - s i d e l e f t -expand 1
// C r e a t i d i s p t e x t frame and s c r o l l b a r f o r d i s p l a y i n q t ~ x
t ~ x Bw.disptext
t rr1i;f sunkeñ - M2 \,
- y i c r n l lconimaiid " $ N . s c r o l 1 z e t " - s ~ t l g r j d\
322 1 Fundamentos de programación en Linox
pack $ w . s c r o l l - s i d e r i g h t - f i l l y
pack $w.di s p t e x t -expand yes - f i l l b o t h
# Function t o load a t e x t f i l e
p r o c LoadFi 1e T e x t iw i n f i1 ename 1 1
s e t f i d [open $ f i l e n a r n e ]
$ w i n . d i s p t e x t d e l e t e 1.O end
while {![eof $ f i d l l í
$win.di s p t e x t in s e r t end [ r e a d Sf i d 100001
I
close Bfid
1
O /
valuacron
1. ¿Están organizados jerárquicamente los objetos gráficos de Tk?
&a
5-uge.~g,n
Aunque se desarrolló en ANSl C, en otros lenguajes hay wrappers
disponibles para las librerías de GNOME y CTK+, así como para la
mayoría de los lenguajes, incluidos Ada, Scheme, Python, Perl,
Dylan, Objective-C y, por supuesto, C++.
e Nota - -- .
Las aplicaciones de CNOME hacen uso de las librerías CNOME,
CTK+, así como de las librerías CNU. Para conocer descripciones
detallidas de las funciones, definiciones y estructuras que contienen
estas librerías, se recomienda usar la amplia documentación disponi-
ble en developer.gnome.org. La sección de documentación incluye
tutoriales detallados, manuales y trabajos con amplia referencia a las
API de CNOME, CTK y CDK.
Prueba de repaso
¿Cuál es el conjunto de widgets que usa GNOME?'
Librerías GNOME
Las librerías G N O M E hacen posible que las aplicaciones de GNOME
tengan la misma clase de interfaz GUI y que su aspecto sea muy simi-
1ar.Aunque una aplicación G N O M E es un programa GTK con fun-
ciones de librería de GNOME, la librería ofrece varios widgets
complejos de alto nivel, lo mismo que muchas operaciones simples que
no se encuentran en las librerías GTK+. En la tabla 9-2 se presenta la
lista de las librerías de GNOME.
libgnoriie y libgnomeui son las dos librerías principales que se
necesitan para cualquier aplicación en GNOME; libgnome es un
conjunto de funciones diseñado para ser independiente de cualquier
juego de herramientas GUI en particular. Estas funciones se pueden
1 GTK+.
2 Entorno de modelos de objetos en red de GNU.
ación en Linux
Librería Descripción
libaudiofile Lee una amplia variedad de formatos de
archivos de audio (AIFF, AIFC, WAV y
NeXTISun).
libgdk-imlib Incluye funciones para cargar múltiples
formatos de archivo (JPEC, CIF, TIFF, PNC,
XPM, PPM, PCM, PBM y BMP).
libgtk Esta es la librería CTK. Las aplicaciones
CNOME están totalmente escritas usando
libgtk para todos los elementos CUI (boto-
nes, menús, barras de desplazamiento,
etc.).
libgnome Incluye rutinas de utilidad para el entorno
del escritorio CNOME, tales como rutinas
para configuración, ayuda, manejo de tipos
mime (por multipurpose lnternet mail
extensions o extensiones multipropósito de
correo en Internet) y administración de
sesiones. Esta librería es independiente de
cualquiera de las cajas de herramientas
CUI.
libgnomeui Incluye extensiones de juegos de herra-
mientas para el conjunto de widgets CTK+
destinados a crear cuadros de diálogo y de
mensaje, barras de menú, barras de herra-
mientas, líneas de estado, etc. También
incluye iconos para los cuadros de diálogo,
entradas de menú y botones; y suministra
Capitulo 9: GNOME / 333
Librería Descripción
el widget canvas de CNOME para la fácil
creación de interíaces complejas, como li-
bretas de direcciones, aplicaciones de calen-
dario y hojas de cálculo. Esta librería depen-
de del juego de herramientas y en la actuali-
dad se usa en el CTK+ Toolkit.
libgnorba Una librería para usar la implementación
ORBit de CORBA con GNOME.
libzvt Una librería que contiene un widget de ter-
minal.
Contiene funciones gráficas usadas por
GnomeCanvas.
Categorías de función
de la librería CNOME Descripción
gnome-config Ofrece acceso simple a los valores de
configuración.
gnome-defs Contiene definiciones CNOME para en-
laces con C++.
gnome-exec Permite la ejecución de programas des-
de aplicaciones CNOME.
gnome-help Contiene rutinas para presentar ayuda
en pantalla.
gnome-history Mantiene el seguimiento de documen-
tos usados recientemente.
Ofrece soporte para localización e
internacionalización.
gnome-mime-info Contiene rutinas para obtener informa-
ción unida a un tipo MIME.
gnome-paper Contiene las dimensiones del papel y las
. conversiones de unidades para impre-
sión.
gnome-popt Contiene el analizador de los argumen-
tos de línea de comandos.
gnome-regex Contiene la implementación caché para
la expresión regular.
gnome-sound Incluye rutinas para activar sonidos para
aplicaciones CNOME.
gnome-triggers Contiene un mecanismo jerárquico de
señales para eventos de aplicación.
gnome-url Permite iniciar visualizadores para docu-
mentos basados en sus URL.
gnome-lib Inicia la librería libgnome.
de T K , el canvas de G N O M E ofrece un marco de referencia para crear
libretas de direcciones, aplicaciones de calendario y hojas de cálculo.
En la tabla 9-4 se presentan varias clases de las funciones que usted
puede encontrar en esta librería.
Las aplicaciones GUI requieren uso extenso de imágenes para crear
una interfaz de usuario amigable y có~noda.Tradicionalmenteha sido
dificil cargar todos los formatos comunes de archivos gráficos en
aplicaciones X11. La librería libgdk-irnlib trata este tema al ofrecer
funciones poderosas y adecuadas para cargar múltiples formatos de
archivo (JPEG, GIF,TIFF, PNG, XPM, PPM, PGM, PBM y BMP).
Estos archivos se convierten en una representación interna R G B de 24
bits y existen funciones de utilidad para ajustar a escala, lo mismo que
reproducir desde el R G B de 24 bits hasta diversas tonalidades de color
(con fusionado si se desea). Los archivos de entrada de imágenes se
llevan internamente a la nlemoria caché por medio de libgdk-itnlib
para mejorar el desempeño en aplicaciones que emplean imágenes de
manera repetida.
Categorías de función
de la interfaz de usuario Descripción
gnome-app-helper Permite la creación simplificada de
. menús y barras de herramientas.
gnome-app-util Incluye funciones de utilidad para mani-
pular widgets del contenedor
CnomeApp.
gnome-canvas-util Incluye funciones auxiliares del canvas.
gnome-dialog-util Ofrece funciones de conveniencia para
hacer cuadros de diálogo.
gnome-dns Ofrece una interfaz para resolver nom-
bres de dominio que no están en blo-
ques.
gnome-geometry lncluye funciones de utilidad para la
geometría de ventanas.
mación en Linux
Categorías de función
de la interfaz de usuario Descripción
gnome-icon-text lncluye funciones de enrollamiento de
texto para titular iconos.
gnome-init Inicia librerías de CNOME.
gnome-mdi-session lncluye rutinas que ofrecen las opciones
de guardar estado y restauración en
CnomeMDI.
gnome-popup-help Contiene un sistema de ayuda
contextual para CtkWidgets.
gnome-popup-menu Incluye rutinas para anexar a los widgets
menús contextuales que aparecen cuan-
do se hace clic con el botón derecho del
ratón.
gnome-preferences Contiene rutinas para buscar y traer ins-
trucciones y para determinar preferen-
cias en CNOME.
gnome-startup lncluye rutinas internas para administrar
la sesión.
gnome-types Contiene algunos tipos globales usados
por las librerías CNOME.
gnome-winhints . Contiene rutinas para manejar indicacio-
nes específicas del administrador de
ventana de CNOME.
gtkcauldron Produce cuadros de diálogo gtk/
CNOME a partir de cadenas de formato.
Prueba de repaso
¿Tiene GNOME su propio administrador de ventana^?^
¿Cuáles son las dos librerías que se necesitan para cual-
quier aplicación de GNOME?4
3 No.
4 libgnome y libgnomeui.
338 1 Fundamentos de programación
-
en Linux
GTI<+.
-,- - --
--v--. - --- ..., -- - ---- --
gcc he1lo.c -o hello 'gtk-confiq --cflags --libs'
ramación e n Linux
e#.*, "* *
Librería Descripción
CTK (-lgtk) Librería del widget CTK
CDK (-lgdk) wrapper Xlib
gmodule (-lgmodule) Extensiones en tiempo de ejecución
Clib (-lglib) CTK está construido sobre Clib y siem-
pre lo necesita
Xlib (4x1 1) Lo usa CDK
Xext (-IXext) Memoria compartida con mapas de
pixeles y otras extensiones X
math (-lm) Librería de funciones matemáticas
Señales y eventos
La prograniación en GNOME funciona como otra prograniación en
GUI, orientada por eventos. En programas de esa clase, usted define
primero los objetos que el usuario puede operar y después inicia la
función de interacción que continuamente verifica ciertos eventos,
conlo clics de ratón y selecciones de menú. Cuando se detecta un
evento de esa clase, se pasa a su función apropiada para el nianejo. Por
ejemplo, si un usuario hace clic en el botón OK, se detecta ese clic y el
control se traslada a una función configurada para nianejar un clic en
Capitulo 9: GNOME 1 341
un botón O K . Cuando la función ha terminado, regresa el control al
programa de interacción.
GTK agrega u n nivel de sofisticación adicional. Cuando se preseii-
tan eventos en ciertos widgets, el widget emitirá una señal que despuks
se usa para ejecutar iina f~inciónasociada con esa señal y ese objeto.
Por ejemplo, cuando usted hace clic en u n botón Close, el widget de
este botón detecta el evento de clic en el ratón y emite una señal "con
clic", la cual se detecta y permite que se ejecute la acción
asociada.
Usted tari1bit.n puede, si lo desea, asociar iin evento directamente
con una función. Para este trabajo, el programador tiene que conectar
una serial en un objeto dado con una función particular. Las fiincioiies
asociadas con iina sella1 en particular por lo coinún se conocen como
inaiiejadores o f~iiicioiiesde retrollamado (callbacks). Cuando se emite
una señal, se llaman sus nianejadores o contestadores. Este proceso se
denomina "einisión". Observe que las señales a las que se Iiace referen-
cia aquí de ninguna nianera son como las seriales que se usan en los
sisteinas UNIX.
Para asociar iin evento en particular con la función que usted quiere
que se ejecute ante una sella1 dada, use las fiinciones gtk-signal-
connect o gtk-signal-connect-object. Cuando se detecta la señal,
su f~inciónasociada se ejecut;~de nianera automática. La fiincióri
gtk-signal-connect se ufiliza para funciones de llamado, a las cuales
usted puede pasar argumentos, inientras que las fiinciones
gtk-signal-connect o gtk-signal-connect-object se usan para
f~incioiiesde llamado que no requiere ningún argumento. En la sintaxis
del siguiente enunciado, gtk-signal-connect, object es el GtkObject
que usted definió, como en el caso de iin botón; name es el nombre
de la señal, que puede ser un clic con el ratón; func es la función que
usted quiere ejecutar cada vez que ociirra un evento con este objeto, y
func-data es cualquier argumento que se pasa a esa f~inción.
m i O n n e ~m to b J e c t , -llame,
G t k S i g n a l Func f u n c , g p o i n t e r func-data ;
342 1
- Fundamentos de programación
-- en Linux
~ ~ q n i l - c o n n e c?%TK-OB~;~CT
t (rnybutton'), " c - f i'ckedm .
GTY-SIGNAL-FUNC (hello), NULL);
'i'
Pregunta: ;Puedo asociar más de una función de retrollamado
con un objeto y su señal?
Guarde este valor en una variable de tipo gint. Si usted desea Peparar
mis adelante esa funciótr del objeto y la señal, use la f ~ ~ n c i ó n
~ t ko i m a l disconnect ron la etiniict,~de irl~ntifir~i-ihiiv el o h i ~ t n
En el si.guieiite
- cieimplo, la f~mciónmyfunc está asociada con un clic con
v .
.. " , .
1a variable myfuncid, la cual se usa en la fuilcióii gtk-signa-
.,
aisconnect para separar myrunc ae ia operacion de c m con ei raton.
. 1. I .
g i n t myfuncid;
Las señales están almacenadas en una tabla global. Usted puede crear
sus propias señales con la función gtk-signal-new y después gtk-
signal-emit para tener un objeto que emita una señal; gtk- signal-
new regresará u n identificador para la nueva señal. Usted puede usarlo
con gtk-signal-emit para que su objeto emita esa señal.
e programación en Linux
-m,*ss
Prueba de repaso
O ¿Qué función se utiliza para conectar objetos con
acciones?'
-
O ¿Qué función se emplea para desconectar objetos de
Funciones GNOME
Los programas en G N O M E se constriuyen sobre -prograni
-
que cuentan con funciones de GNOME para facilitar la creación de
interfaces que sean consistentes con el estilo del escritorio de
G N O M E . Para crear un progrania simple en GTK, usted comienza
con las definiciones de objetos G T K para sus widgets en G N O M E y
después utiliza las funciones de G N O M E para iniciar el programa y
definir sus widgets. Las funciones de G T K como gtk-signal-connect
se emplean para asociar eventos GUI con objetos, en tanto funciones
G N O M E como gnome-app-create-menus crean menús. En un
progrania en G N O M E usted debe incluir una función de iniciación
llamada gnome-init, que ubicará al comienzo. Para crear una ventana
primaria para su apli?ación, use gnome-appnew.
El siguiente ejemplo muestra el uso de las funciones gnome-init y
gnome-app-new. La priniera de ellas asunle los argumentos iniciales
que el usuario debe entrar cuando el programa comienza, lo niisiiio
que una aplicación ID y el número de versión. Las variables especiales
argc y argv administran los argumentos iniciales del usuario;
gnome-app-new toma como argumentos el título que usted desee
mostrar en la ventana de la aplicación y el nombre del objeto de
aplicación y presenta la dirección del nuevo objeto que, en este ejeni-
plo, se asigna al apuntador app, el cual va dirigido a un objeto del tipo
GtkWidget.
5 gtk-signal-connect.
6 gtk-signal-disconnect.
Capitulo 9: GNOME (-
347
gtk-widgef-showmpS-:
gtk-main O ;
a l 1: bookrec
bookrec: f i 1 e . o ca1c.o
c c $(LDFLAGS) m a i n . 0 - o b o o k r e c
main.0: main.c
c c $(CFLAGS) m a i n . c
fi1e.o: fi1e.c fi1c.h
c c B(CFLAGS1 f i 1 e . c
=
[zHello ADD - O XP
Paso a paso
Defina dos funciones de contestador de llamado: hellomessage y
closeprog; hellomessage sólo presenta un mensaje de texto senci-
llo, "Hello World"; closeprog llama la función gtk-main-quit para
finalizar el programa.
En la función principal, defina dos apuntadores GtkWidget: app y
mybutton. El primero de ellos debe ser un apuntador para la
ventana principal de la aplicación y mybutton para un objeto de
botón sencillo.
Cree una función gnome-hit para iniciar la interfaz CNOME.
Cree un objeto de botón usando la función gtk-button-
new-with- label y asigne la dirección respectiva al apuntador
mybutton, como se muestra en la siguiente línea de código. El
botón se presentará con el rótulo "Click Me".
mybutton = gtk-button-new-with-label("C1ick Me");
Cree un widget para la ventana de la aplicación usando la función
gnome-app-new y asigne la dirección respectiva al apuntador
aPP.
Utilice gnome-app-set-contents para poner el botón en la venta-
na de la aplicación.
Use gtk-signal-connect para conectar la aplicación con una señal
delete-event, la cual se presenta cuando el usuario hace clic en la
casilla para cerrar la ventana. Con esta acción ejecuta la función
closeprog, que debe utilizar gtk-main-quit para terminar el pro-
grama.
350
- Fundamentos d e programación e n L i n o x
-
.
gnoiiie-dpp..s~t-ci~iitents (GNOME-APP ( a p p ) n i y l l i i t t o t i ) :
.
g i k-sigrirrl-rcii-in~?ct (GTt.'-OH,lECT ( a p p ) " r l r l .t.?-eveiit" .
GTK-'iICi!r,L-TUNC ( c l o s c p r o g ) .l!lJLL) :
g t l -signal-coniiwt (GTK-OBJECT ( m y b u t t o n 1 . " c l i c k e d " ,
GTK-SIGNAL-FUNC ( h e l l o m e s s a g e ) . NULL):
gtL-widget-shbw-al l w);
qtk-rnnin ():
Los widgets GNOME App,
Toolbar y Menu
El widget GnomeApp es el widget básico para las aplicaciones
GNOME. Es la ventana principal que contiene menús, barras de
herraniientas y datoi. Usted usa la función gnome-app-new para
crear un nuevo widget GnomeApp.Esta función tonla conio argu-
mento el nonibre de la aplicación.
Para agregar elementos, conlo barras de herramientas, menús y
barras de estado al widget, eniplee la función apropiada. Por ejeniplo,
para agregar un nienú, use gnome-app-set-menus y para añadir una
barra de estado, gnome-app-set-statusbar. Para agregar una sola
barra de herraniientas, use gnome-app-set-toolbar y para añadir
varias, gnome-app-add-toolbar. En la tabla 9-7 se presenta un lista
de los widgets de GNOME.
Con las funciones gnome-app-helper usted puede generar
autoináticaniente menús y barras de herramientas utilizando estructu-
ras GnomeUIInfo. Para barras de herramientas y menús, usted puede
crear las estructuras GnomeUIInfo adecuadas con los valores apropia-
dos y después usar gnome-app-create-menus para crear menús y
-
gnome-app-create-toolbar para crear barras de herraniientas.
conttnuacton
de programación en Linux
-a-- w
m n f o - - J = 1 1
GNOMEUIINFO-SUBTREE("J1LE". file-menu).
GNOMEUIINFO-SUBTREE("-EDIT", edit-rnenu),
GNOMEUIINFO-END
1;
File
-
4
Exit
Menu Example
Paso a paso
1. Defina dos funciones de retrollamado: copy-func y openfunc. En
este programa deben presentar un mensaje mientras que en un
programa completo realizarían operaciones de archivo y copiar.
.
2. Defina un menú Archivo con dos elementos, uno para abrir (Open)
y otro para salir (Exit). Cree en el menú Archivo un arreglo con el
nombre file-menu. Utilice la macro CNOMEUllFO para crear los
elementos del menú, que serán los elementos del arreglo file-
menu.
3. Defina un menú Editar con un elemento para copiar (Copy). Cree
en el menú Editar un arreglo con el nombre edit-menu. Use la
macro GNOMEUllFO para crear el elemento del menú, que será un
elemento del arreglo edit-menu.
4. Defina una barra de menús con dos menús: Archivo y Editar. Cree
en la barra de menús un arreglo con el nombre menubar. Use la
macro GNOMEUIINFO-MENU-FILE-TREE para agregar los menús
a la barra, convirtiéndolos en elementos del arreglo menubar.
GnorneUIInfo f i l e - m e n u C 1 = I
GNOMEUI I M F O ~ M E ~ l U ~ O P € ~ l ~ I T E M ( o ~ ~ NULL)
ennf~~nc, .
GNOMEUI INFO-MEMU-EXII-1 I E H [ g t k - m a i n - q u i t , N U L L ) ,
GNOMCU 1 1 NFO-END
1:
t - ---FA 1
GnomeUIInfo menubarCl = t
GNOMEUIINFO-MENU-FILE-TREE(fi1e-menu),
GNOMEUIINFO-MENU-EDIT_TREE(edit-menu),
GNOMEUIINFO-END
1;
GnomeUIInfo t o o l b a r C l
GNOMEUIINFO-ITEM-STOCK("Exit","Exit
-t the application",
k~gG
m
t,nM
~taqiuiOMEk_G
gm
t,nM
_taqiuOME_STOCK_PXIMAP_ESXT,)O
ICKKPXIMAP_EXT,)I
GNOMEUI INFO-END
i;
int
rnaiti(itit argc, char * a r g v [ l )
I
G t k l d i d g e t *app;
Gt!.Ni d g e t * b u t t o n :
GtkWi d g e t *l a b e l ;
/ * c r e a t e t h e menus and t o o l b a r * /
gnome-app-create-menus (GNOME-APP ( a p p ) , meniibar);
gnome-app-create-tool b a r (GNOME-APP ( a ~ ~ p t) o. o l b a r ) ;
gtk-widget-show-all(app1;
qtk-main O ;
r i t u r n 0;
Iconos de GNOME
La librería libgnoineui ofrece un amplio conjunto de iconos para
~isarloscon elementos del menú y barras de herraniientas. En la tabla
9-9 se presentan algunos de los iconos más comunei.Tambiin se
cuenta con los botones más utilizados para elernentos estándar como
los botones OK y Cancelar.
Capítulo 9: GNOME
5-ug'e 7 ~ ~
e 7~~ li a
Si está creando manualmente elementos de menú, puede utilizar
gnome~stock~menu~item para crear un elemento de menú con
un icono especificado. Para los botones más comunes, puede usar
gnome~stock~buttons.
Para un menú, uckd usaría elemeritoc r' iconos iniu pquelios, que
tienen el t6rnlino MENU en ellos. Úwlos para el argumento dc dato,
del icono en las iiiacros del menú y del icono. Por ejeiiiplo, para la
entrada Copiar (Copy) el1 el menú Editar del prograiiia anterior,
podría eiiiple'~rla, iilstrucciones q u c ue preientan a contiri~i~ición,
t.11
donde GNOME-STOCK-MENU-COPY es un icono Copiar inis
peque" para usarlo en meriús.
Cuadros de diálogo
C o n las f~iiicionesde diálogo GNOME, usted puede crear fácilniente
cuadros de diálogo inodales y no modales. Aiinque estos últiinos
tienden a ser mis ainigables con el usuario, los cuadros de diálogo
Capitulo 9: GNOME 1 363
modales son más ficiles de programar. Para crear uii cuadro de diálogo,
~istednecesita definir un widget GnomeDialog utilizando la f~inción
gnome-dialocnew. Esta f ~ i n c i ó tonla
~ i coiiio sus argunientos el
título del cuadro de diálogo y cualquier botóii que quiera presentar.
I'ara usar botones más coiiiunes, usted puede eiiiplear coino argumen-
tos cualquiera de las definiciones de GNOME-STOCK-BUTTON.
Gt,kWidget ' r n y d i a l o g :
i n t drex;
i n t dclose;
/*Create a new d i a l o g , Be sure t o i n c l u d e t h e NULL on the end*/
m y d i a l o g = gnorne-dialog-ncw("My D i a l o g " ,
GNOME-STOCK-BUTTON-OK,
GNOME-STOCK-BUTTON-APPLY,
GNOME-STOCK-BUTTON-CLOSE,
NULL) ;
364 1 Fundamentos de programación en Linux
g v -
dclose = 0:
while (dclose != 1 ) i
dres = gnome~dialog~run(GN0ME_DIALOG(mydialog)):
swi t c h ( d r e s {
case O : /* OK b u t t o n */
case 2 : / * Close button * /
case -1: / * Close box * /
dclose = 1:
break:
case 1 : / * Apply b u t t o n * /
g-print ("User pressed Apply");
break
1
1
/ * close dialog * /
gnome~dialog~close(GNOME~DIALOG(dlgl);
1
Cuadros de mensaje
Entradas
Usted emplea los widgets GnomeEntry para ingresar testo, nonibres
de archivo, imágenes, iconos o datos numéricos. Estos widgets le per-
miten entrar una línea de información como las que se usan en los
forniularios. U n cuadro se presenta con un ciirsor en su interior e n
donde usted puede escribir su entrada. A la izquierda hay u n rótulo
366 1 Fundamentos de programación en Linux
-
para el cuaclro. Esta clase de widget también se conoce como iin cua-
dro d e tcxto.
El widget GnomeEntry se Lisa para contencr testo. I'riinero. iistcd
crea este widget con la hncióil gnome-entry-new, la cual toma
como argumento iina cadena de identificación para este objeto. U n
oljeto GnomeEntry contiene 1111 objeto GtkEntry que tiene el
texto real. Para niodificar el texto, usted tiene que emplear el apunta-
dor directamente hacia el objeto de testo GtkEntry;puede coiisegiiir
este apuntador iisando f ~ ~ n c i o n gnome-entry-gtk-entry.
es El si-
giiientc ejemplo crea uii widget GnomeEntry utilizaiido dos apurita-
dorei, myentry y mytextentry, para hacer refereiicia al widget misiiio
y a los controles del testo. I'riiiiero se definen los apiintadores
myentry y mytextentry. Despues, la función gnome-entry-new
crea un widget GnomeEntry y sil dirección se asigna a myentry.
Entonces, la fiinción gnome-entry-gtk-entry obtiene la dirección
del eleiiiento en el widget myentry que contiene el texto que el
iisuario eiitrará. Esta direccióii se asigna al apuntador mytextentry.
- - -
r ~ t k W % g e t" v i n t r y ;
GtkWidget * m y t e x t e n t r y ;
m y e n t r y = gnorne-entry-new("text1"):
rnytextentry = gnome-ent ry-gtk-ent r y ( GNOME-ENTRY (rnyentry) 1 ;
Canvas de GNOME
U n canvas e i u n ~ v i d g e td e trazado grifico m u y poderoso y ficil d e
iis,ir. Contiene soporte p r C igrifica5 Xlib y iumizado d e bordei. Ustcd
crea u n widget ccinvcisc o n la f ~ i n c i ó ngnome-canvas-new. D e b e
asegur'irse d c iitili~arel niapa viiu~ily d e color apropiado. I',ira cito,
368 1 Fundamentos de programación
- -
en Linux
gtk~widget~push~visual(gdk~imlib~get~visua1~~~;
gtk~widget~push~colormap(gdk_imlib~get~colormapO~;
canvas = gnome-canvas-new0;
gtk-widget-pop-visua10:
gtk-widget-pop-colorniap( );
1
-nva5 *inyfanvas;
GnomeCanvasItern * c i t e m l ;
cíteml = gnome~canvas~item~new(gnome~canvas~root(mycar~~~a~~,
GNOME-TYPE-CANVAS-RECT,
" x l " , 1 . 0 , " y l " . 1.0. " x 2 " . 23.0, " y 2 " . 20.0.
"fill-color". " b l u e " , NULL):
Capitulo 9: GNOME 1 369
Para cambiar cualquiera de estos atributos, usted usa la función
gnome-canvas-item-set. Esta función toma como su primer argu-
mento el apuntador para el elemento del canvas, mientras que los
demás argumentos son los atributos, tal como los listaría para
gnome-canvas-item-new. Se dispone de numerosas funciones para
realizar operaciones en objetos, tales como la función gnome-
canvas-item-move que mueve un objeto y la función gnome-
canvas-item-hide para ocultarlo.
Prueba de repaso
¿Cuál es la manera fácil de crear entradas de menú para
un menú?'
¿Cuáles son las funciones que usted utiliza para crear
cuadros de d i á l o g ~ ? ~
O /
valuacron
1. ¿Cómo llama las 1i)erías de GNOME cuando compila un
programa en GNOME? ¿Cómo lo hace con los programas
en GTK?
Librerías KDE
U n programa en KDE simplemente es un programa en C + + que usa
objetos cuyas clases están definidas en las librerías KDE y Qt. Usted
emplea el compilador g + + en sus archivos de código fuente como lo
haría con cualquier otro programa en C + + ; g + + es la forma en C + +
del compilador gcc de C. Existen varias librerías en KDE, cada una con
un extenso conjunto de clases. En la actualidad hay dos versiones de
estas librerías: la que corresponde a la versión KDE 1.l.y las de la
versión más reciente KDE 2.0. La mayoría de los programas necesitará,
por lo menos, las librerías kdecore y kdeui. Esta última contiene las
clases de la interfaz de usuario de KDE para los widgets de KDE
rogramación en Linux
---m &
(véase tabla
10-1).La versión 2.0 de KDE también incluye la suite
KOffice. Para con~pilarprogramas que toman ventaja de los cornpo-
nentes de KOffice, se usan las librerías KOM.
Widget Descripción
DialogBase Una clase base que ofrece la funciona-
lidad básica necesaria para casi todos los
cuadros de diálogo.
La clase KDE Panel Applet.
La clase base de la cual se derivarán dife-
rentes widgets de iconos de autoriza-
ción que en realidad hacen algo.
KButton La clase que suministra botones activos
de presión que, al soltarlos, regresan a
su estado original.
Un widget contenedor para botones.
Botón que, al presionarlo, presenta en
pantalla o permite al usuario la selección
de un color.
KContainerLayout Un widget alternativo para manejar la
distribución.
KCursor Un wrapper QCursor de Qt que permite
contar con cursores "temáticos".
Un widget para seleccionar fechas.
Un cuadro de diálogo con soporte ex-
tendido sin modo.
KFontChooser Un widget para la selección interactiva
de fuente.
KCradientSelector Un widget selector de gradiente.
KlconLoaderButton Un botón que usa KlconLoaderDialog.
KlconLoaderDialog Un cuadro de diálogo para la selección
interactiva de iconos.
KKeyButton Un botón que, al presionarse, parece
como una tecla.
KLed Un widget redondo del tipo LED.
KLedLamp Un widget con lámpara LED y estilo CDE
(entorno común de escritorio).
Widget Descripción
KLineEdit Un widget de entrada de Iínea KDE.
KLineEditDlg Un cuadro de diálogo para que los usua-
rios entren una sola línea de texto.
KMenuBar Una barra de menú de libre ubicación.
KMessageBox Un práctico cuadro de diálogo
MessageBox.
KNumCheckButton Un tipo diferente de botón Verificar.
KPopupMenu Un menú desplegable que tiene como
primer elemento un título descriptivo.
KProgress Un widget indicador de progreso.
KRadioCroup Una clase para un grupo de botones
excluyentes en una barra de herra-
mientas.
Un widget de regla.
Un selector con valor unidimensional
con contenidos trazados por la clase
derivada.
KSeparator Un separador estándar horizontal o ver-
tical.
KStatusBar Un widget de barra de estado KDE.
KStatusBarltem Una clase interna para usar en
KStatusBar.
.
Los archivos d e cabecera ta1iibit.n so11 de extrema utilidad co111o una
fuente de referencia, ya que ellos presentan en lista las funciones niiem-
bro para una clase en particular e incluyen conientarios detallados que
describen todas las fiinciones y su uso. Los archivos de cabecera se
ubicarán en el directorio includc d e KDE. En la actualidad, para R e d
Hat, el directorio irxliide estáiidar es /l,isr/incli.rde. Eii OpenLinus y otras
distribuciones puede ser el directorio especial d e KDE, c o i i ~ o/ o p /
kdc/includ~.
Para que usted defina una ventana principal para su aplicación,
emplee la clase KTMainWindow. En el sigiiiente ejeiiiplo se define
un objeto de ventana principal llariiado mywin.
m n d o w mywin; . -
Capitulo 10: KDE 1 377
Si usted crea una aplicación en la cual la ventana principal es la
interfaz primaria, y qiiiere que la aplicación se cierre cuando se cierre
la ventana, tiene que hacerlo en el cvidget principal para la aplicación.
I'ara hacer esto, usted utiliza la fuiición setMainWidget del objeto de
aplicación. El widget principal podría ser cualquier widget que desee.
Asegíirese de pasar la direccibn del widget; para ello, debe aiiteponer el
operador de dirección: el signo de ampersand (&). En el siguiente
ejemplo se establece el widget principal para la ventana mywin. Se
pasa la direccióii del widget mywin: & mywin.
Una vez que ha definido todos sus cvidgets y ha hecho las niodifica-
ciones correspondientes, puede hacer fiincioii~rla aplicación. Para ello
utilice la f~inciónexec del objeto de KApplication:
íi
Ventana en KDE
1 1 -
YU I I V U L/I I V r / W A
Y V I W V d
Preaunta: ;Oué
*. .
basa si amrece el error de aue el c o m ~ i l a d o rn o
pudo encontrar un archivo de cabecera (.h)?
J
1 - Iloptlkdelincl u d e 1
1 Sí.
2 KTMainWindow.
380 1 Fundamentos de programación
---
en Linux
no eitrí definida, puede hacerlo asignando el titio (si lo cabe) de los coinpo-
la señal
1cut75tyúo- -
Cualquier clase q u e incluya slots o señales también debe incluir una
referencia especial denominada QOBJECT. Esto permite q u e el
preprocesador del compilador de metaobjetos (que se describe a
continuación) configure cualquiera d e las señales y slots declarados
e n la clase. . -- 7
Opción Descripción
-o archivo Escribe la salida en archivo y no en STDOUT
-f Obliga a la generación de un enunciado #include en el
resultad% Esta opción sólo es útil si usted cuenta con ar-
chivos de cabecera que no sigan las convenciones
estándar de asignación de nombres.
-1 No genera un enunciado #include en el resultado. Enton-
ces, usted deberá pasar #include al código metaobjeto en
el archivo .cpp.
-nw No genera ninguna advertencia.
-Idbg Escribe información depurada de lex en STDOUT.
-d bg Trata todos los miembros que no son señales como slots,
para los propósitos de depuración interna.
-p path Hace que el MOC anteponga path/ al nombre de archivo
en el enunciado #include generado.
-q path Hace que el MOC anteponga path/ al nombre de archivo
de los archivos #include en Qt, en el código generado.
384 1
7
Fundamentos de programación
-
--
en Linux
Para declarar una clase que contiene sellales o slots, priniero debe
declarar la clase en u11 archivo de cabecera conlo rriyo.j.li. Usted n o
pone las definiciones de ningiina de las fiinciories niienibro en el
archivo de cabecera, sino solamente la declaración de la clase. Observe
que esa dcclaracióii incluirá declaraciones de las fiinciones niienibro,
estructiiras y variables. En un archivo de código f~ienteseparado usted
pondri la definición de las funciones miembro, como irr)whj.(pp. La
definición de una función niienibro es el código actual para la fuiicióri.
Para que estas defiiiiciones queden compiladas correctamente, tiene
q ~ i eincluir la versión procesada previaniente por el MOC: de la decla-
ración del objeto y no la declaración real propianiente dicha. Para
generar las versiones que el M O C Iia procesado previamente, usted usa
el arcliivo de cabecera d e la declaración de clase y el coinaiido m o c ,
coiiio sigue:
& 30
Proyecto 10-1: Una ventana KDE
hellowin.cpp es un programa simple que presenta en la ventana princi-
pal un botón y después un cuadro de mensaje con "Hello World" cuan-
do se hace clic. La clase Hellowin tendrá dos slots declarados: myhello
.
he11owi n cpp
(para presentar el mensaje) y myexit (para salir del programa). La
declaración también deberá incluir QOBJECT, que es un objeto especial
que usa KDE para conectar los objetos de la barra de herramientas de
QT. La declaración para Hellowin se pondrá en el archivo de cabecera
hel1owin.h y todas las definiciones de la función miembro se ubicarán en
el archivo hellowin.cpp.
Para compilar este programa, debe procesar previamente el archivo
de cabecera hel1owin.h con el MOC. Después, puede compilar el archivo
hellowin.cpp. Observe que este archivo deberá incluir el archivo
hellowin.moc y no el archivo hel1owin.h. Las operaciones de compilar se
muestran a continuación:
'moc -o ~ e l 1 o w i n . m ~ l o w i n .
g++ - 1 kdecore - 1 kdeui - 1 q t - o he1 1 owi n he1 1 owi n . cpp
Nota
: Una mejor forma de organización sería poner las definiciones de la
función miembro en uno de sus propios archivos de código fuente
separados, dejando la función principal en su propio archivo de
código fuente. En este caso, usted incluirá hel1owin.h con la función
principal y hellowin.moc con las definiciones de la función miembro.
Paso a paso
1. Cree el archivo de cabecera hellowin.h, que contendrá la definición
de clase para la clase Hellowin.
2. Incluya archivos de cabecera que contengan definiciones de clase
para objetos como ventanas, botones y cuadros de mensaje. En este
caso, incluya el archivo de cabecera para la ventana principal,
ktmainwindow; para un botón, use qpushbutt0n.h y para un cuadro
de mensaje, kmsgb0x.h.
3. Defina la clase Hellowin, derivada de la clase KTMainWindow. Dé a
la clase Hellowin dos slots (funciones) llamadas myhello y myexit.
Defina dos apuntadores para botones: buttonhi y buttonExit.
4. El archivo myhello.cpp mantendrá el programa principal. Comience
por incluir archivos de cabecera y el archivo hellowin.moc, el cual
debe generar por separado el preprocesador MOC.
5. Defina una función constructora para la clase Hellowin,
Hellowin::Hellowin. Cuando se define un objeto de esa clase, esta
función se ejecuta automáticamente.
6. Cree un objeto de botón usando QPushButton y asígnelo al apun-
tador buttonhi. Determine el tamaño y después preséntelo en
pantalla. Se conecta al slot myhello de modo que cuando se haga
clic en él, se ejecuta la función myhello.
--
Capitulo 10: KDE 1 387
7. Cree otro objeto de botón usando QPushButton y asígnelo al
apuntador buttonExit. Determine el tamaño y después preséntelo
en pantalla. Conéctelo al slot myexit de modo que cuando se haga
clic, se ejecute la función myexit.
8. Defina una función closeEvent para la clase Hellowin. Esta función
simplemente terminará el programa llamando la función kapp-
>quit.
9. Defina la función myhello para la clase Hellowin. Esto presentará
en pantalla un cuadro de mensaje separado con el mensaje "Hello
World".
10. Defina la función myexit para la clase Hellowin y determínela para
cerrar la ventana Hellowin.
11. En la función principal, defina una KApplication llamada myapp.
Defina un objeto Hellowin llamado mywin. Después, determine el
tamaño del objeto.
12. Use la función setMainWidget para myapp para situar el objeto
mywin en la ventana principal de la aplicación.
13. Emplee mywin.show para mostrar esa ventana.
14. Use myapp.exec para operar la aplicación.
--
- -
7iincciu <kápp.hj .
'-
Binclude (ktmainwindow,h>
# i n c l ude (qpushbutton. h>
# i n c l ude (kmsgbox. 11)
c l a s s H e l l o w i n : pub1 i c KTMainWindow
I
0-OBJECT
public:
Hellowin O:
v o i d c l oseEvent(QC1oseEvent * l ;
public slots:
void niyhello0;
void m g c x i t 0 ;
private:
12PushButton " b u t t o n h i ;
dFiishButton " b u t t o n E x i t ;
I;
El siguiente es el código para el archivo hellowin.cpp:
v o i d Hello!.iiri::niyexitO
1
cl ose( 1 ;
I
i n t m i n ( i n t a r g c , char **argv
1
K A p p l i c a t i o n myapp ( a r g c , argv, " H e l l o W o r l d ! " 1:
He1 1 o ~ ! ni myk;i n;
m y i n . setGeometry( l 0 0 , 1 0 0 , 2 W , 1 0 0 ~ ;
Menús
Para crear i~ieiiús,usted crea una barra de nieiiíis dc KDE y desput.5 lc
agrega iiieriús Q t con los clciiieiitos correspondientes. Necesitará
incluir el archivo de cabecera c l p o p i ~ ~ ~ / i ~para
c r ~ ~los
~ . nienús
li y el archivo
de cabecera kiireri~rl~nr.lr
para la b'irra de nieníi, como se muestra a
contiiiuacióii:
--
Para fijar el texto que usted quiere preseiitar iiiicialnieiite en la barra
de estado, use el inétodo insertItem de la clase KStatusBar. Éste
toma conio primer argumento el texto que usted quiere presentar y
coiiio segundo argiiiilento un identificador. Para cambiar el iiiensaje de
la barra de estado, eiriplee la f~inciónchangeItem.
- - -
mytoolhar->;iddConn~cticin(D,~ I G N ~ u c thfs,
~ O S) L,O T ( m v ~ x i f 0
Prueba de repaso
¿Qué función utilizaría para crear un elemento en un
menú?3
- -
3 ín\~wItc~111
4 Una función iiiieinbro en un objcto, diseñada para qiie se ejecute cuando el objeto recibe
iina señal especificada.
ramación en Linux
w wq-w "
.
"
=
e
Paso a paso
1. Cree el archivo de cabecera hel1owin.h que mantendrá la definición
de clase de la clase Hellowin.
2. Incluya archivos de cabecera que contengan definiciones de clase
para objetos, tales como ventanas, botones y cuadros de mensaje.
En este caso, incluya el archivo de cabecera para la ventana princi-
pal, ktmainwindow.h; para un botón use qpushbutt0n.h y para un
cuadro de mensaje, kmsgb0x.h.
3. Defina la clase Hellowin a partir de la clase KTMainwindow. La
clase Hellowin deberá tener dos slots (funciones) llamadas myhello
y myexit. Defina varios apuntadores para objetos KDE, incluidos
apuntadores para botones (buttonhi y buttonExit), un apuntador
para una barra de menú (mymenubar), un apuntador para un
menú (filemenu), un apuntador para una barra de herramientas
(mytoolbar) y un apuntador para una barra de estado
(mystatusbar). La clase también necesita contener una función
constructora quase ejecuta cuando se define (Hellowin) y una
función para terminar el programa (closeEvent).
4. El archivo hellowin.cpp contendrá las definiciones de función para la
clase Hellowin. Incluya archivos de cabecera y el archivo
hellowin.moc, el cual debe generar por separado el preprocesador
MOC.
5. Defina una función constructora para la clase Hellowin,
Hellowin::Hellowin. Cuando se define un objeto de esa clase, esta
función se ejecutará automáticamente.
6. En la función constructora, cree un objeto de barra de herramientas
usando la clase KToolBar. Después, haga una imagen del mapa de
pixeles que sea accesible para usarla en la barra de herramientas.
Cree un objeto KlconLoader con un apuntador myloader que
contenga su dirección. Luego, con la función loadlcon en ese
objeto cargue una imagen (stamp.xpm) en un objeto QPixmap,
llamado hellopic.
7. Cree un botón en la barra de herramientas mytoolbar con la ima-
gen stamp.xpm que se encuentra en hellopic. El texto para el botón
debe ser "Hello window".
8. En la función addconnection del objeto mytoolbar asocie un clic
del ratón (clicked) con el slot myhello de la clase Hellowin y el
primer botón de la barra de herramientas (stamp.xpm).
9. Otra imagen, llamada exit.xpm, se coloca entonces en el objeto
exitpicQPixmap. Con esta imagen cree otro botón en la barra de
herramientas con el rótulo "Exit program". La función
addconnection se asocia con una señal clicked y la función
myexit, la cual sacará el programa.
10. Ponga la barra de herramientas como flotante, o de libre ubicación,
y agréguela al objeto Hellowin con la función addToolBar.
11. Defina una barra de estado y asigne la dirección al apuntador
mystatusbar. lnserte un mensaje simple: "My hello program".
12. Cree un objeto de menú con QPopupMenu y asigne su dirección
al apuntador filemenu. lnserte dos elementos, uno con el rótulo
"Hello" y el otro con "Exit". Subraye la "H" en el elemento Hello y
la "x" en el elemento Exit.
13. Cree una barra de menú llamada mymenubar. lnserte en ella el
objeto de menú filemenu y póngale el rótulo "FILE".
14. Defina la función close~vent,la cual llama a kapp->quit para
terminar el programa
15. Defina la función myhello para la clase Hellowin y establezca que
presente en pantalla un cuadro de mensaje separado con el mensaje
"Hello World".
16. Defina la función myexit para la clase Hellowin y configúrela para
cerrar la ventana Hellowin.
17. Cree el archivo main.cpp, el cual incluirá la función principal del
programa. Comience por incluir archivos de cabecera y el archivo
hellowin.moc, el cual tiene que generar por separado el
preprocesador MOC.
18. En la función principal, defina una KApplication llamada myapp.
Cree un objeto Hellowin con el nombre mywin, llamando al mismo
tiempo su función constructora Hellowin. Determine el tamaño del
objeto.
396 1 Fundamentos de programación en Linux
- - - -
Hello Worldl
Iviy hello program
T*
7
wl +-k***&* tfe 1 1 OW'i 2 ,-, h'c"-*TTtT*T**k**'*>-*-k/--
i b i n c l ude <kapp. 6?
# i n c l u d e <ktmaitiwindow. h >
#i ncl u d < ~ q p u s h b u t t o n . h>
# b i n c l u d ~<kmenubar.hy
# i n c l u d ~( k t o o l b a r . h>
j b i n c l ude < k s t a t u s b a i . h>
# i n c l ude <qpopuprnenu. h>
n y s t a t u s b a i = new K S t a t u s B a r ( t h i s 1 ;
n y s t a t u s b a r - > i n s e r t I t e i i i I " Y v tiel l o r;rugram", O ) :
j e t S t a t u s l a r (m::statusbar);
nystatusbar->:hok!í 1:
void Hellowin::niyhe?ioO
1
KMsgBox: :message(O,"World Message","He1lo World! "1 ;
1
void Hel1owin::niyexitO
[
clase( 1 ;
t
Este es el código para el archivo main.c:
- -- -
-ap JiY -
jkinclude <ktmainwindow.h>
#incl ude "he1 lowin2. h"
int main( int argc, char **argv
I
KApplication myapp( argc. a r g v , "Hello World!" 1 ;
Hellowin *mywin = new H e l l o w i n O :
mywin->setGeometry(l00,100,200,100):
myapp.setMainWidget( mywin 1;
mywin->showO;,
myapp.exec0;
return O ;
1
7 l T " C Z ~mnc ~ ~ .
-L$KDEDIR/lib -1kdecore -1kdeui -iqt
g++
-o hellowin2 rna1n.o hell~~ih!inZ.o
hellowin2.0: hellowin2.cpp
g++ -c -I/$KDEDIR/include -I/$QTDIRlinclude he1 li~b~in.cpp
i-Nota --
Observe que el archivo MOC se crea con una entrada a los archivos
de cabecera en el makefile.
Programación
Eii Id actualid~d,I W E se basa clircctaiilerite e n Q t Toolkit. Uwiido sólo
objetos d e Q t , ustcd puede crear una interfaz con una opcióil de ver y
x n t i r siiiiilar a KIIE. Usted puede crear iiii,i aplicaci0i-i Q t . e i n p l e ~ n d o
hiicaniente objetos y librerías dc Qt. Esta seccióii ofi-ccc u i ~ ii-itroduc-
i
ción básica para la pi-ograiiiación en Q t . E11 developer.kde.org y
www.trol.com se encuentra docuiiieiltacibil i-iiuy detallada y tiitoria-
les sobre pro~;i-aili~~~ióii en Qt. Es recoilieildablc que coiisulte estas
detcill~dade pi-ogr~iiiaci6i-ieii Qt y
f~ientcsp'ir<l ~ 1 1 1 ~prewi~t~icibil
1
rcferciici,i~API.
Aplicaciones Qt
U n progr;iim en Qt es 1111 programa eii C++. Las librerías de Qt
ofreccn definicioiles aiilplias d e clases Qt con las cuales usted puede
dcfiiiir objetos de Qt en su progrnnin Qt.T.in1bién puede usar estai
5
clases para crear las suyas propias, hcredaiido las capacidades predcfii-ii-
das d e sus padres. La tabla 10-3 preseiita un listado de los widgcts de
liso iiiás coiriíin en Qt.
Widget Descripción
QCheckBox Un cuadro de verificación con u n rótulo de texto.
QComboBox Una combinación de b o t ó n y lista de presentación
contextual.
QFrame La clase base d e widgets q u e puede tener u n
marco.
QLabel U n rótulo que presenta en pantalla u n texto está-
tico o u n mapa d e pixeles. #
Programación en Qt
En la actualidad, KDE se basa directamente en Qt Toolkit. Usando sólo
objetos de Qt, usted puede crear una interfaz con una opción de ver y
sentir similar a KDE. Usted puede crear una aplicación Qt, empleando
únicamente objetos y librerías de Qt. Esta sección ofrece una iritroduc-
ción básica para la progran~aciónen Qt. En developer.kde.org y
www.trol.com se encuentra documentación muy detallada y tutoria-
les sobre programación en Q t . Es recomendable que consulte estas
fuentes para una presentación detallada de prograniación en Q t y
referencias API.
Aplicaciones Qt
U n programa en Q t es un programa en C++. Las librerías de Q t
ofrecen definiciones amplias de clases Qt con las cuales usted puede
-
definir objetos de Q t en su programa Qt.Tanibit.n puede usar estas
clases para crear las suyas propias, heredando las capacidades predefini-
das de sus padres. La tabla 10-3 presenta un listado de los widgets de
uso niás común en Qt.
Widget Descripción
QCheckBox Un cuadro de verificación con un rótulo de texto.
QComboBox Una combinación de botón y lista de presentación
contextual.
QFrame La clase base de widgets que puede tener un
marco.
QLabel Un rótulo que presenta en pantalla un texto está-
tico o un mapa de pixeles. s
Widget Descripción
QListView Una vista de lista/árbol.
QMainWindow Una ventana de aplicación típica, con una barra de
menú, algunas barras de herramientas y una barra
de estado.
QMenuBar Una barra de menú horizontal.
QPopupMenu Un widget de menú contextual.
QProgressBar Una barra de avance horizontal.
QPushButton Un botón de presión con un rótulo de texto o de
mapa de pixeles.
QRadioButton Un botón excluyente con un rótulo de texto.
QScrollBar Una barra de desplazamiento vertical u horizontal.
QSizeCrip Una casilla en la esquina para ajustar el tamaño de
una ventana de alto nivel.
QSlider Un deslizador vertical u horizontal.
QStatusBar Una barra horizontal ajustable para presentar men-
sajes de estado.
QTextBrowser Un programa de navegación con bastante texto
y navegación simple.
QTextView Un visualizador de texto sofisticado, con muchas
opciones de formato en una sola página.
Una barra de herramientas simple.
-
Tabla 10-3 Widgets comunes de Qt (coritinrrnción)
Para crear una aplicación eii Qt, iisted tieiic que def i-iir L I I I objeto
QApplication.Todas las aplicaciones dcbcii contar por lo iiiciios coi1
iin objeto Q A p p l i c a t i o n que sc Lisa para adiiiiiiistrar características de
la aplicación, coiiio la Fiieiitc y el cursor. Para incluir la declaracicíii dc
clase de Q A p p l i c a t i o n en su prograiiia, sólo necesita iiicluir cl progra-
lila p p p l i d o r r . h.
- - . u - - -- - = - -- - - . -
myapp.exec0;
return O :
Capítulo 10: KDE
- --
1
w n c i u d e < q a p p l i c a t i o n . h>
.
# i n c l ude q p u s h b u t t o n . h.
Señales y slots de Qt
Por tradición, las cajas de herraiiiientas dc GUI utilizan 1111 tipo de
evento que activa las f~iilcionesd e retrollaiiiado. Ciiando ocurre uri
evento, se ejecuta sil f~iiiciónd e retrollarnado asociada.
Q t reeiilplaza este niétodo con uri sistema de seíiales y slots. El
proceso dc activación del evento se vuelve a formular como u n proce-
so de coinuiiicación de i~l'ensajeentre dos objetos. Dado que son
siinpleinente meiisajes de comiinicación, las seiiales y los slots piiedeii
ser niuy fiiertes y pueden tonlar un variado número dc arguiileiitos de
diferentes tipos; usted puede conectar cualquier cantidad de seíiales al
inismo slot. Las seíiales y los slots se piicdeii iisar en cualquier clase que
se herede de la clase Qobject, coino es el caso de Qwidget. Cualquier
objeto piicde coiitener señales para enviar mensajes y slots para
recibirlos.
Cuando se presenta iin evento e n u11 widget, eiiiitirá iiria señal. Eso
es todo lo que hace. N o configura una conexión hacia otro objeto.
Para poder recibir un iiieiisaje d e una señal, un objeto debe contar con
iin slot, el cual es simpleniente una fiinción inieinbro que se ejecuta
cuando el objeto i-ecibe una sehal. Desde el piinto de vista conceptual,
los slots se usan para obtener inforinacióil acerca de Lin cainbio en
404 1 F u n d a m e n t o s d e p r o g r a m a c i ó n en L i n u x
-- -
otros o-jctos. Un slot iio sabe si cvi ic:iliJnd hay algiiiia seiinl c.oiicctacia
:i él y 1111<1sefial iio s ~ b si c hay algíiii slot qiie Iri reciba.
Usted iitiliza la fiinc-ióii connect para configurar una coiicsióii
entre uiia seiinl en u i ~ol?jeto y i i i i slot en otro. l'iiccie coiicctar tai.it;is
sciiales cwiiio qiiiern hacia 1111 iiiisiiio slot y iina sciial st. puede conectar
a ciialcliiier cantidad dc slots.Todos los objetos tienen seiiales para
eiiviar iiicnsajcs y slots para recibirlos. Las fiiiicioiies connect coiifigii-
i-ai-iii una c u i c s i ó i i eiitrc dos objetos, c o i i ~ c t a n d oiiiia sena1 d e iiiio
c o n uii slot e n otro.
Eii el sigiiieiite cjciiiplo, la seli;il cliclted para cl objeto mybutton
csti coiicxtada 31 slot quit del objeto myapp:
Herencia en objetos
Usted coiistruye una interfaz eri Qt usando objetos que pone en
estructuras jerárquicas, con objetos iilenores que depeiideii d e un
objeto iiiayor. Por ejeinplo, una ventana sería 1111objeto mayor que, a su
vez, tendría objetos menores, como iiienús, barras de herrainieritas y
barras deslizadoras dependientes de ella. El objeto mayor es el padre y
los objetos nienores son sus 11iJos.Cuando iisted crea uii widget mayor,
conio eii el caso de una ventana, tan-ibién puede crear widgets menores
de barras de herraiiiieritas, para unirlos a la ventana. Puede hacer esto
convirtiendo al widget ineiior -coiiio eii el caso de una barra de
herrailiieiitas- en un hijo de un widget iilayor (como la ventana). U n
widget hiJo p ~ ~ e daesu
, vez, ser padre de sus propios widgets hijos. Al
construir una interfaz, usted pone los widgets en una estructura jerrír-
qiiica de widgets padres y sus hijos.
Para crear un widget coiiiplejo, como una veiltaila coi1 sus hijos
depuidientes, usted primero define el widget padre. Ilespués, cuando
define un widget que desea que sea un hijo de ese padre, pone la
dirección del widget padre conio un arguilieilto en la definición dcl
widget.
En el siguiente ejeiiiplo se define un widget de l>otón con el i i o n -
bre quit y se le convierte eri hijo de un cvidget d e ventana. Ahora, el
widget d e ventaiia induye el widget botón. Observe que el operador
& se usa para obtener la dirección del widget padre.
Click M~A
-
Ventana y botón en Qt
i
U A r ~ p li c , i i [ C I ~ Ir,i,;~p~~( afile, ~ji.gy ) ;
+fn;wi11, = 1 1 ~ ~W
~I'!,J~I~,\/~II~~II~:I : ~ai~~!~i~i~ow:
í1Pu:IiBiittnn m,!l?iitto~i! " C i i ~ - kMe", m w i n ) :
Widgets de distribución
C o n los widgets de distribución usted puede ubicar ficilmente los
widgets hijos (coino botones o testo) en u n widget padre (como una
~ ~ - i t a n a ) . A d e n idel
á s posicionaniento, los widgets de distribución
ofrecen tamaños predeterminados, ajuste de tamaíío y actualización de
la presentación en pantalla d e los widgets. Hay disponibilidad de varios
widgets del tipo ficil d e usar. QHBox sitúa los widgets en una fila
horizontal, QVBox los ubica verticalmente en una columna y QGrid
los pone en una tabla. Para lograr un control más preciso, puede utilizar
QGridLayout, QHBoxLayou t y QVBoxLayout.
408 1
- Fundamentos de programación en Linux
Prueba de repaso
¿Se puede crear una interfaz de usuario con la barra de
herramientas de Qt únicamente?'
0 ¿En qué clase de relación están organizados los widgets
de un programa en Qt?'
5 Sí.
6 Jerárquicaniente. padre-hijo.
. --
Capitulo 10: KDE
-
1-
409
--
c l a s s -MyWi-dgift -:-p u b l i c OWidget
(
pub1 i c :
MyWidget( QWidget *parent=O, c o n s t c h a r *narne=O 1:
1;
k f i i d g e t : : ~ . ~ b J f d ~ eOWidget
t( *parent. c o n s t c h a r *name
: QWidget( p a r e n t , n a m e 1
Cuadros de diálogo
Para crear L I cuadro
~ de diilogo simple, usted puede usar el widget
QMessageBox y, entonces, p ~ i e d egenerar cuadros d e diálogo con
diferentes características empleando las f~inciones(métodos) niienibro
QMessageBox. Por ejeiiiplo, si sólo desea presentar en pantalla 1111
mensaje, sin recibir ning~inainformación por parte del ~isuario,enton-
ces puede utilizar la fiincióii about del widget QMessageBox. Senci-
Ilaiiieiite, tome el objeto padre, el tít~ilodel inensaje y el inei~sajecoino
los al-gumentos. Usted p ~ i e d eusar secuencias de escape para nuevas
líneas y tabiilaciones: \n y \t.
412
7
1 Fundamentos de programación en Linux
, .
Ca~ítulo1: Introducción
I
a la programación en Linux
l . ;Cuáles ton lai cuatro categorías geiicrales de la prograiiiacióii e11
Liii~ix?
Lenguajes de programación de shell, lenguajes de alto nivel,
programación para interfaces gráficas de usuario (GUl) y progra-
mación estándar utilizando llamados al sistema.
3. ¿(:óino podríci Icer los .u-giiiiieiitos cle u11 script, lino a uno,
proc.esxicdo iiiio a la vcz?
Emplee la estructura for con una lista vacía. Automáticamente
leerá los argumentos que el usuario ingresó.
4. ~ Q L
c oI~ i~i ~ i i dpodi-í.1
o 115.1i' para dctcctai- ~iitoniríticailiciitr
opcioiicj qiic sc I-iay~iliiigreiado en la línea de coiiiandos?
Utilice un comando if, como se muestra abajo, con una prueba
para verificar si el valor de $# es cero. $# es el número de argu-
mentos que el usuario ingresó.
if [ $11 e q O 1
t h f:r i
e c h o No a r q u m e r i t r e n t e r e d
ixil; 1
fi
5. ;Su p r o ~ r a ~podría
n ~ cjcciitar a1gíii-i coiii~iidodcspi1í.s de qiic cl
iisiiL1riolo tci-iiiiric con la coiiibinacibii CTl<L-C?
Sí; usted puede atrapar este evento con el comando trap y des-
pués obtener una lista de los comandos que quiere ejecutar
cuando ocurra el evento. En el siguiente ejemplo se atrapa el
evento CTRL-C (2) y se ejecuta un comando echo para presentar
en pantalla un mensaje seguido por un comando exit para termi-
nar el programa.
tr,al:, ' e c t i o " G o o t l b y e " ; e x i t l. ' 2
Capítulo 4: Programación
del shell TCSH
1. (Jiií: coinaiido se utiliza para leer la eiitrada en 1111script del
shell TCSH?
Llame el shell TCSH al comienzo del script con el siguiente códi-
go. No olvide que todos los scripts del shell TCSH deben tener un
símbolo # en la primera columna de la primera línea del script.
Apéndice A: Respuestas a las evaluaciones [-
421
Capítulo 5: GAWK
1. ¿Se pueden usar espresiones reg~ilaresen las espresiones de
prueba?
Sí.
2. ;Cuál es la diferencia entre los símbolos -, = e = =?
- verifica un patrón en un campo; = se usa para asignar valores a
las variables; = = es una prueba d e comparación que se utiliza en
estructuras d e control para probar la igualdad.
3. ¿Para trabajar con qué clase de arreglos está disellad,i la estructura
dc control for-in?
Con arreglos asociativos.
4. ~ Q Lf~inción
I ~ podría utilizar para asignar cada palabra en un;i
oración a un eleiilento presente en un arreglo en una operación
siniplc?
La función split.
5. ¿Cuál variable especial de GAWK utilizaría para crear una opera-
ción GAWK que presentara desde la cuarta hasta la ukptinia Iínca
de un archivo?
Emplee la variable NR (el número del registro actual) con el
operador coma (,) y especifique los números del rango al comien-
zo y al final del registro, como en NR==l, NR==3 para los regis-
tros 1, 2 y 3.
Capítulo 6: Perl
1. iCiiálei son loi iíniboloi que se utilizan para leer la entrada de
~ i narchivo?
Ponga el nombre del archivo entre los signos < y >.
2. Si un coiiiando print 110 tieiie argiimento, ?hay algún resultado?
El resultado es el contenido d e la variable $-, usualmente el
registro actual que se ha leído.
Apéndice A: Respuestas a las evaluaciones
-.
5. 2Cóino p ~ ~ e encontrClr
de cuilei son las cadenas q u e se usan para
el índice d e u n arreglo asociativo?
Con la función keys.
Capítulo 8: Tk
1. ;Los objetos griíficos dc Tk están organizados jeriírqiiicaii~ciitc!
Sí.
2. il'iiede utilizar coiiiaiidos Tcl para controlar operacioiies en T k ?
Sí. Las funciones Tk están diseñadas para llamarlas desde un script
Tcl.
Capítulo 9: GNOME
1. ¿Cómo llama usted las librerías d e G N O M E cuando compila un
programa en G N O M E ? ¿ C ó m o lo hace con los programas en
GTK?
Para CNOME usted emplea el programa gnome-config con las
opciones - - cflags y - -Lbs:
KDE, 373
shell UASH, 50-52,617-68,7840 barra invertida (\)
Tcl, 276,283 l W , 204
5
tree, 357 shell BASH, 43-44
argv, aiguinento, 376,401 shell TCSH, 43-44
argv, m-eglo Tk, 301
Perl, 226 barra vertical ( l), 42, 59, 145,265
ihell TCSH, 101- 108 buras de desplazaiiiiento, 307,312
Tcl, 258 barras de e\tado, 39 1-393
al-gv,coiiiando, 283 barra\ de herrariiientai
argv, variable, 258,346 GNOME, 360-361
argv0, variable, 258 KDE, 39 l-399,406
array, comando, 256,257 UASH, progr,iinaciói~del shell,
arreglos 33-9 1
escalarei, 210,212-214,216 drgmmitos, 50-52.67-68,78-80
especiales, 258 ayuda en línea, 7
GAWK, 167-168,174 bucles, 73-84
I'erl, 207-2 17,226 condicioiies, 66-73
Índice 1 433
constantes, 5 1 bucles
descripción, 7-8,22,34-35 de Perl, 221-228
estructiiras de control, 61-91 de Tcl, 266,275-280
herramientas de prograniación, do-until, 22 1
34 GAWK, 175-177,178,180-181
operaciones aritmtticas, 58-60 $he11 BASH, 73-84
operador de asignación, 41 shell TCSH, 125-1 35
operar scripts en shells diferentes, bucles infinitos
39-40 shell BASH, 80-8 1
permisos, 36-40 shell TCSH, 131-132
scripts ( I ~ WBASH, scripts del button, comando, 295,299,311
shell) Button, widget, 296
variables, 41 -50,5556
variables de entorno, 55-56
UEGIN, patrón, 162-1 63
Uell Labs, 18, 19
Uerkeley Software Ilistribution. Vénsa C++, código, 382
1JSl-1 C++, l e i i g ~ ~ ~6,j 7,
e , 12- 13
binary, con~ando,287 C + + , modelo de objetos en, 372
bind, con~ando,296,304-306 C++, programa de, 330
bindtags, coiiiando, 296 C , lenguaje, 6,7, 18, 112,164,249
botones C, programa en, 12,329
GNOME,360-361 C-shell, 22
KDE, 385-389,406-407 cadenai
Tk, 295,296,299,311 . coniparación de, 03
Bouriie Again shell. Ví.riie UASH de signos, 42-44
Bouriie, shell, 22 GAWK, 150, 168,169
break, coiiiando Perl, 200-203,214,236
I'erl, 227 sliell BASH, 42-46
sliell BASH, 80-81 Tcl, 255,286-288
sliell TCSH, 131-132 Caldera OpenLinux. Vénse
Tcl, 266,279-280 OpenLinux
breaksw, palabra clave, 116,121, cariipos, 146
122-1 23 canvas de GNOME, 367-369
BSII (Berkeley Software Canvas, widget, 296
Distribution), 19 caracteres, 42-46
BSD de UNIX, 19
434 1 Fundamentos de programación
- en Linux
Tcl, 249 N
Mandrake Liiiiis, distribucióii, 28
nianejador(es), 341
NAWK, 140
de archivos, Perl, 192-199
ne operador, 203-204
de directorio, 232
new, operacióii, 390
nulo de archivos (<>), 196
newfile, función, 410
riianejo dc archivos, coiiTcl,
nest, comando, 227
280-285
iiext, enunciado, 180
inarcos,Tk, 3 14-31 5
NF, variable, 149
matti, li breria, 340
Novell UnixWare, 20
nlcnu, widgets, 296,351-357
NK, variable, 149-1 50, 157, 163
nienubuttoii, widget, 296
nueva línea, carácter de, 252
iiienú(s)
nLiiri, variable, 174
GNOME, 351 -362
iiíimeros de las seíiales, 91
icoiios de G N O M E para,
360-361
KlIE, 389-399
niacroi del, 354-355
selecciones de, 31 4
okjetoi de GNOME, 3.5 1-353
shell UASH, 72
OFS, variable, 149
Message, widget, 296
OMFT, v'iriablc, 140
nietacaracteres, 7 3
Open Groiip, consorcio, 23
Minis. 20
Open Software Foundation (OSF),
ilikdir, coi-iiando, 233
19-20
M O C (coinpilador de ii~etaobjetos),
open, coniando
382-384,404
Perl, 193, 196. 198,220
niodificador de ubicación de
Tcl, 266, 280, 281
decinialcs, 158
Opeii-Look, 20
Motif, protocolo, 20, 328,329
OpenLinus, 26
MULTICS (MULTiplesed
operacibn
Iiiforriiation Coniputing Systeiil),
each, 216
18
iiiy, 24 1 , 244
nidtitarea, 13
pop, 212,213
iriiiltiiis~~ario,caractcrístic:is de. 15
p~ish,2 12, 213
iiiyfuiic, fiinción, 343
iiiiihifi, 2 12, 213
inyobj, objeto, 384
opcrnciones aritiiiCticas
ináquiiias l>owerl>C,27
GAWK, 164-167
- Fundamentos de programación
442
- en Linux
.---