miércoles, 18 de enero de 2017

Variables y constantes

Sin embargo, hay un problema con nuestro script. ¿Ves cómo la cadena "System Information Report" está repetida? Con nuestro diminuto script no es un problema, pero imaginemos que nuestro script fuera realmente largo y que tuviéramos múltiples instancias de esta cadena. Si quisiéramos cambiar el título a otra cosa, habríamos tenido que cambiarlo en múltiples sitios, lo que podría ser mucho trabajo. ¿Y si pudiéramos arreglar el script para que la cadena sólo apareciera una vez y no múltiples veces? Podría hacer que el mantenimiento del script en el futuro sea más fácil. Aquí tenemos cómo podríamos hacerlo:

#!/bin/bash

# Program to output a system information page

title="System Information Report"

echo "<HTML>
        <HEAD>
                <TITLE>$title</TITLE>
        </HEAD>
        <BODY>
                <H1>$title</H1>
        </BODY>
</HTML>"

Creando una variable llamada title y asignándole el valor "System Information Report", podemos aprovechar la expansión de parámetros y colocar la cadena en múltiples lugares.

Pero ¿cómo creamos una variable? Simplemente, la usamos. Cuando el shell encuentra una variable, automáticamente la crea. Esto difiere de muchos lenguajes de programación en los que las variables deben ser declaradas o definidas explícitamente antes de usarla. El shell es muy laxo en esto, lo que puede causar algunos problemas. Por ejemplo, considera este escenario ejecutado en la línea de comandos:

[me@linuxbox ~]$ foo="yes"
[me@linuxbox ~]$ echo $foo
yes
[me@linuxbox ~]$ echo $fool

[me@linuxbox ~]$

Primero asignamos el valor "yes" a la variable foo, y luego mostramos su valor con echo. A continuación mostramos el valor de la variable mal escrita como "fool" y tenemos un resultado en blanco. Esto es porque el shell ha creado felizmente la variable fool cuando la encontró, y le ha dado el valor por defecto de nada, o vacía. Con esto, aprendemos que ¡debemos prestar mucha atención a nuestra escritura! También es importante entender lo que realmente ha ocurrido en este ejemplo. De nuestro estudio previo a cómo el shell realiza las expansiones, sabemos que el comando:

[me@linuxbox ~]$ echo $foo

se somete a expansión de parámetros resultando en:

[me@linuxbox ~]$ echo yes

Mientras que el comando:

[me@linuxbox ~]$ echo $fool

se expande a:

[me@linuxbox ~]$ echo

¡La variable vacía se expande en nada! Esto puede causar estragos en comandos que requieren argumentos. Aquí tenemos un ejemplo:

[me@linuxbox ~]$ foo=foo.txt
[me@linuxbox ~]$ foo1=foo1.txt
[me@linuxbox ~]$ cp $foo $fool
cp: missing destination file operand after `foo.txt'
Try `cp --help' for more information.

Asignamos valores a dos variables, foo y foo1. Luego realizamos un cp, pero escribimos mal el nombre del segundo argumento. Tras la expansión, al comando cp sólo se le envía un argumento, aunque requiere dos.

Hay algunas reglas sobre los nombres de variables:
  1. Los nombres de variables pueden consistir en caracteres alfanuméricos (letras y números) y caracteres guión bajo.
  2. El primer carácter de un nombre de variable puede ser tanto una letra o un guión bajo.
  3. Los espacios y símbolos de puntuación no están permitidos.
La palabra "variable" implica un valor que cambia, y en muchas aplicaciones, las variables se usan de esta forma. Sin embargo, la variable de nuestra aplicación, title, se usa como una constante. Una constante es como una variable ya que tiene un nombre y contiene un valor. La diferencia es que el valor de una constante no cambia. En una aplicación que realice cálculos geométricos, podríamos definir PI como una constante, y asignarle el valor de 3,1415, en lugar de usar el número literalmente a lo largo de nuestro programa. El shell no hace distinción entre constantes y variables; es más bien a conveniencia del programador. Una convención común es usar letras mayúsculas para designar contantes y minúsculas para variables. Modificaremos nuestro script para cumplir con esta convención:

#!/bin/bash

# Program to output a system information page

TITLE="System Information Report For $HOSTNAME"

echo "<HTML>
        <HEAD>
                <TITLE>$TITLE</TITLE>
        </HEAD>
        <BODY>
                <H1>$TITLE</H1>
        </BODY>
</HTML>"

Tenemos la oportunidad de mejorar nuestro título añadiendo el valor de la variable de shell HOSTNAME. Es el nombre de red de la máquina.

Nota: El shell en realidad proporciona una forma de forzar la inmutabilidad de las constantes, a través del uso del comando integrado declare con la opción -r (sólo lectura). Si le asignamos TITTLE de esta forma:

declare -r TITLE="Page Title"

el shell prevendrá cualquier asignación posterior a TITTLE. Esta característica es poco usada, pero existe en scripts muy formales.

No hay comentarios:

Publicar un comentario