4.1.- Las variables de usuario

Veremos las funcionalidades que componen las bases de la programación shell. El shell nos permite definir o redefinir variables que condicionan el entorno de trabajo del usuario. Podemos definir también otras variables, llamadas variables de usuario, que nos permitirán almacenar información que será necesaria durante la ejecución de un script.

 Reglas que hay que seguir para poner nombre a una variable

Las variables son “palabras” con contienen un valor. El shell permite crear, asignar y eliminar variables. El nombre de una variable puede contener solo letras (de a a z o de A a Z), números (0 a 9) o el carácter de guion bajo (_). Adicionalmente el nombre de una variable solo puede comenzar con una letra o un guion bajo.

Estos son algunos ejemplos de nombres de variables validas:

Pero, las variables que comiencen por un número:

No es un nombre de variable valido, si agregamos un guion bajo “_” al principio para
convertirla en valida:

Nombres de variables tales como 1, 2 o 11. Es decir que comienzan con un numero, están reservadas para ser utilizada por el shell (file descriptors), se puede utilizar el valor almacenado en esas variables pero generalmente tu no puedes poner el valor de esas variables.

La razón por la que no se puede utilizar caracteres como !, * o es que estos caracteres tienen un significado especial para el shell (substitución de nombres de archivos). A este tipo de variables simples se les llamada técnicamente “escalares” (scalar).

Como definir una variable

El shell permite asignar prácticamente cualquier valor a las variables simplemente especificando el nombre de la variable y el valor que queremos almacenar en esa variable.

Ejemplo

No hay que declarar el tipo de variable (carácter o numérica) pero hay que tener cuidado al
utilizar valores que contienen espacios, por ejemplo:

Nos generará un error de “no se encontró la orden” (command not found).

 Para poder utilizar espacios en los valores de las variables, se requiere que el valor se encierre entre comillas (“…”).

Accediendo al valor de las variables

Para obtener el valor almacenado en una variable se incluye el signo $ antes del nombre de la variable, por ejemplo:

Debemos tener en cuenta que si no se utiliza el signo $ antes del nombre de la variable, únicamente se desplegará el nombre de la variable, por ejemplo:

No debemos dejar ningún espacio alrededor del signo de asignación =,  ya que el shell interpretaría “variable” como si fuera un comando a ejecutar y el símbolo de asignación (=) y “hola” como los dos argumentos del comando “variable“.

La forma correcta sería:

 El símbolo $ es únicamente utilizado para acceder a el valor de las variables, pero no para definirlo, por ejemplo, la siguiente asignación:

Se puede asignar el valor de otras variables a una variable por ejemplo:

Usar una variable vacía no se considera error en el shell:

 Para que imprima algún carácter especial, debemos anteponer el símbolo \.

Cálculos matemáticos

 El shell provee un mecanismo para realizar básicos cálculos aritméticos de enteros llamado “expansión aritmética”. Este tipo de expansión no esta disponible en shells mas antiguos (como Bourne shell, donde se tiene que utilizar el comando expr que veremos mas adelante).

La expansión aritmética esta basada en un estándar POSIX, así que es posible encontrar esta característica en la mayoría de shell’s modernos. El formato para la expansión aritmética es:

En donde expresión es cualquier expresión matemática que puede usar variables de shell (que contengan valores numéricos), operadores y/o valores numéricos específicos. El resultado de el calculo de la expresion es regresado en la linea de comando, por ejemplo:

Suma uno al valor de la variable a y despliega el resultado, tenga en cuenta que la variable a no tiene que ser precedida por el signo $. Esto es porque el shell sabe que las únicas cuestiones validas en una expansión aritmética son valores, variables y operadores (+ – * /), al evaluar el carácter i y definir que no es un valor numérico (0 a 9) ni un operador matemático, entonces seguramente es una variable.

Si la variable no ha sido definida o su valor es nulo (contiene una cadena nula, espacios o valores alfanuméricos) se define que el valor de la variable es cero. Por ejemplo, si aún no hemos definido la variable Z ni asignado ningún valor a la misma, aun se puede utilizar en una expansión aritmética:

Tambien este otro ejemplo:

Ahora f tiene el valor 20.

La asignación de valores (=) es un operador aritmético valido asignando a la variable el valor que está a la derecha del operador de asignación. Se permite el uso de paréntesis adicionales para forzar una agrupación de operaciones, por ejemplo:

Si se queremos asignar un valor a una variable usando el operación de asignación (=). La asignación la haremos sin dejar espacios antes y después del signo igual (=).

Finalmente, para hacer una comparación de valores dentro de la asignación, o sea, para ver si es mayor que 0 o menor o igual que 100, podemos escribir:

