Aprende GNU/Linux 10

Aprendiendo shell scripting en Linux: variables y parámetros

En el articulo Introducción a los scripts en Linux nos adentramos en el mundo de los shell scripts, explicamos para que sirven, como se crean y como ejecutarlos, pero esto solamente fue una pequeña introducción, ya que la shell y por consecuencia los shell scripts, no son solamente simples interpretes de comandos, disponen de herramientas típicas de los lenguajes de programación como las variables, las operaciones aritméticas, los controles de flujo y bucles, etc. En esta ocasión vamos a hablar de dos herramientas imprescindibles a la hora de escribir nuestros scripts, las variables y los parámetros.

Las variables

Las variables son una herramienta que nos va a permitir guardar valores numéricos o cadenas de caracteres en memoria, pudiendo acceder a esta mediante el nombre que le asignemos. Estas nos van a ser de gran utilidad a la hora de dar mas complejidad a nuestros scripts y realizar operaciones mas elaboradas. Lo primero que tenemos que conocer sobre las variables es como declararlas, como asignarles un valor y como acceder a su contenido.

Declaración y asignación

En muchos lenguajes de programación es posible declarar una variable y después darle un valor, pero en el caso de los shell scripts, la declaración de la variable se efectuá en el momento en el que le asignamos un valor. Esta asignación se efectuá mediante el carácter =.

var1=ovtoaster

En este comando estamos creando una variable con el nombre var1 y el valor ovtoaster.

Acceso al valor de una variable y el comando env

El acceso a una variable es tan sencillo como poner el signo $ antes del nombre, la shell cuando encuentra este símbolo entiende que la palabra que le precede es una variable.

echo $var1

Resultado:

ovtoaster

  Evidentemente las variables las podemos utilizar como parámetro para cualquier comando, no solamente para echo

Borrando una variable

Si deseamos borrar una variable lo aremos mediante el comando unset de forma que con la instrucción :

unset var1

estamos borrando tanto la variable var1 como su contenido.

Es posible proteger variables mediante el comando readonly. Con este comando lo que haremos sera proteger la variable que le pasemos ( sin símbolo $ ) en modo lectura. Una vez protegida no sera posible ni cambiar el valor de la variable ni borrarla ( si salimos de la shell esta es borrada )
Protegiendo variables
Variables numéricas

Cuando creamos variables de la forma que hemos indicado, sus valores son guardados como una cadena de caracteres, pero en muchas ocasiones necesitaremos operar con números y hacer cuentas con ellos, para esto tenemos el comando typeset. Pasandole el parámetro -i ( integer ) y la variable que queremos convertir a tipo numérico, crearemos esta variable de tipo integer.

Un ejemplo :

#! /bin/bash
typeset -i suma
suma=4+6
echo $suma

resultado :

10

Cuidado, si asignamos un valor no numérico a estás variables obtendremos un error.

Lectura dinámica de variables

Es posible leer un valor por la entrada estándar ( el teclado si no utilizamos una redireccion ) de forma dinámica y guardar esta lectura en una variable con el comando read. El comando read nos va a crear una nueva variable con el valor que se le asigne por la entrada estándar.

Ejemplo:

#! /bin/bash

echo "Introduce tu ciudad : "
read ciudad
echo "tu ciudad es : "
echo $ciudad

Si la entrada estándar es el teclado ( lo es por defecto ), el resultado y el valor de $ciudad sera el valor que introduzcamos.

Las variables de sistema  + las variables especiales

Ademas de las variables que podemos definir nosotros mismos, disponemos de unas cuantas variables especiales predefinidas que nos pueden ser de gran utilidad, estas variables son las variables de sistema y las especiales. Las primeras son variables que se inician con la shell y que pueden ser modificadas (con cuidado), mientras que las segundas son variables unicamente de acceso ( su valor no se puede modificar ). Os dejo una lista de las variables de sistema y otra de las variables especiales :

Variables de sistema o variables de entorno < Wikipedia>

$PATH Contiene una lista separada por dos puntos de directorios en los cuales el intérprete de comandos buscará los archivos ejecutables que no se invocan con una ruta. Por razones obvias de seguridad, normalmente esta variable de entorno no contiene el directorio actual.

$HOME Contiene la ubicación del directorio de usuario. De esta manera, los dos comandos siguientes tienen el mismo efecto:

cd ~
cd $HOME

$DISPLAY Contiene el identificador del display que los programas de X11 deben usar por defecto.

$LANG, $LC_ALL LANG contiene el locale por defecto del sistema; LC_ALL permite ignorar su contenido. Por ejemplo, si contiene pt_BR, entonces el idioma será portugués de Brasil y el locale será Brasil.

