next up previous contents
Next: Configuración del shell Up: Interface con el usuario Previous: Archivos de comandos   Índice General


Variables

Habrá ocasiones en que necesitaremos almacenar un valor o una cadena de carácteres al realizar alguna operación con el shell, para después pasarle éste valor a otro programa o, simplemente, para después examinarlo. El shell proveé de una manera de realizar esto por medio de las variables de entorno, también llamadas variables de ambiente.

Estas variables existen únicamente durante la ejecución del shell. Así, si en una sesión creamos una variable o modificamos su valor, al terminar la sesión éste se pierde.

Para asignar un valor a una variable, basta con poner el nombre de la variable seguido de un signo de igual y el valor:

$ variable=valor

El nombre de la variable precedido por el carácter $ es el valor de la variable. La mejor manera de examinar el valor es utilizando el comando echo:

$ color=rojo
$ echo $color
rojo
$ telefono=5552314
$ echo $telefono
5552314
$

Cuando se necesita asignar a una variable una cadena que incluye espacios o carácteres que normalmente el
em shell interpretaría, es necesario encerrar el valor entre comillas sencillas:

$ hacer='tengo que pasar al super; ir a la tintorer\'\i{}a; hablarle a mi tia'
$ echo $hacer
tengo que pasar al super; ir a la tintorer\'\i{}a; hablarle a mi tia
$

El shell tiene interconstruidas ciertas variables que son importantes para su funcionamiento. Por ejemplo la variable PATH contiene la lista de directorios donde serán buscados los programas a ejecutar. Esta variable se define en el archivo de configuración del shell actual5.1. Por ejemplo, lo más usual es que esta variable esté prefijada con los siguientes valores:

$ echo $PATH
:/bin:/usr/bin
$

pero sabemos que existe el directorio /usr/games donde se encuentran algunos juegos. En particular nos interesa ejecutar el programa llamado fortune que, man lo sabe, produce como salida una frase simpática. Pero acabamos de examinar el contenido de la variable PATH y claramente podemos observar que el directorio /usr/games no está incluido. Bueno ya sabemos como incluirlo:

$ echo $PATH
:/bin:/usr/bin
$ PATH=$PATH:/usr/games
$ echo $PATH
:/bin:/usr/bin:/usr/games
$

y como podemos observar los directorios van separados por dos puntos, :, esta es la manera tradicional para las variables que contienen varios directorios de búsqueda, como veremos en la sección [*].

Ahora estamos listos para ejecutar fortune:

$ fortune
Like so many Americans, she was trying to construct a life that made
sense from things she found in gift shops.
                -- Kurt Vonnegut, Jr.

Para el manejo de las variables de entorno, necesitamos saber un poco de la sintáxis empleada en su definición. Habrá situaciones en que necesitaremos substituir el contenido de una variable dentro de una cadena o rodeado por algun tipo de carácteres:

$ prefijo=al
$ echo ${prefijo}go
algo
$ echo cab${prefijo}go
cabalgo

o quizá sea necesario utilizar el valor de una variable previniendo el caso en que ésta no haya sido definida. Digamos que necesitamos almacenar en una variable el nombre de un archivo, pero que cuando este archivo no esté definido use por omisión el archivo salida. Para este caso tenemos la construcción ${variable-valor_alterno}:

$ echo ${donde-salida}
salida
$ donde=aqui
$ echo ${donde-salida}
aqui

Como podemos ver en la primera línea imprimimos el valor de la variable donde si está definida o si no el valor por omisión salida, que es el que obtenemos en la segunda línea. Después de definir la variable donde en la tercera línea, al preguntar por ésta en la cuarta línea, obtenemos su definición en la quinta línea.

Existe también la opción de que en caso de que a la variable se le asigne el valor por omisión en caso de que no esté definida, con la construcción ${variable=valor_alterno}:

$ echo ${donde=salida}
salida
$ echo $donde
salida

Ejercicio: Dé una construcción alterna de éste ejemplo.