Lo cual asigna el valor 1 a la variable resultado si la expresion es cierta y 0 si es falsa.

Asignando la salida estándar a variables

Una característica muy útil de la asignación de variables es poder asignar resultados de comandos (o la salida estándar de un comando) a variables utilizando el carácter ` para encerrar el comando. Supongamos que deseamos una variable que contenga la fecha del sistema, podríamos hacer lo siguiente:

De esta manera la variable FECHA contendrá el resultado de la ejecución del comando date. O por ejemplo, para asignar el numero de usuarios que se encuentran en el sistema:

También podemos almacenar el contenido de un archivo en una variable:

Este tipo de substitución es ampliamente utilizado en la programación shell, debido a que permite almacenar en una variable la salida de un programa o incluso de un conjunto de programas (unidos mediante uno o varios pipes, como en el ejemplo de: ps -ef | wc -l).

Arrays

Un array es un conjunto de valores asignados a un solo nombre de variable, para acceder a alguno de los valores, se utiliza un numero que sirve como índice para los datos.

Digamos que deseamos almacenar todos los nombres de insectos en una sola variable a la que llamaremos BICHOS.

Si ejecutamos por ejemplo:

Encontramos el problema de que al ser la misma variable, solo nos mostrará el último valor del que dispone la variable, ya que se han ido actualizando las variables asignada en cada línea.

 El método mas simple para crear un array es asignar un valor a uno de sus índices, esto es expresado de la siguiente manera:

Vemos que la sintaxis para acceder a  un array es:

Donde nombre es el nombre del array, e índice es el índice del elemento que deseamos.

Podemos acceder todos los elementos de un array utilizando como índice los caracteres @ o * de la siguiente manera:

Variables de solo lectura

Una vez que una variable ha sido definida, es posible indicarle al shell que deseamos que sea de solo lectura, es decir que el valor que tiene asignado no se pueda modificar, esto es utilizado algunas veces en programas de shell para asegurarse de que los valores importantes que contienen esas variables no sean modificados durante la ejecución.

Aun cuando la variable es de solo lectura el comando echo todavía puede obtener su valor, pero cuando tratamos de cambiar el valor a de la variable el shell no lo permite.

Del mismo modo también se puede cambiar un array de sólo lectura.

Para eliminar una variable o array, se puede utilizar el comando unset:

Variables y parámetros

Variables

Cada shell tiene unas variables ligadas a él, a las que el usuario puede añadir tantas como desee. Para dar un valor a una variable haremos:

Reglas de evaluación de variables

Veamos las reglas que gobiernan la evaluación de las variables del guión shell:

  • $var: significa el valor de la variable o nada si la variable no está definida. Por ejemplo:
    muestra el contenido de la variable “fecha”, si existe. En caso de que no esté definida no muestra nada.
  • ${var}: igual que el anterior excepto que las llaves contienen el nombre de la variable a ser sustituida.
  • ${var-thing}: el valor de var si está definida, si no thing.
  • ${var=thing}: valor de var si está definida, si no thing y el valor de var pasa a ser thing.
  • ${var?message}: si $var está definida, si no, imprime el mensaje en el terminal del shell. Si el mensaje esta vacío imprime uno estándar.
  • ${var+thing}: thing si $var está definida, si no nada.

El siguiente ejemplo muestra cómo podemos usar una variable, asignándole un valor en caso de que no esté definida. Esto es muy útil para trabajar con variables numéricas que no sabemos si están o no definida.

Variable var1 no definida.

Al no estar definida, le asigna el valor 5.

Muestra el nuevo valor de la variable $var1.

Pero si lo que queremos es usar un valor por defecto, en caso de que la variable no esté definida, pero sin inicializar la variable, se puede utilizar el siguiente ejemplo:

No está definida, no imprimirá nada.

Al no estar definida, utiliza el valor 5.

Su valor sigue siendo nulo, no se ha definido.

Por otro lado, si lo que queremos es usar el valor de la variable, y en caso de que no esté definida, imprimir un mensaje, podemos hacer lo siguiente:

No está definida, no imprimirá nada.

Al no estar definida, se muestra en pantalla el mensaje “No está definida…“.

Su valor sigue siendo nulo, no se ha definido.

Este último ejemplo nos muestra cómo utilizar un valor por defecto si la variable está definida,o “nada”, sino está definida:

Asignamos a la variable var1 el valor 4.

Muestra 4 que es el valor de la variable var1.

Al estar definida la variable var1, esta variable utiliza el valor 5.

Su valor sigue siendo 4.

Anuncios