$RANDOM Es una variable de entorno especial que, cuando se intenta obtener su contenido, devuelve un valor aleatorio.

$PWD Contiene la ruta al directorio de trabajo actual.

$OLDPWD Contiene la ruta al directorio de trabajo previo, esto es, el valor de $PWD antes de la ejecución del último cd.

$SHELL Contiene el nombre de la shell interactiva que se está corriendo, por ejemplo bash.

$TERM Contiene el nombre de la terminal que se está corriendo, por ejemplo xterm.

$PAGER Contiene la ruta al programa usado para listar el contenido de archivos, por ejemplo:

/bin/less

$EDITOR Contiene la ruta al editor de texto, usualmente un editor liviano por ejemplo:

/usr/bin/nano

$VISUAL Contiene la ruta al editor de texto, usualmente un editor poderoso, por ejemplo vi, vim, emacs, etc.

$MAIL Contiene la ubicación del e-mail entrante. La configuración tradicional es:

/var/spool/mail/$LOGNAME.

$HISTFILEEl nombre del archivo donde se guarda el historial de comandos.

$HISTFILESIZEEl numero máximo de lineas contenidas en el historial de comandos.

$HOSTNAME Contiene el nombre de host del sistema.

$PS1 El prompt por defecto .

$USER Nombre de usuario actual logueado en el sistema.

$MANPATH Cadena de texto separada por comas con las ubicaciones de las paginas del manual.

Variables especiales

$? : Valor devuelto por el último programa que se ha ejecutado.

$! : Número de proceso ( PID ) del último proceso que se ejecuto en background.

$$ : Número de proceso ( PID ) de la shell actual.

Los arrays / tablas

Los arrays nos van a permitir crear estructuras de datos en la que vamos a poder almacenar 1024 variables, se declaran mediante los corchetes [ ] o asignando los valores de forma directa, siendo el 0 la primera posición y 1023 la ultima. Si queremos acceder a las variables del array lo aremos con el símbolo $ precedido del nombre de la variable con la posición a la que queremos acceder entre [ ] y estos dos elementos dentro de { }.

Ejemplos:

#! /bin/bash
ciudad[0]="Madrid"
ciudad[1]="Tokyo"
ciudad[2]="Berlin"
ciudad[4]="Lima"
echo ${ciudad[4]}
Lima

Resultado :

Lima

También es posible listar todos los elementos de una vez mediante el carácter * :

#! /bin/bash
ciudad[0]="Madrid"
ciudad[1]="Tokyo"
ciudad[2]="Berlin"
ciudad[4]="Lima"
echo ${ciudad[*]}

Resultado :

Madrid 
Tokyo
Berlin 
Lima

O inicializar el array en una sentencia :

#! /bin/bash
ciudad=(Madrid Tokyo Berlin Lima)
echo ${ciudad[4]}

Resultado :

Lima

Los parámetros

En muchas ocasiones necesitamos que nuestros scripts reciban información a la hora de ejecutarlos, y para esto vamos a utilizar los parámetros de posición. Los parámetros de posición son argumentos que pasamos en el momento de ejecución del script, estos se denominan de esta manera por el hecho que toman un numero como nombre de variable según su posición, de forma que el argumento numero 1 que pasemos al script sera la variable $1. Dentro del script estas son las variables que vamos a utilizar para interactuar con los parámetros :

$1 … $9 : Argumentos pasados al programa. Si usamos las llaves “{}” para nombrar las variables el limite se puede extender, pues ${11} es el undécimo argumento y no $1 y un 1.

$0 : Nombre del programa que se está ejecutando.

$# : Número de argumentos que se han pasado al programa.

$* : Todos los argumentos pasados al programa.

$@ : Todos los argumentos pasados al programa pero teniendo en cuenta su separación.

Comandos set y shift

Con el comando set vamos a poder asignar nuevos valores a los parámetros de posición, la mejor forma de verlo es mediante un ejemplo :

  Código del script pruebaSet.sh

#! /bin/bash
echo "Todos : $*"
set ov toaster punto com
echo "todos después de set : $*"

De forma que ejecutándolo de la siguiente manera :

./pruebaSet.sh uno dos tres cuatro cinco

El resultado es el siguiente :

Todos : uno dos tres cuatro cinco
todos después de set : ov toaster punto com

En este cambio se sustituyen las cuatro primeras variables y la quinta se borra.

Por otra parte el comando shift nos va permitir cambiar de posición los parámetros, una llamada al método shift desplaza una posición hacia abajo todas las variables, de forma que si tenemos $1 = ov, $2 = toaster, $3 = punto y $4 = com, al ejecutar el comando shift la variable $1 tendrá el valor toaster, $2 = punto y $3 = com, perdiendo el valor de la variable $1. También podemos ejecutar el comando shift pasando un numero n para hacer el desplazamiento n posiciones.

