viernes, 20 de enero de 2017

Asignando valores a variables y constantes

Aquí es donde nuestro conocimiento de las expansiones empieza a dar sus frutos. Como hemos visto, a las variables se le asignan valores así:

variable=valor

donde variable es el nombre de la variable y valor es una cadena. Al contrario de otros lenguajes de programación, el shell no se preocupa por el tipo de datos asignados a una variable; los trata a todos como cadenas. Puedes forzar al shell a restringir la asignación a enteros usando el comando declare con la opción -i, pero al igual que con la configuración de las variables como sólo lectura, no se suele hacer.

Fíjate que en una asignación, no debe haber espacios entre el nombre de la variable, el signo igual y el valor. Entonces ¿en qué puede consistir el valor? Cualquier cosa que pueda expandirse en una cadena:

a=z                 # Assign the string "z" to variable a.
b="a string"        # Embedded spaces must be within quotes.
c="a string and $b" # Other expansions such as variables can be
                    # expanded into the assignment.
d=$(ls -l foo.txt)  # Results of a command.
e=$((5 * 7))        # Arithmetic expansion.
f="\t\ta string\n"  # Escape sequences such as tabs and newlines.

Pueden hacerse múltiples asignaciones de variables en una única línea:

a=5 b="a string"

Durante la expansión, los nombres de variables pueden ir rodeados de llaves opcionales "{}". Esto es útil en casos donde el nombre de una variable puede llegar a ser ambiguo debido a su contexto próximo. Aquí, tratamos de cambiar el nombre de un archivo de myfile a myfile1, usando una variable:

[me@linuxbox ~]$ filename="myfile"
[me@linuxbox ~]$ touch $filename
[me@linuxbox ~]$ mv $filename $filename1
mv: missing destination file operand after `myfile'
Try `mv --help' for more information.

Este intento falla porque el shell interpreta el segundo argumento del comando mv como una variable nueva (y vacía). El problema puede solucionarse de esta forma:

[me@linuxbox ~]$ mv $filename ${filename}1

Añadiendo las llaves en los extremos, el shell ya no interpreta el 1 del final como parte del nombre de la variable.

Aprovecharemos esta oportunidad para añadir algunos datos a nuestro informe, digamos la fecha y hora en que fue creado el informe y el nombre de usuario del creador:

#!/bin/bash

# Program to output a system information page

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIMESTAMP="Generated $CURRENT_TIME, by $USER"

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

No hay comentarios:

Publicar un comentario