Programando scripts under linux bash

    • blucles .sh
  • foo=( )
    top=100000;for((i=0;i<top;i++))
    do
    ls -latr;
    echo «$i:Emi Winehouse»
    done

 

    • Escribe en un editor de texto (nano, mcedit, vim, nedit, etc.):
 #! /bin/bash
 # Las líneas que empiezan por "#" son comentarios
 # La primera línea o #! /bin/bash asegura que se interpreta como
 # un script de bash, aunque se ejecute desde otro shell.

echo "Este es el primer comando"
echo" "Tras 5 segundos verás un listado del directorio actual"
sleep 5s
ls --color
echo "Fin del ejemplo"
    • Grábalo con un nombre cualquiera, por ejemplo «miprimerscript»
    • Ejecuta «chmod +x mimprimerscript»
    • Ejecuta «./miprimerscript» (el «./» significa «del directorio actual»)

Como se puede comprobar, «echo» sólo muestra mensajes en pantalla, «sleep» hace una pausa y «ls» nos muestra una lista de ficheros.

¿Qué se puede hacer, además de meter eso?

    • Manejar variables. Se introducen asÍ:
     VARIABLE=valor; export VARIABLE  (en sh)
     export VARIABLE=valor (en bash).
      • var1=’expr’
      • var2=»string»
      • Se escriben tras el nombre del script y se asignan consecutivamente a $1, $2, $3, … Por ejemplo, si ejecuto «nombre-del-script Hola» y dentro exista una orden «echo $1» el resultado será ordenador recibe una orden «echo Hola». Hay otras muchas variables predeterminadas. Importantes a recordar:
        • $# :num. de argumentos
        • $? :Valor del ultimo comando
        • $* :todos los arg de la shell
        • $$ :PID de la Shell (echo «para matarme, usa kill $$»)
        • $ :opciones pasadas a la shell
        • $! :PID del ultimo comando &
        • $HOME
        • $PATH
        • $PS1 :prompt de ‘espera’
        • $PS2: prompt de ‘continua’
        • $IFS :Lista de char que separan palabras en los argumentos

Las variable de entorno se pueden ver así:

 echo $<tab><tab> (solo los nombres de las variables
 env (con los valores asignados)
 set | less
    • Ordenes condicionales ( if test $2=$var1 then … fi)
if [ "$1" = "hola" ]; then
        ordenes
  elif [  ]; then
        ordenes
  else ordenes
  fi

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>
Variables especiales
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 *

    Suscríbete a Ovtoaster