Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
l Introducción
l DOS vs UNIX
l Estructura de los comandos
l Lista de comandos
l Acceso al sistema
l Accesos remotos
l Variables de entorno
l Comillas y mas comillas
l Sistemas de archivos
l Procesos
l Programación de tareas
l Tuberías y redirecciones
l Expresiones Regulares
l Estamentos
l Variables especiales
l Shell scripts
l Editor vi
l Sed
l Awk
l CGI’s
l Versiones de UNIX
Un sistema operativo es la parte software encargada de gestionar los recursos hardware del
sistema y proporciona la base sobre la que se pueden escribir programas de aplicación. Entre las
funciones típicas de un Sistema Operativo, se pueden destacar:
l Gestión de la memoria
l Control de las operaciones de Entrada y Salida
l Tratamiento de Interrupciones
l Control del Sistema
l Establecimiento de prioridades y ejecución de procesos
Como ejemplos de sistemas operativos tenemos DOS, OS2, UNIX, MVS, etc.
El hardware solo se puede controlar a través de ceros y unos. Esto resulta complicado de
manejar para cualquier usuario. Para simplificar estas tareas los ordenadores equipan en memoria ROM
(solo lectura) una serie de instrucciones, de 50 a 300, en ensamblador (jump, move, add, etc.) que se
traducen directamente a código binario.
Una de las funciones principales de un sistema operativo es ocultar toda la complejidad que
existe por debajo y proporcionar al programador un conjunto de instrucciones fáciles de usar.
Por encima del sistema operativo se encuentran aplicaciones y programas, que utilizan los
servicios proporcionados por el sistema operativo. Como ejemplos de aplicaciones nos encontramos con
Windows, PowerPoint, cualquier juego, etc.
Los ordenadores los podemos clasificar según su potencia de menor a mayor en:
Los comandos se pueden definir como programas que acompañan al sistema operativo sin
formar parte de él, y que están diseñados para trabajar con los demás comandos o con el kernel (o
núcleo) de UNIX.
UNIX, por otro lado, es multitarea, permite la ejecución de varios procesos simultáneamente, sin
haber finalizado la ejecución de los mismos. Esto se hace dividiendo el tiempo en porciones que se
asignan a los procesos activos, los cuales se encuentran almacenados en una cola.
DOS no se adapta a cada hardware, mientras que UNIX si, aunque será necesario recompilar el
núcleo o Kernel. Esto hace que UNIX sea transportable, que se pueda instalar en máquinas con
hardware muy diferente, con solo unas modificaciones mínimas.
El kernel de UNIX se debe recompilar cada vez que se añada un disco, se modifiquen
parámetros del sistema, se modifiquen los sistemas de archivos de swap o root, o los dispositivos de
consola entre otros. El tiempo necesario para la recompilación dependerá de la potencia del sistema, de
la cantidad de dispositivos que tenga incorporados, etc., pero no suele ser un tiempo excesivo. En
cualquiera de los casos, el sistema operativo se adapta al hardware existente en la máquina en cada
momento. La recompilación puede realizarse manualmente o automáticamente, dependiendo del
desarrollador y de la versión de UNIX que se tenga.
En DOS en cambio, cada vez que se añade algún hardware nuevo, habrá que instalar los drivers
necesarios para el funcionamiento del dispositivo, como un parche o programa residente en memoria.
Las máquinas DOS en general son menos potentes que las máquinas UNIX, si bien es posible
encontrar UNIX en máquinas DOS (Linux).
Las máquinas que funcionan con DOS han de ser reiniciadas mucho más frecuentemente que
las máquinas UNIX, si bien es cierto que el tiempo necesario para ello es muy inferior.
En UNIX una unidad lógica o partición puede ocupar varios discos duros o parte de ellos,
mientras que en DOS cada unidad lógica puede ocupar como mucho un disco, y hasta hace poco tiempo
no podía gestionar unidades superiores a 512 MB.
DOS exige, al usuario, unos conocimientos menores que UNIX, así como unas menores tareas
de administración, lo cual lo hace ideal para el público en general. Además dada la gran aceptación que
ha tenido, existe una gran cantidad de programas y utilidades que hacen aun más sencillo el manejo del
ordenador.
Las opciones son modificadores del comando, que pueden hacer que solo presente una
información determinada o que la presente de una u otra forma. El prefijo utilizado en UNIX para las
opciones, generalmente, es el “-“, aunque también se pueden encontrar casos con “+”. En DOS el prefijo
usado para las opciones es “/”. No debe existir espacio entre el prefijo y la opción. Un prefijo puede ser
válido para varias opciones simultáneamente.
Los argumentos indican al comando sobre qué se debe ejecutar la acción, por ejemplo el nombre
de archivo, usuario, etc. Los argumentos no llevan prefijo lo cual sirve para diferenciarlos de las
opciones.
En general, se podrán usar varias opciones simultáneamente, al igual que varios argumentos, si
bien será necesario consultar la documentación o la ayuda de cada comando, para conocer las opciones
y argumentos posibles.
Ejemplo:
Se pueden ejecutar varios comandos desde una misma línea de comandos, para ello habrá que
separarlos mediante el carácter punto y coma “;”.
Para que la salida de un comando se pueda utilizar como entrada del siguiente habrá que utilizar
lo que se denomina redirecciones, y merecen un tratamiento diferente.
Tanto el login como la password pueden contener letras como números algunos caracteres de
puntuación, etc., y en ocasiones tienen limitado su tamaño entre un mínimo y un máximo (normalmente 6
como mínimo y 8 como máximo).
Cada usuario tiene asignado un directorio de trabajo. Varios usuarios pueden tener asignado el
mismo directorio de trabajo, aunque no es lo común.
Así mismo cada usuario tiene asignado un tipo de shell o interprete de comandos. Entre los tipos
de shell más conocidos tenemos ksh, csh, sh, bash, rsh, tcsh, etc.. La diferencia entre ellas estriba en las
utilidades que aportan al usuario, como recuperación de comandos, variables de entorno, etc.. Si un
usuario, en lugar de un interprete de comandos tuviera asignado un programa, cada vez que accediera al
sistema, solo podría ejecutar ese programa o aplicación, y abandonaría el sistema cada vez que
finalizara dicho programa.
Una vez comprobada la validez del acceso, el sistema ejecuta una serie de acciones, detalladas
en el profile general del sistema (/etc/profile por lo general), y que son generales para todos los usuarios.
Entre las acciones principales se pueden destacar:
l Visualización de los archivos de copyright y motd (mensajes que el administrador ponga para
información de los usuarios).
l Establecimiento del TIMEZONE o huso horario.
l Indicación de la existencia de correo.
l Indicación de la hora actual, y de la hora del último acceso.
l Indicación sobre si se ha excedido de un umbral en la ocupación de espacio en disco.
l Establecimiento de algunas variables de entorno (PATH, LOGNAME, etc.).
Una vez ejecutado el profile general, podrá ejecutarse el profile ( .profile ) particular de cada
usuario, con el cual se completará la definición del entorno del usuario Entre las acciones que se
pueden encontrar en este archivo destacan:
Es posible acceder de una máquina a otra siempre y cuando exista un camino físico por el que
hacerlo, un cable directo, una red, etc.
Para que un usuario de un sistema determinado pueda acceder a un sistema remoto será
necesario que tenga una cuenta de usuario en dicho sistema, y que los accesos remotos estén
permitidos.
Para acceder a un sistema habrá que conocer su dirección IP (AAA.BBB.CCC.DDD, donde cada
uno de los 4 valores tomará valores entre 0 y 255) y/o nombre.
Una forma de conocer si un sistema es accesible es mediante el comando ping, mediante el cual
el sistema local envía mensajes al sistema remoto y espera respuesta. Si se recibe respuesta, no se
pierde ningún paquete, es que el sistema está accesible.
ping [DIR-IP]
Para saber si un sistema es accesible por su nombre se puede consultar el archivo /etc/hosts en
el que se identifican los nombres de los sistemas con su dirección IP.
Existen diferentes comandos para acceder a sistemas remotos, entre los que destacan:
Así mismo existen comandos para transferencia de archivos de un sistema a otro sin necesidad
de establecer una sesión directamente en el sistema remoto, entre los que destacan:
También se puede enviar y recibir correo de usuarios de otros sistemas, para ello, habrá que
indicar el nombre del usuario de destino y el nombre del sistema, con una nomenclatura como la usada
en Internet:
usuario@host
Por motivos de seguridad, cada vez que se intenta acceder a un sistema se pedirá login y
password. Existe la posibilidad de que no se pida, cuando se ejecute rlogin, rcp o remsh, y consiste en
generar un archivo, bajo el directorio de usuario de la máquina remota, llamado .rhost, en el que se
especifica los hosts o sistemas y usuarios que pueden acceder como el usuario propietario de dicho
directorio. Los nombres de sistemas definidos deben coincidir con los definidos en el archivo
/etc/hosts.equiv . Esto es útil sobre todo cuando el nombre de usuario coincide en los dos sistemas. Si
el nombre de usuario fuera diferente, habría que especificar en el comando de conexión el nombre del
usuario del sistema remoto para evitar la petición de password.
Se pueden habilitar o inhabilitar usuario y/o sistemas con los signos “+” y “-“.
Las variables de entorno, como su nombre indica son variables, pueden ser diferentes para cada
usuario, y permiten personalizar el entorno UNIX a gusto del usuario.
Por lo general, parece que por convenio, en UNIX las variables de entorno se escriben en
mayúsculas (no hay nada que impida que vayan en minúsculas, salvo evitar confusiones con comandos).
Las llamadas a las variables de entorno se realizan anteponiendo el signo “$” al nombre de la variable
($HOME, $PS1, etc.). Las variables de entorno no pueden contener el carácter “$” ni espacios, salvo en
el valor, siempre y cuando este se presente entrecomillado.
En UNIX existen unas variables de entorno básicas, que son necesarias para que el usuario
pueda trabajar adecuadamente. Además, tanto el propio usuario como algunos programas que este
ejecute, pueden generar nuevas variables de entorno. Podemos así distinguir entre variables de entorno
generales y variables de entorno particulares.
Las variables de entorno generales difieren poco, en cuanto a nombre se refiere, entre los
distintos sistemas UNIX, y expresan lo mismo en cada sistema.
NOMBRE=valor
Y si se desea exportar esta variable, para que sea visible fuera del programa, habrá que hacer:
export NOMBRE
o
export NOMBRE=valor
echo $NOMBRE
l EDITOR : Variable que almacena el editor que usará el usuario por defecto.
l ENV : Variable que almacena el archivo en donde el usuario ha definido sus aliases y funciones.
l HOME : Variable que almacena el directorio del usuario, desde el que arrancará la shell cuando
entra en el sistema.
l HOSTNAME : Variable que almacena el nombre de la máquina.
l LOGNAME : Variable que almacena el nombre o login del usuario.
l MAIL : Variable que almacena el archivo que contiene el correo de usuario.
l MAILCHECK : Variable que indica cada cuantos segundos debe comprobarse si el usuario tiene
correo.
l PATH : Variable en la que se encuentran almacenados los paths de aquellos directorios a los
que el usuario tiene acceso directo, pudiendo ejecutar comandos o programas ubicados en ellos
sin necesidad de acceder a dicho directorio.
l PS1 : Variable que almacena el prompt que se empleará por defecto en la shell.
l PS2, PS3, etc. : Variable que almacena el prompt que se empleara en la 2ª, 3ª, etc. Subshells,
lo cual se hace invocando a la shell, es decir, ejecutando por ejemplo, ksh.
l PWD : Variable que almacena el directorio actual, puede ser útil para modificar el prompt (PS1)
dinámicamente.
l SHELL : Variable que almacena el interprete de comandos que usa el usuario.
l TERM : Variable que almacena el tipo de terminal desde el que se está trabajando.
l TMOUT : Variable que almacena el tiempo de inactividad que se permite al usuario antes de que
el sistema le cierre la sesión.
Por ejemplo:
A = ‘cat prueba’
B = “cat prueba”
C = ´cat prueba´
Al teclear:
echo $A
aparecerá el mensaje:
cat prueba
echo $B
Pero al teclear:
echo $C
for i in “a b c d e f g”
do
Lo que sea
done
for i in ´ls´
do
Lo que sea
done
Este segundo caso presenta la ventaja de ser independiente de los archivos que existan en el
directorio, pues se recogerá cualquier modificación que se dé en dicho directorio, mientras que en el
primer caso, el bucle se ceñirá a los archivos especificados, si no existen dará error, y si se genera
alguno nuevo no se tendrá en cuenta.
Un sistema de archivos es equivalente a una unidad lógica en MSDOS, pero mientras en DOS
se referencia automáticamente con una unidad (por ejemplo c:), en UNIX es necesario montarla (hacerla
accesible). Montar un sistema de archivos consiste en asignar un directorio, o punto de montaje, a la
unidad lógica. El montaje de un sistema de archivos se realiza con el comando mount, y el desmontaje
con el comando umount. Ambas tareas solo son realizables, en principio, por root.
Mientras en DOS una unidad lógica no puede extenderse más allá de la unidad física, es decir,
no puede ser mayor que la unidad física, en UNIX si puede extenderse a varias unidades físicas, si bien
esto depende de la versión de UNIX que se tenga cargada.
En UNIX existe una estructura de directorios que difiere poco de un sistema a otro. Entre los
directorios más comunes tenemos:
En UNIX cualquier dispositivo se trata como un archivo. Un terminal tiene asociado un archivo, y
por tanto si se escribe algo en ese archivo, aparecerá por el terminal. Lo mismo sucede con las
impresoras, módem, etc..
Para acceder a un directorio se puede utilizar el path o camino relativo o absoluto. El path
absoluto se referencia al directorio raíz, por lo que siempre comenzará por el carácter “/” indicativo del
En UNIX los archivos tienen permisos para el usuario, para el grupo del usuario y para el resto
de usuarios. Con esto se puede hacer que un archivo sea accesible para un determinado usuario, o
grupo de usuarios, que solo pueda modificarlo un usuario, etc. Los permisos de un archivo se indican
con 10 caracteres se asignan con números:
Al ejecutar el comando “ls –l” nos aparecerá al principio de cada línea una información del tipo:
El primer carácter hace referencia al tipo de archivo. El primer grupo rwx hace referencia al
usuario propietario del archivo. El segundo grupo corresponde a los usuarios que pertenecen al mismo
grupo que el propietario. El tercero pertenece al resto de usuarios. Root tiene acceso ilimitado a todos los
archivos, aunque no tengan activado ningún permiso. Si aparece la letra indica que está permitido ese
permiso, y si aparece un guión indica que está prohibido.
l - : archivo normal
l b : archivo controlador de dispositivo orientado a bloques
l c : archivo controlador de dispositivo orientado a caracteres
l d : directorio
l l : enlace simbólico
Dará permiso de lectura, escritura y ejecución para el propietario, de lectura y ejecución para el
grupo de usuarios al que pertenezca el propietario, y ningún permiso para el resto de usuarios.
Para cambiar el propietario de un archivo se utiliza el comando chown (change owner) y para
cambiar el grupo del usuario chgrp (change group):
chown fulanito[:grupo] archivo hace que fulanito pase a ser el propietario de archivo. También se
puede modificar el grupo al que pertenecerá el programa.
chgrp users archivo hace que el grupo users sea considerado como grupo del
propietario
l s (Bit s): Hace que cualquier usuario que ejecute el programa adquiera la identidad del
propietario durante la ejecución. (4000). También se puede hacer que el usuario que lo ejecute
pase a ser del grupo del propietario durante la ejecución (2000).
l t (Sticky bit): Hace que el programa se lea la primera vez de disco, y quede residente en
memoria, con lo que la próxima vez que se ejecute se cargará más rápidamente (1000).
l Los enlaces físicos son una copia del archivo, pero cada modificación que se haga en un archivo
se actualizará en el otro, el contenido del archivo no se perderá hasta que no se borren todos los
enlaces. Los enlaces que se generan con el comando ln, por defecto son físicos.
l Los enlaces simbólicos, en realidad son accesos directos al archivo (denominación usada en
Windows 9X), y si se borra el archivo queda el enlace referido a un archivo inexistente. Para ello
la opción a utilizar con el comando ln es –s.
El multiproceso da origen a las políticas de bloqueo, según las cuales se pueden bloquear
recursos con el fin de evitar problemas. ¿Qué sucede si dos usuarios editan el mismo archivo? Solo se
salvarán los cambios realizados por el usuario que lo salvó en último lugar. El problema es más crítico en
el caso de acceso a bases de datos, escritura en disco, etc..
l Código
l Datos
l Pila
l Registro
l Información general
La shell o intérprete de comandos es un programa o proceso que lee los comandos introducidos
por el usuario y genera los procesos hijo necesarios para ejecutar dicho comando, creándose un árbol de
procesos. Cada proceso tiene asociado un número, denominado pid (identificador de proceso), así como
la identidad y grupo del usuario que lo está ejecutando (uid y gid, respectivamente).
Todo proceso, excepto el proceso raíz (el que tiene pid 0), tiene un proceso padre, que se puede
definir como el proceso desde el cual se lanza el proceso hijo. Cuando finaliza un proceso padre y los
hijos no finalizan adecuadamente, estos quedan activos, pero adoptando como padre al proceso raíz (el
de pid 0). Estos procesos se denominan zombies.
Cada vez que se ejecuta un proceso no se retorna a la shell hasta que este no finalice, salvo que
el proceso se ejecute en segundo plano o background, lo cual se realiza posponiendo el carácter “&”
después de la línea de comando. En caso de ejecutar procesos en background, es conveniente redirigir
las salidas hacia alguna variable de entorno o archivo con el fin de que la salida del comando no
interfiera con las acciones del usuario. El número de programas que se pueden lanzar en background
dependerá de los permisos del usuario, así como de los parámetros configurados para cada UNIX. Cada
vez que se lanza un comando en background el sistema devuelve un número que indica el pid del
proceso.
proceso &
Para matar o finalizar la ejecución de un proceso que se está ejecutando en background habrá
que utilizar el comando kill:
Donde señal indica el mensaje a enviar al proceso (puede variar entre 1 y 15) y pid es el
identificador del proceso que devolvió el sistema cuando se lanzó el proceso.
Los demonios son procesos que arrancan cuando se inicializa el sistema y no finalizan nunca,
salvo que se les envíe una señal de finalización, la cual, en circunstancias normales no se envía más
que cuando se va a parar el sistema.
Son procesos, que solo root puede matar o inicializar. Generalmente solo los inicializará
manualmente en caso de que se realice alguna modificación en los archivos de configuración que lo
exija, para que se vuelvan a leer los parámetros de ejecución, o en caso de algún problema.
l cron : Responsable de las tareas programadas por los usuarios vía crontab.
l getty : Responsable de la gestión de terminales para accesos al sistema, etc.
l inetd : Responsable de los servicios de internet (conexión a otros sistemas).
l init : Responsable de la ejecución de procesos.
l lp : Responsable del manejo de impresoras.
l mail : Responsable de la gestión del correo.
l xntpd : Responsable del intercambio de mensajes con otros sistemas para sincronización
horaria.
Para visualizar los procesos activos en un sistema se puede utilizar el comando ps:
ps [opciones]
l Tiempo necesario para tirar y levantar el sistema, y las diferentes aplicaciones que corren en él.
No se puede apagar del mismo modo que un PC(los cuales, con el nacimiento de Windows se
van aproximando a los sistemas UNIX).
l Estabilidad del software, mientras que DOS exigía reiniciar el PC con asiduidad, UNIX podía
estar corriendo meses sin reiniciar el sistema. También aquí DOS y Windows parecen que van
mejorando poco a poco.
Si el sistema está funcionando cuando el usuario no está delante del sistema. ¿Por qué no dejar
alguna tarea programada, para que cuando llegue al día siguiente tenga menos trabajo que hacer?. Aquí
es donde surge el tema de la programación de tareas.
Para programar tareas es conveniente utilizar los periodos de menos carga del sistema, sobre
todo si se trata de tareas que consuman bastantes recursos. Es conveniente programarlas a las horas en
que menos usuarios haya conectados al sistema, con el fin de que los que estén conectados noten lo
menos posible la ejecución de dichas tareas. Para ello, lo ideal es contactar con el administrador del
sistema, quien debe conocer la carga del sistema en cada momento, y quien puede permitir o denegar la
programación de tareas a un usuario.
Entre las tareas típicas que se ejecutan en modo programado habitualmente, se pueden
destacar:
l Backup incrementales
l Volcado de datos hacia históricos
l Limpieza de archivos
l Ejecución de informes diarios
l Gestión de los accounting (datos sobre cargas del sistema, conexiones de usuarios, comandos
ejecutados, etc.)
La diferencia entre ellos estriba en que mientras con el comando at se programa la ejecución de
una tarea para un momento determinado, mediante el cron se pueden programar por días de la semana,
hora, mes, etc..
El cron en realidad es un demonio (programa que esta siempre en ejecución) que lee y realiza
las tareas programadas por los usuarios en un archivo. Cada usuario tendrá su archivo cron, y existirá
una copia del mismo en el directorio /var/spool/cron/crontabs (el directorio puede variar según el
sistema), que es de donde en realidad lo lee el demonio.
En general pueden existir los siguientes archivos, en los que el administrador autoriza o
desautoriza la programación de tareas a los usuarios introduciendo el login en ellos:
l at.deny
l at.allow
l cron.deny
l cron.allow
La estructura de estos archivos es muy sencilla, tan solo hay que incluir el nombre del usuario en
el archivo correspondiente para permitirle o denegarle la posibilidad de ejecución de tareas
programadas.
Un usuario podrá programar tareas si aparece el archivo .allow, si este archivo no existe podrá
programar tareas siempre y cuando no aparezca en el .deny. Si el archivo .deny está vacio, todos los
usuarios pueden ejecutar tareas programadas, y si no existe ninguno, únicamente root podrá programar
tareas. Es decir, el archivo .allow tiene preferencia ante el .deny.
Para activar y/o desactivar la ejecución de comandos vía cron se utiliza el comando crontab.
A continuación se muestra un ejemplo de cómo deben ser las líneas incluidas en el archivo en
que se programan las tareas a ejecutar vía cron:
mm hh dd MM ss Comandos
donde:
mm : Minuto dentro de la hora (0-59)
hh : Hora del día (0-23)
dd : Día del mes (1-31)
MM : Mes del año (1-12)
ss : Día de la semana (0-6, Domingo=0)
Cuando cualquiera de los campos se marca con un “*” se quiere indicar que esa línea se debe
ejecutar para cada valor del campo (cada minuto, cada hora, etc.). En caso de especificar varios valores
dentro de un campo se deben separar con comas “,” y si se quieren especificar rangos, se deben separar
con guiones "-".
Las líneas que comienzan por “#” no se ejecutarán, se entenderá que se trata de un comentario.
Se debe tener cuidado a la hora de programar tareas vía cron con las variables de entorno, pues
cron, por defecto toma unos valores estándar, por lo que cualquier modificación debe especificarse en la
línea de comandos o en un shell script que sea invocado en la línea de comandos.
En caso de que dos usuarios tengan un cron en el que coincidan, a la misma hora, los mismos
programas, se pueden producir resultados inesperados si se actúa sobre los mismos archivos.
Por defecto, la salida estándar y el error estándar están direccionados hacia la pantalla del
terminal, y la entrada estándar corresponde al teclado. Pero en ocasiones puede ser que no nos interese
que la información salga en pantalla, si no que nos interesa filtrarla o redireccionarla a un archivo para
guardar la información o para un tratamiento posterior, o que la entrada a un programa sea el resultado
de la ejecución de otro. Con este fin los sistemas operativos permiten la utilización de tuberías y
redirecciones.
l >: La salida se envía al archivo especificado, borrando el contenido que hubiera en él (si
existiera).
l >>: La salida se añade al contenido del archivo especificado. No se borra el contenido de dicho
archivo, y si no existe se crea.
l |: La salida estándar se emplea como entrada del comando especificado a continuación. Este se
conoce como pipe o tuberías.
Ejemplos:
l <: Se usa el contenido del archivo especificado a continuación como entrada estándar del
comando especificado delante del símbolo “<”.
Ejemplo:
Enviará el contenido del archivo mensaje, vía correo electrónico al usuario pepe.
Para fusionar la salida estándar y la salida de errores se puede hacer usando 2>&1.
Existen metacaracteres, que son caracteres que en una expresión regular son interpretados por
su significado especial, y no por los caracteres que normalmente representan. Para utilizar el carácter
que representan habrá que anteponerles el carácter Back Slash (\). Entre estos caracteres tenemos:
\ * ? | + ^ $ . ( ) [ ] { }
Para buscar un rango de caracteres se pueden expresar entre corchetes ([ ]), usando comas (,),
para expresar listas de valores, o guiones (-) ,para expresar rangos de valores, como separadores. En
este caso algunos metacaracteres pierden su valor y pasan a representar el propio carácter.
Por ejemplo:
variable = valor
l TEST: Prueba si es cierta una condición, devolviendo TRUE (0) o FALSE (1):
test [condición]
l IF: Si condicional. Si la condición que se prueba es cierta se realiza una acción o acciones, y si
es falsa se realizan otras.
if [ condición ]
then
acción
else
otra acción
fi
l CASE: En caso de que una variable tome un valor hacer una acción, en caso de que tome otro
otra, etc. Equivale a varios if anidados.
case variable in
valor_1) acción 1;
acción 2;;
valor_2) acción 3;;
*) acción n;;
esac
while [ condición ]
do
acción
done
Until [ condición ]
do
acción
done
for i in lista
do
acción
done
l FUNCIONES: Se emplean para realizar tareas que tengan cierta entidad por si solas y que se
ejecuten más de una vez. Permiten reutilizar código y ahorrar líneas de programa, a la vez que
reducen el tamaño del programa. Se declaran del siguiente modo:
function nombre ()
{
acciones;
}
nombre ()
{
acciones;
}
Para llamarlas solo habrá que utilizar su nombre seguido de los posibles argumentos (como si se
llamara a un programa más):
Una función puede llamar a otras funciones o programas, o llamarse a si misma (recursividad).
En el caso de usar funciones que se llamen a si mismas, o funciones recursivas, hay que tener especial
cuidado con las condiciones de salida, con el fin de no entrar en un bucle infinito.
VARIABLES ESPECIALES
En UNIX existen unas variables especiales que pueden resultar útiles para conocer detalles
sobre programas ejecutados, argumentos, etc.. Estas variables dependen de la shell utilizada, en el caso
de ksh podemos destacar:
Para realizar una shell script en condiciones, al igual que para realizar un programa en cualquier
lenguaje de programación, es necesario tener claro lo que se quiere obtener y de que situación se parte.
Es mejor perder un poco de tiempo en realizar un desarrollo mental del programa que dedicarse a teclear
y probar cosas, pues lo más seguro es que no se consiga el objetivo, y si se consigue la estructura del
programa no será la adecuada.
Una de las ventajas que presentan los shell scripts es que pueden ser portadas de una máquina
UNIX a otra sin problemas, sin necesidad de retocar nada, salvo que se utilicen llamadas a programas
muy concretos específicos de una versión de UNIX, mientras que los programas compilados
(desarrollados en C, Pascal, etc.) deben ser recompilados, pues el código se generará en función del
microprocesador de cada máquina. Otra ventaja es la facilidad de lectura e interpretación.
Se deben añadir comentarios con el fin de facilitar la lectura del programa. Los comentarios se insertan
anteponiendo el carácter “#” al comentario, que se extenderá hasta el final de la línea.
Los scripts suelen encabezarse con comentarios que indican el nombre de archivo y lo que hace
el script. Se colocan comentarios de documentación en diferentes partes del script para mejorar la
comprensión y facilitar el mantenimiento. Un caso especial es el uso de # en la primera línea, seguido del
carácter admiración y el path de la subshell, para indicar el intérprete con que se ejecutará el script:
#!/bin/ksh
Es interesante saber que muchos comandos devuelven un valor después de ejecutarse, y que
este valor indicará si la ejecución ha sido buena o si ha habido algún fallo y que tipo de fallo se ha
producido. Para conocer si un comando devuelve o no un valor y qué es lo que devuelve en cada caso
se deberá consultar la documentación, pero por lo general en caso de una ejecución correcta devolverán
el valor 0, y en caso de fallo otro numero, positivo o negativo.
Para poder ejecutar un archivo de comandos es necesario que tenga activados, al menos, los
permisos de lectura y ejecución.
A continuación vamos a ver unos ejemplos, comenzando por cosas muy sencillas.
SUBSHELL.
Directorio actual /home/jagar
Cambiando directorio en el subshell...
Ahora en directorio /etc
Ejemplo 2:
# Programa que muestra la hora del sistema cada segundo durante 1 minuto
Cont=0
while [$Cont –le 60 ]
do
date
Cont=`expr $Cont + 1`
sleep 1
done
case $AYER in
-1) echo “Sabado”;;
0) echo “Domingo”;; # date +%w devuelve el día de la semana
1) echo “Lunes”;; # en formato numerico, con valores
2) echo “Martes”;; # comprendidos entre 0 (domingo) y 6
3) echo “Miercoles”;; # (sabado). En nuestro caso, ayer tomara
4) echo “Jueves”;; # valores entre –1 y 5.
5) echo “Viernes”;;
*) echo “un dia raro, pues no existe”;;
esac
Ejemplo 4:
#!/bin/ksh
# Programa que pide al usuario que introduzca una cadena de caracteres y
# la muestra, por pantalla del derecho y del revés.
#
echo “Introduce una cadena: \c”
read NOMBRE
LONGITUD=`echo $NOMBRE | wc –c`
while [ $LONGITUD –gt 0 ]
do
NOMBREALREVES=”$NOMBREALREVES”`echo $NOMBRE | cut –c$LONGITUD`
LONGITUD=`expr $LONGITUD – 1`
done
echo “\n$NOMBRE\n$NOMBREALREVES”
#!/bin/ksh
# Programa que simula una papelera de reciclaje, mediante el cual en lugar de
# borrar un archivo, lo que hace es guardarlo en un subdirectorio, con el fin
# de evitar borrados accidentales.
#
if [ $# -gt 0 ]
then
for i in $*
do
echo “Moviendo $i al directorio $HOME/borrados”
if [ `mv $i $HOME/borrados 2>/dev/null` ¡= 0 ]
then
echo “Error, no se puede mover $i”
fi
done
else
echo “Error: hay que especificar argumentos”
echo “$0 archivo1 [archivo2] ...”
return 1
fi
return 0
Ejemplo 6:
# Lo que sea
# Fin del programa
#
# La funcion hora se encarga de pedir la hora al sistema especificado,
# filtrarla y mostrarla por pantalla.
#
hora()
{
hora=`telnet $1 daytime 2> /dev/null | grep ":" `
echo "$hora -----> $1"
}
#
#Comprobar si el sistema esta accesible, y si lo esta, anadirlo a la variable
#SISTEMAS, que sera la que contiene los sistemas accesibles.
#
#
#Esperar a que finalice la ejecucion de todas las tareas en background.
#
wait
#
#Fin de programa
#
En UNIX existen otros editores más potentes, con entornos de trabajo más amigables, otros más
sencillos de manejar, pero el único editor que está en todas las versiones y se maneja igual es el vi.
La sintaxis del comando vi es, al igual que la de cualquier comando UNIX:
vi [opciones] archivo
Esc :
Modo Modo Modo
Texto Comando ex
<Comando> Una vez
ejecutado el
comando
Con algunos comandos, especialmente more y a veces vi, el terminal o el emulador que se está
usando pueden no responder bien, que no aparezcan los cambios que se realizan correctamente en la
pantalla. En estos casos, puede usarse Ctrl-l para refrescar la pantalla.
Un usuario puede generar bajo su directorio $HOME un archivo llamado .exrc, en el que podrá
adaptar el entorno del editor vi a su gusto. En este archivo se pueden incluir:
l Opciones set
set [opcion[=valor]]
l Abreviaturas ab
ab [abr] [cadena]
l Macros map.
map [Key|#n] [acción]
donde:
l Key : expresa una letra especial (no utilizada en vi). Por ejemplo v, V, q, K, Ctrl-A, etc. Las
teclas correspondientes a las flechas se pueden definir como macros si es que no se encuentran
definidas por defecto.
l n : expresa un número
l acción : es un comando de vi, teniendo en cuenta que antes de teclear un Escape o Return, o
cualquier carácter de control hay que teclear Ctrl-v.
Tanto las opciones, como las abreviaturas y macros se pueden definir en modo ex para la
edición en curso, pero solo tendrán valor durante la edición actual, no siendo válidas para las siguientes
llamadas al comando vi. Por ello, para que afecte a cualquier llamada del comando vi, será necesario
insertarlas en el archivo .exrc.
Otros
BS (Back Space) Borrar carácter hacia la izquierda.
ESC Salir de Modo Texto y pasar a modo comando.
Búsqueda
/str Buscar hacia adelante cadena de caracteres 'str'.
?str Buscar hacia atrás cadena de caracteres 'str'.
n Buscar siguiente (si se usó /) o anterior (si se usó ?).
N Buscar anterior (si se usó /) o siguiente (si se usó ?).
fc Buscar el siguiente carácter 'c' en la línea.
Fc Buscar el anterior carácter 'c' en la línea.
tc Ir al carácter anterior al siguiente 'c'.
Tc Ir al carácter posterior al precedente 'c'.
; Repetir el último comando f, F, t, o T.
, Último comando f, F, t, o T en sentido inverso.
La acción de f, F, t y T alcanza sólo a la línea actual; si el carácter buscado no está en esa línea
el cursor no se mueve.
Otros
ZZ Grabar cambios si los hubo y salir.
u Deshacer última acción.
U Deshacer todos los cambios en una línea desde que se posicionó el cursor en ella.
. Repetir el último comando.
Generales
Mover
:1 Mueve a línea 1.
:15 Mueve a línea 15.
:$ Mueve a última línea.
Otros
:[desde],[hasta] s/[buscar]/[reemplazar]/ Reemplaza todas la primera ocurrencia de la
cadena [buscar], en cada línea, por la
cadena [reemplazar] entre las líneas [desde]
y [hasta] del archivo.
Sed es un editor de texto que acepta como entrada un archivo, lo lee y modifica línea a línea
mostrando el resultado en pantalla. Posee muchas características de ed y ex. La sintaxis general del
comando sed es:
sed [-n] [-e‘script’] [–f archivo] archivo1 archivo2 ...
donde:
– n : indica que se suprima la salida estándar.
– e : indica que se ejecute el script que viene a continuación. Si no se emplea la opción –f se
puede omitir –e.
– f : indica que los comandos se tomarán de un archivo
Un script consiste en uno o varios comandos del editor (uno por línea) con la siguiente
estructura:
[inicio[,fin]] funcion [argumentos]
donde inicio y fin hacen referencia a las líneas (número de línea) afectadas (o intervalo de líneas),
función hace referencia al comando de editor a aplicar y argumentos hace referencia a los argumentos
necesarios para la ejecución de la función.
Para expresar los comandos en varias líneas, al final de cada línea se debe añadir el carácter
backslash (\) antes de pulsar el Return y aparecerá un prompt con el símbolo mayor que (>).
Ejemplos:
sed ‘1,$ s/[a-z]/[A-Z]/g’ archivo Cambia todas las minúsculas a mayúsculas de archivo.
sed ‘a\Linea insertada’ archivo Añade una línea con el contenido “Línea insertada”
después de cada línea del archivo.
sed ‘1,$ s/^[[\[0-9]m//g \ Elimina todas las secuencias de Escape del tipo Xm y Zm
que se suelen usar para letras en negrita, etc. para
1,$ s/^[[\[0-9]w//g \ terminales vt100 y cambia el formato de los saltos de
línea, de un archivo almacenando los resultados en un
1,$ s/^M/^J/g’ archivo > archivo nuevo.
archivo.nuevo
Introducción
El nombre awk proviene de las iniciales de sus desarrolladores: Alfred V. Aho, Brian W.
Kerningan y Peter J. Weinberger, de los Laboratorios Bell de AT&T. Inicialmente se desarrolló para
escribir programas muy cortos, pero las características de este atrajo a los usuarios de tal modo, que lo
impulsó más allá de la idea original de los autores. En 1985 apareció una nueva versión llamada nawk,
en la que se implementan características nuevas como son:
• Funciones de usuario.
• Expresiones regulares dinámicas con sustitución de texto.
• Mayor número de funciones intrínsecas y variables.
• Nuevos operadores y estamentos.
• Entrada de múltiples archivos.
• Acceso a argumentos en la línea de comandos.
• Mejora de los mensajes de error.
awk es un lenguaje de búsqueda y procesamiento de patrones. Esto quiere decir que awk es
capaz de buscar un patrón dentro de un archivo (al igual que grep) y tratarlo según unas operaciones
determinadas. Con awk se pueden desarrollar auténticos programas.
Según esto awk es capaz de procesar un archivo con datos organizados por columnas y generar
nuevas columnas con los valores resultantes de realizar ciertos cálculos u operaciones.
A diferencia de comandos Unix como grep y sed, que filtran y procesan texto, awk incorpora su
propio lenguaje de programación, siendo capaz de ofrecer operaciones aritméticas, relaciones lógicas y
variables. Se pueden desarrollar programas con awk que procesen la entrada estándar o un archivo,
realizando tareas como tratar archivos de texto como bases de datos. El lenguaje de programación awk
incluye estamentos como for, while e if-else, así como un conjunto de funciones y variables incorporadas.
Sintaxis
La sintaxis de awk es:
donde:
l archivo_programa : especifica el archivo fuente del programa a aplicar a archivo.
l c : especifica el carácter delimitador de campos. Por defecto se considera el espacio en blanco.
l programa : especifica el conjunto de patrones e instrucciones a ejecutar con archivo. La
diferencia con archivo_programa, es que en este caso hay que especificar los patrones e
instrucciones en la línea de comandos. Para evitar interferencias con la shell deben ir
encerradas entre comillas simples (‘).
l variable=valor : se utiliza para establecer los valores que tomarán las variables que utilice el
programa.
l archivo : archivo que será procesado por awk. Si se especifica “-“ se interpretará como la
entrada estándar.
Campos y Variables
Una línea de entrada se divide en campos separados por espacios, y cada campo se denomina
como $1, $2, etc. $0 indica la línea entera. . Estas variables se pueden manipular (sumar, cambiar, etc.)
como cualquier otra varible, por ejemplo:
Sumará los campos 2 y 3 en el campo 1, e imprimirá el nuevo registro (la línea completa).
En los programas de awk no es necesario declarar las variables (indicar el tipo de variable de
que se trata), se realizará automáticamente en función del contexto. Por defecto se inicializan a la
cadena nula o valor numérico 0, por lo que no es necesario inicializarlas.
Existen unas variables predefinidas, que pueden ser utilizadas dentro del programa:
• FS : Separador del campo de entrada. Se puede especificar con la opción -Fc en la línea de
comandos
• RS : Separador de registro de entrada
• OFS : Separador del campo de salida.
• ORS : Separador de registro de salida
• NF : Número de campos en el registro actual
• NR : Número de registros procesados hasta el momento. Al final del programa se podrá
conocer el número e registros tratados.
• RSTART : Posición de la cadena en la que se verifica el patrón utilizado, comenzando desde
1. Es equivalente al valor retornado por la función match.
• RLENGTH : Longitud de la cadena en la que se verifica el patrón utilizado.
• SUBSEP : Separador de cadenas en arrays multidimensionales. El valor por defecto es " 34".
Los valores de las variables relativas a separadores se pueden modificar en cualquier momento,
asignándole el valor de cualquier carácter. Por defecto, los separadores de campos son espacios, y los
de registros el carácter nueva línea.
Patrón { acción }
Interpretación:
• Para cada línea que verifique lo especificado en el patrón, se ejecutará la acción indicada.
• La acción siempre va encerrada entre llaves.
• Se pueden especificar varias acciones, separándolas por ";" o por el carácter nueva línea.
Si no se especifica la acción, se mostrarán por pantalla aquellas líneas que contengan el patrón.
La acción está formada por estamentos (if, for, print, sprintf, next), los cuales deben finalizar en “;”,
Nueva Línea o llaves. Dentro de las acciones se pueden realizar operaciones matemáticas, de
concatenación, etc. Las variables utilizadas pueden ser escalares, campos o tablas, y son inicializadas a
la cadena nula.
Los patrones deben ir rodeados por caracteres “/”, y puede contener dos patrones separados por
una coma, en cuyo caso la acción se realizará para aquellas líneas comprendidas entre la primera
aparición del primer patrón y la siguiente aparición del segundo patrón. Si se utiliza el símbolo “~”,
indicará que el patrón de la derecha está contenido en el campo de la izquierda, y si se utiliza “!~”,
indicará que no está contenido.
BEGIN { acción }
Patrón { acción }
END { acción }
Operaciones
Un programa awk puede hacer operaciones en coma flotante, utilizando los siguientes
operadores:
system(cmd) Ejecuta el comando UNIX cmd especificado y retorna el estado de salida de este.
print e1, e2, ... Presenta en la salida los valores e1, e2, ...
printf f, e1, e2, ... Presenta en la salida los valores e1, e2, ... con el formato especificado por f.
Los parámetros se pasan por valor si son escalares y por referencia si se pasa el nombre del array. Los
parámetros son locales, mientras que el resto de las variables son globales. Las funciones pueden
llamarse de forma recursiva.
Ejemplos
Ejemplos de patrones
Ejemplos de acciones
END { print "La suma es ", s, Suma el primer campo de todos los registros e imprime los
"La media es ", s/NR campos 2 y 1 (en ese orden).
Al final imprime el total y la media.
Ejemplos
ls –l | awk ‘\txt\ { print &8 }’ - Imprime los archivos que contengan como propietario,
nombre, grupo, etc. la cadena txt. El símbolo “-“ indica
que el archivo es la entrada estándar.
awk ‘\cadena\ { cont=cont+$2 ; print $2 Busca cadena en archivo y en una variable llamada
“\t” cont }’ cont=0 archivo cont (contador) va sumando los valores del campo 2 e
imprimiendo dicho campo, un tabulador y el valor del
contador. Al final de la salida tendremos la suma total
de los valores que ha tenido cadena en el campo 2.
Awk ‘$2>0 { print $1,” “, $2 }’ archivo Para cada línea de archivo, si el 2º campo es positivo,
imprime los dos primeros campos.
Awk ‘$2>0 { printf “%s %d\n”,$1,$2 }’ Idem que el caso anterior, suponiendo que el primer
archivo campo es una cadena de caracteres.
El nombre CGI proviene del inglés Common Gateway Interface, y vienen a ser programas
escritos en cualquier lenguaje que añaden una mayor funcionalidad a las paginas Web. Son programas
que se ejecutan en el servidor, no en la máquina cliente como sucede con los javascript.
Antes de continuar debo decir que para entender lo que voy a comentar es necesario tener
algunas nociones, aunque sean mínimas de lenguaje HTML.
Un cgi permite construir por ejemplo una página web dinámicamente, tratar los datos de un
formulario, o realizar determinadas tareas en la máquina servidor.
El motivo de hablar aquí de cgi's es debido a la posibilidad de construirlos en shell script. Hay
lenguajes más potentes y flexibles como perl, python, C, VisualBasic, Java, etc. (que se salen del ámbito
de este curso), pero el caso que nos incumbe es que se pueden construir en shell script. Tampoco voy a
dar una clase magistral sobre el tema, pues no soy ni mucho menos un experto, pero si puedo dar unas
pequeñas ideas a aquellos a los que les ha resultado útil el curso. Si tienes instalado Linux (no sé si trae
servidor web con la instalación) y quieres montar un servidor web, puedes descargarte el Apache desde
http://www.apache.org (venias con la intención de aprender un poco de UNIX y al final acabas montando
un servidor web. Ya es un aliciente). Si tienes Windows, puedes encontrar también allí una versión
especifica para Windows, pero evidentemente los cgi que vamos a desarrollar aquí no te funcionaran,
pero tendrás un servidor web bajo Windows. No es complicado configurar el Apache para las tareas
básicas, pero hay que leerse las instrucciones que por desgracia vienen en inglés.
Al construir un cgi con comandos UNIX tenemos toda la flexibilidad que dicho sistema
operativo nos proporciona. Además podemos utilizar programas realizados en otros lenguajes dentro del
propio shell script o cgi.
Lo mejor para entender un cgi creo que es mostrar un ejemplo como el siguiente, en el que
construiremos una pagina web titulada prueba en la que aparezca un mensaje.
#!/usr/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Página Web para probar el primer
CGI</title></head>"
echo "<body bgcolor=yellow>"
echo "<H2>PRUEBA CGI</H2>"
echo "<font face=\'Arial, Helvetica\' size=2>"
echo "<p align=\'center\'>Esta página se ha creado con mi
primer CGI</p>"
echo "</font></body>"
echo "</html>"
Este ejemplo, salvo errores en las comillas deberia funcionar. Este mismo cgi en C seria:
#include <stdio.h>
main()
{
printf("Content-type: text/html\n");
printf("\n");
printf("<html><head>”);
printf(“<title>Página para probar el primer
CGI</title></head>");
printf"<body bgcolor=yellow>");
printf("<H2>PRUEBA CGI</H2>");
printf("<font face=\'Arial, Helvetica\' size=2>");
Como se puede ver un cgi se puede escribir en cualquier lenguaje. Antes de seguir adelante,
he de avisar de que para que funciones el CGI debe tener permisos de ejecución, por lo que habrá que
hacer un chmod:
Es conveniente ponerle la extensión cgi a los archivos de dicho tipo, para evitar por un lado
confusiones a la hora de manipularlos y por otro para evitar errores de funcionamiento. Podemos
observar que en todo cgi las dos primeras líneas de la página que se genere deben ser:
en donde la primera línea especifica el tipo de contenido de la página. Existen diferentes tipos, los cuales
no vamos a comentar.
Un ejemplo tipico de CGI es un contador de visitas de una pagina web. Aqui vamos a usar el
mismo ejemplo de antes, y mostrar el valor del contador, que se supone que guardaremos en un archivo
llamado contador.txt (el nuevo código insertado va en cursiva), le incrementamos el valor en 1 (la visita
que acabamos de realizar al visualizar la página) y guardamos el nuevo valor en el mismo archivo,
sobreescribiendolo. Ojo, hay que crear el archivo contador.txt con un valor determinado. Si tras dos
pruebas no se incrementa el contador, dale permiso de escritura al archivo (suele ser algo que se olvida
fácilmente):
#!/usr/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Página Web para probar el primer
CGI</title></head>"
echo "<body bgcolor=yellow>"
echo "<H2>PRUEBA CGI</H2>"
echo "<font face=\'Arial, Helvetica\' size=2>"
echo "<p align=\'center\'>Esta página se ha creado con mi
primer CGI</p>"
echo "<p>Eres el visitante número: "
CONTADOR=`cat contador.txt`
CONTADOR=`expr $CONTADOR + 1`
echo $CONTADOR > contador.txt
echo "$CONTADOR</p>"
echo "</font></body>"
echo " </html>"
Con lo visto hasta aquí podemos decir que un cgi es un shell script en el que la salida por
pantalla se presenta en formato HTML. Las operaciones que se realizan dentro del cgi son idénticas a
las realizadas con un shell script normal, pudiendo hacer llamadas a programas desarrollados en otros
lenguajes, utilizando herramientas como awk, sed, etc. A modo de ejemplo, implementaremos el caso
anterior con awk.
Si la página fuera estática,como sucede en la realidad, habría que llamar al cgi desde la
propia pagina:
....
</p>Eres el visitante Número:
<IMG SRC=\"archivo.cgi?parametro1=valor1¶metro2=valor2&...\"
alt=\'Contador\'></p>
.....
Hasta el momento hemos visto cgi's a los que se llamaría sin pasarle parámetros. Pero normal
es que cuando llamemos a un cgi sea para mostrar una página o realizar una tarea en función de unos
datos suministrados a través de un formulario por ejemplo. Sin quererlo acabamos de ver como se
realiza una llamada al cgi pasándole parámetros. Los parametros se pasan en una cadena, que habrá
que tratar para separar los diferentes parámetros que le lleguen, lo cual podremos hacer con programas
construidos especificamente para ello (en C por ejemplo) o utilizando algo que hemos aprendido en este
curso, el editor sed. Los parametros dentro del cgi estarán dentro de unas variables de entorno, llamadas
QUERY_STRING y CONTENT_LENGTH. El uso de QUERY_STRING o CONTENT_LENGTH
dependerá del modo en que se envía la información. Existen dos formas de enviar la información: GET y
POST. Si se utiliza el método GET habrá que emplear QUERY_STRING, y si se emplea el método
POST habrá que emplear CONTENT_LENGTH. Si se emplea el método GET la información no puede
superar un cierto tamaño (1 kb), mientras que si se emplea el método POST no existe dicha limitación,
pues se toma la información de la entrada estándar (stdin). El usar uno u otro método se especificará a la
hora de definir la acción a ejecutar con la información del formulario.
Para más información sobre el tema, es conveniente consultar cualquier manual o tutorial
sobre HTML.
En el siguiente ejemplo, vemos como se pueden obtener los parametros que se pasan al cgi,
para poder trabajar con ellos.
if [ $1 ]
then
cadena=$1
else
cadena=`head -c -n$CONTENT_LENGTH`
fi
variable1=`echo $cadena | awk -F "&" '{ print $1 }' | awk -F "=" '{
print $2 }'`
variable2=`echo $cadena | awk -F "&" '{ print $2 }' | awk -F "=" '{
print $2 }'`
variable3=`echo $cadena | awk -F "&" '{ print $3 }' | awk -F "=" '{
print $2 }'`
Otro ejemplo:
#!/usr/bin/sh
if [ $1 ]
then
cadena=$1
else
cadena=`head -c -n$CONTENT_LENGTH | sed 's/%2B/+/g
s/%2F/\//g
s/%3A/:/g'`
fi
# Tratamiento de los argumentos recibidos para utilizarlos en el cgi
Variable1=`echo $cadena | awk '{
if (index($0,cadena1)>0)
print valor1}'`
Variable2=`echo $cadena | awk '{
if (index($0,cadena2)>0)
print valor2}'`
Variable3=`echo $cadena | awk '{
if (index($0,cadena3)>0)
print valor3}'`
...
#!/usr/bin/sh
cadena=`echo $QUERY_STRING | cut -c7-200 | sed '1,$ s/+/|/g'`
echo Content-type: text/html
echo ""
...
Una vez que hemos recibido los parámetros necesarios, tan solo hay que procesarlos, y en
función de los mismos construir la página adecuada.
Creo que con lo visto hasta aquí nos podemos hacer una idea de como construir un cgi, para
profundizar más es conveniente acudir a documentación de lenguaje HTML y cgi´s. Una dirección que
puede resultar útil es http://www.w3.org/. El lenguaje a emplear dependerá por un lado de los lenguajes
que soporte el servidor, de la facilidad para implementar lo que deseamos construir, y como no, de
nuestras preferencias.
Fabricante /
Producto Descripción Web
Creador
LINUX Es un clon de Unix escrito desde cero por Linus
Torvalds, con asistencia de otros muchos hackers
en la red que soporta el software de libre
Linus
distribución de GNU. Tiene todas las http://www.Linux.org
Torvalds
características que se encuentran en sus
parientes comerciales y otras muchas, incluyendo
soporte para ejecución nativa de binarios Java.
FreeBSD (versión 2.0) es un sistema operativo de
tipo Unix basado en la versión 4.2BSD-Lite de
UCB para plataforma i386. También se encuentra
basado aunque indirectamente en el sistema
386BSD de William Jolitz. Dada su similitud con
NetBSD aplazaremos la discusión de sus
Universidad
FreeBSD características hasta el próximo apartado. No http://www.FreeBSD.org
Berkeley
obstante diremos que es un sistema
extensivamente utilizado tanto en empresas como
en entornos domésticos. Su software de red es
excelente como revela el hecho que empresas
dedicadas a comunicaciones entre ordenadores lo
utilicen como plataforma básica.
El proyecto NetBSD ha surgido como resultado
del esfuerzo de un gran número de personas que
tienen como meta producir un sistema operativo
tipo Unix accesible y libremente distribuible.
Universidad NetBSD está basado en una gran variedad de
NetBSD http://www.NetBSD.org
Berkeley software de libre distribución que incluye entre
otros, a 4.4BSD Lite de la Universidad de
California-Berkeley, a Net/2 (Berkeley Networking
Release 2) el sistema de ventanas X del MIT y
software de GNU.
Basado en el sistema operativo Unix System V.
AIX IBM http://www.ibm.com/servers/aix/
Basado en SVR2
http://unix.hp.com/operating/inde
HP-UX HP Basado en el sistema operativo Unix System V
x.html
SPARC-OS Tatung Basado en el sistema operativo UNIX BSD http://www.tsti.com/
Basado en el sistema operativo UNIX BSD.A partir
SunOS SUN http://www.sun.com/SunOS/ ?
de la versión 2 pasa a denominarse Solaris
Solaris SUN Basado en el sistema operativo UNIX BSD http://www.sun.com/solaris/
XENIX Microsoft Basado en el sistema operativo Unix System V http://www.microsoft.com/
IDRIX Basado en el sistema operativo Unix System V
System V es la versión más ampliamente usada
de UNIX. Es el descendiente directo del UNIX
System V AT&T desarrollado por AT&T en 1969. Está actualmente http://www.att.com/
en la revisión 4.1 y a menudo es referenciado
como SVR4, o System V Release 4.
DEC ahora
ULTRIX Basado en el sistema operativo Unix System V http://www.compaq.com/
COMPAQ
Solobourne
SolOS Basado en el sistema operativo UNIX BSD http://www.sun.com
Computers
Solinux SUN Basado en el sistema operativo Unix System V http://www.sun.com/