Espero que haya quedado claro como funcionan estas dos herramientas tan imprescindibles, sin ellas los scripts no pueden adquirir complejidad y realizar funciones mas elaboradas. Si tienes interés en aprender mas sobre el shell scripting en Linux estate atento a ovtoaster, tenemos pensado ir profundizando en el tema con nuevos artículos ( puedes recibir un aviso de nuestros nuevos artículos mediante las redes sociales o vía e-mail 😉 ), aquí están los artículos sobre el tema que hemos escrito hasta el momento:

Sobre el autor / 

AsierPH

Entusiasta de las tecnologías libres y fundador de OvToaster.com | “Las obras de conocimiento deben ser libres, no hay excusas para que no sea así“

Articulos relacionados

10 comentarios

  1. Juan Boó 15 Enero, 2017 at 3:55 am -  Responder

    Hola:
    Ejecuto, en línea de comandos, la visualización de vídeo con omxplayer a través de xterm en Raspberry,
    por ej.
    xterm -fullscreen -fg black -bg black -e omxplayer %1
    como quiera que hay múltiples posibilidades de ejecución, en cuanto a opciones y parámetros considero el ejecutar cada tipo de video, .vid, .mtk, mp4, etc con el script correspondiente lanzándolo a través del doble click del ratón encima del fichero a reproducir.

    La ayuda que te pido es la siguiente:

    ¿cómo se asigna el nombre del fichero, sobre el que se clika, a una variable dentro del cuerpo del script?

    p ej: matroska.sh (con permiso de ejecución)

    #!/bin/bash
    # -*- ENCODING: UTF-8 -*-
    pelicula=$1
    ruta=`pwd`
    subt=”$ruta”/”$1″.srt
    xterm -fullscreen -fg black -bg black -e omxplayer –subtitles $subt $1 (no funciona) ******
    xterm -fullscreen -fg black -bg black -e omxplayer %1 (no funciona) ****** etc
    exit

    Es decir, cuando cliko sobre el fichero a reproducir, ¿ hay alguna forma de conseguir que el nombre de ése fichero sea pasado como primer parámetro ($1), ó cualquier otro , dentro del script ?

    Previamente he asignado a la extensión de los ficheros mkv la ejecución del script matroska.sh con doble click sobre ellos.

    sudo !!!!!!

  2. Jesus Armando 9 Junio, 2016 at 5:44 pm -  Responder

    Hola, muchas gracias por el aporte, estoy en un proyecto de lector de huellas y quiero crear una tabla en raspberry pi 2 y pasar esos datos a una tabla de excel, lo que no se es que variable ocupar para que me vaya guardando los datos, de antemano muchas gracias y un saludo.

  3. Alberto 5 Noviembre, 2015 at 8:26 pm -  Responder

    Muchas gracias por la info, excelente aporte… podrías ayudarme con algo? tengo que desarrollar un interprete de comandos para Linux… donde empiezo? de antemano muchas gracias por cualquier ayuda… éxitos!!!

    • AsierPH 5 Noviembre, 2015 at 11:05 pm -  Responder

      Buenos días Alberto,
      Lo que pides es bastante complejo, creo que para poder ayudarte, aunque sea un poco, me tienes que explicar un poco tus conocimientos.
      Creo que para un interprete sencillo la mejor opción es c.
      Saludos!

  4. Fabian Orellana 27 Noviembre, 2014 at 8:27 am -  Responder

    Gracias me sirvio de mucho la explicacion clara, mañana tengo un examen y gracias a esto ahora comprendo todo mejor… mil gracias por el aporte

    • AsierPH 27 Noviembre, 2014 at 11:12 am -  Responder

      Un placer Fabian

  5. yeraki 19 Octubre, 2014 at 1:06 pm -  Responder

    Muchas gracias por la INFO, se agradece la claridad de los ejemplos para comprender mejor todo esto de los scripts. 😉

    • AsierPH 19 Octubre, 2014 at 3:25 pm -  Responder

      ¡Gracias a ti yeraki! Un placer ser de ayuda 🙂

  6. Paco Garcia 24 Marzo, 2014 at 6:30 am -  Responder

    Muchas gracias por compartir estos artículos.
    Van muy bien para sacar más provecho a la línea de comandos.

    Paco García.

    • AsierPH 24 Marzo, 2014 at 10:52 am -  Responder

      Muchas gracias Paco, me alegra que te sea de utilidad 🙂

Deja tu comentario

Tu correo no sera publicado. Los campos requeridos están marcados *