También se pueden utilizar la construcción ${variable?mensaje}, donde si la variable no está definida, imprime el mensaje dado y termina la ejecución del shell en que fue invocada esta forma, o la forma alternativa ${variable+accion} en la cual si la variable está definida, ejecuta la acción indicada, de otra forma no hace nada.


Tabla: Variables más usuales
Variable Significado dentro del subshell
$# Número de argumentos recibidos
$* Todos los argumentos
$- Opciones dadas
$? Valor de regreso del último comando ejecutado
$$ Identificador del proceso actual
$HOME Directorio original del usuario
$IFS Lista de carácteres que se utilizan como separadores en los argumentos
$MAIL Archivo donde se almacena el correo electrónico del usuario
$PATH Lista de directorios donde se buscan los comandos dados
$PS1 Prompt común del usuario
$PS2 Prompt cuando continúa la línea


La tabla [*] muestra las variables usuales del shell y su función.

La utilidad de las variables la veremos con mayor detenimiento en la sección [*] donde construiremos algunos ejemplos interesantes. De momento, introduciremos la noción de subshell y ejecución de archivos de comandos.

En la sección de antecedentes mencionamos hasta el cansancio que lo que hace realmente poderoso a Unix es la filosofía con la que fue diseñado, es decir con la idea de que una colección de pequeños programas fuesen capaces de ser unidos por herramientas del sistema operativo con la finalidad de crear herramientas mayores o simplemente nuevas.

Introduciremos ahora los elementos para poder hacer esto. Como recordaremos, cualquier archivo con instrucciones puede convertirse en un archivo ejecutable con la instrucción chmod. Ahora veremos un pequeño ejemplo de un programa ejecutable. Como todavía no sabemos como añadir permanentemente a nuestro ambiente el path donde se encuentran los juegos, así que construiremos un pequeño programa que llamaremos dichos que añada el path y que ejecute el programa fortune. Al hacer ésto, lo que hacemos es pedirle al shell que ejecute una copia de sí mismo donde interpretará cada una de las instrucciones que le pedimos.

La secuencia siguiente es una de las que podemos utilizar para conseguir éste propósito:

$ cat > dichos
PATH=$PATH:/usr/games
fortune
^D
$ ls -al dichos
-rw-rw-rw-   1 pablo    usuarios       30 Jun 13 02:46 dichos
$ chmod ugo+rx dichos
$ ls -al dichos
-rwxr-xr-x   1 pablo    usuarios       30 Jun 13 02:46 dichos
$ dichos
According to the latest official figures, 43% of all statistics are
totally worthless.
$ echo $PATH
/bin:/usr/bin

Ejercicio: En el archivo dichos claramente estamos alterando el path. Pero en cuanto termina la ejecución y examinamos la variable, desaparece el directorio /usr/games. Puede explicar qué pasó?

Regresemos ahora a la tabla [*]. Aparece una palabra nueva en ella en la descripción de las variables PS1 y PS2: prompt, hasta ahora no la habíamos mencionado, aún cuando ya estamos familiarizados con su significado. Simplemente es la manera que tiene el shell de avisarnos que está listo para la siguiente instrucción. En los ejemplos que hemos visto hasta ahora el prompt ha estado indicado por $, pero podemos cambiarlo por lo que queramos alterando éstas variables. Podemos cambiarla, por ejemplo, por:

$ PS1='Diga usted, amo: '
Diga usted, amo: date
Tue Jun 13 03:08:31 CST 1995
Diga usted, amo: PS1='Listo para la otra: '
Listo para la otra: PS1='Ordene, maestro del universo: '
Ordene, maestro del universo: PS1='(\u@\h)\w:[\d]:\t$ '
(pablo@breogan)~/trabajo/programas:[Mon Apr 10]:03:55:45$

y un largo etcétera de posibilidades y adulaciones al ego. En el último caso, Pablo decide que quiere poner en su prompt el nombre del usuario, la máquina en la que esta conectado --muy útil cuando se trabaja en una red grande y desde cuentas diferentes--, el directorio donde se encuentra y la fecha y hora.


next up previous contents
Next: Configuración del shell Up: Interface con el usuario Previous: Archivos de comandos   Índice General
Ismael Olea 2001-04-21