Sei sulla pagina 1di 25

Aprendiendo shell scripting en Linux: variables y parmetros

En el artculo Introduccin 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 pequea introduccin, ya que la shell y por
consecuencia los shell scripts, no son solamente simples intrpretes de comandos, disponen de herramientas tpicas
de los lenguajes de programacin como las variables, las operaciones aritmticas, los controles de flujo y bucles, etc. En
esta ocasin vamos a hablar de dos herramientas imprescindibles a la hora de escribir nuestros scripts, las variables y
los parmetros.

Las variables
Las variables son una herramienta que nos va a permitir guardar valores numricos 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 ms elaboradas. Lo primero que tenemos que
conocer sobre las variables es como declararlas, como asignarles un valor y como acceder a su contenido.

Declaracin y asignacin
En muchos lenguajes de programacin es posible declarar una variable y despus darle un valor, pero en el caso de los
shell scripts, la declaracin de la variable se efecta en el momento en el que le asignamos un valor. Esta
asignacin se efecta mediante el carcter =.
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
smbolo entiende que la palabra que le precede es una variable.
echo $var1
Resultado:
ovtoaster

Evidentemente las variables las podemos utilizar como parmetro 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 instruccin :
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 ser proteger la
variable que le pasemos ( sin smbolo $ ) en modo lectura. Una vez protegida no ser posible ni cambiar el valor de la
variable ni borrarla ( si salimos de la shell esta es borrada )
Protegiendo variables

Variables numricas
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 nmeros y hacer cuentas con ellos, para esto tenemos el
comando typeset. Pasandole el parmetro -i ( integer ) y la variable que queremos convertir a tipo numrico, 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 numrico a estas variables obtendremos un error.


Lectura dinmica de variables
Es posible leer un valor por la entrada estndar ( el teclado si no utilizamos una redireccion ) de forma dinmica 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 estndar.
Ejemplo:
#! /bin/bash

echo "Introduce tu ciudad : "


read ciudad
echo "tu ciudad es : "
echo $ciudad
Si la entrada estndar 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


Adems 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 nicamente 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 intrprete 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 ubicacin 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 portugus 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 ejecucin 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 ubicacin del e-mail entrante. La configuracin tradicional es:
/var/spool/mail/$LOGNAME.
$HISTFILEEl nombre del archivo donde se guarda el historial de comandos.
$HISTFILESIZEEl numero mximo 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.
$! : Nmero de proceso ( PID ) del ltimo proceso que se ejecut en background.
$$ : Nmero 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 posicin y 1023 la

ultima. Si queremos acceder a las variables del array lo aremos con el smbolo $ precedido del nombre de la variable con
la posicin 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
Tambin es posible listar todos los elementos de una vez mediante el carcter * :
#! /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 parmetros

En muchas ocasiones necesitamos que nuestros scripts reciban informacin a la hora de ejecutarlos, y para esto vamos
a utilizar los parmetros de posicin. Los parmetros de posicin son argumentos que pasamos en el momento de
ejecucin del script, estos se denominan de esta manera por el hecho que toman un numero como nombre de
variable segn su posicin, 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 parmetros :
$1 $9 : Argumentos pasados al programa. Si usamos las llaves {} para nombrar las variables el limite se puede
extender, pues ${11} es el undcimo argumento y no $1 y un 1.
$0 : Nombre del programa que se est ejecutando.
$# : Nmero 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 separacin.

Comandos set y shift


Con el comando set vamos a poder asignar nuevos valores a los parmetros de posicin, la mejor forma de verlo es
mediante un ejemplo :

Cdigo del script pruebaSet.sh


#! /bin/bash
echo "Todos : $*"
set ov toaster punto com
echo "todos despus de set : $*"
De forma que ejecutndolo de la siguiente manera :
./pruebaSet.sh uno dos tres cuatro cinco
El resultado es el siguiente :
Todos : uno dos tres cuatro cinco
todos despus 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 posicin los parmetros, una llamada al mtodo shift
desplaza una posicin 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. Tambin podemos ejecutar el comando shift pasando un numero n para hacer el desplazamiento n
posiciones.

Introduccin a la linea de comandos de Linux

Actualmente la mayora de las distribuciones ofrecen una interfaz grfica con la que no necesitaremos aprender a utilizar
lo que es para muchos un mundo desconocido y tenebroso, aun as conocer lo bsico de esta potente herramienta nos
va a permitir explotar nuestro sistema y ser mucho mas productivos en tareas tanto cotidianas como puntuales. Con esta
introduccin a la linea de comandos de Linux pretendemos explicar que es la shell, como utilizarla y explicar unos
comandos bsicos que nos van a ser de mucha utilidad.

Que es la Shell ?
El interprete de comandos permite ejecutar instrucciones que el usuario introduce va teclado o en un script y este le
devuelve los resultados. A este interprete se le llama Shell. Este shell es la concha ( shell es concha en ingles ) que
rodea el ncleo de Linux, es decir, es una interfaz que funciona en modo de texto con el cometido de comunicar a los
usuarios con el ncleo de Linux.

Existen varios shells como Bourne shell, C-shell, Korn-shell El shell por defecto en los sistemas Linux es Bash shell.
Este shell funciona en una terminal. Originalmente una terminal era una maquina que solamente poda ejecutar
instrucciones y obtener resultados por la linea de comandos pero hoy en da se utilizan programas que simulan
terminales en los diferentes entornos grficos de ventanas.
La lista de los shells presentes en tu sistema Linux se encuentra en el fichero /etc/shells

Linea de comandos
El shell espera instrucciones por el teclado en una linea llamada linea de comandos o prompt. Esta linea de comandos
nos ofrece cierta informacin fcilmente reconocible :

Esta linea de comandos nos informa de que el usuario asierph sin privilegios de administracin esta conectado a la
maquina lgica Manjaro en la posicin del sistema de ficheros Documentos.
La sealizacion de la posicin actual en el sistema de ficheros puede variar, dando la ruta completa /home/Documentos,
con el carcter ~ que indica directorio personal o ~/Documentos que indica que esta en el subdirectorio Documentos de
su directorio personal.
Ojo!

Sintaxis de los comandos


Los comandos GNU/Linux tienen una sintaxis del tipo :
Instruccin [parmetros] [argumentos]
No es necesario introducir los parmetros y los argumentos, si estos no se introducen se ejecutaran los que estn
programados por defecto.
Los parmetros son opciones del comando y normalmente se escriben mediante un guion y una letra ( -l por ejemplo ).
Se puede ejecutar mas de un parmetro por instruccin escribiendo guion y letra varias veces ( -l -a) o uniendo las letras
detrs del guion ( -la ).
Algunos parmetros o instrucciones requieren un argumento, por ejemplo el nombre de un fichero, que se colocara
detrs del parmetro separado por un espacio.
Ejemplo : >mkdir dir1 ( este comando creara la carpeta dir1 en la situacin actual en el sistema de ficheros )
El comando es mkdir y el argumento dir1 ( en este caso no hemos utilizado parmetros )

Se puede ejecutar varios comandos en una misma linea encadenandolos con punto y coma. Ejemplo >
date;cal ( ejecutara primero el comando date y despus el comando cal )
Concatena instrucciones

Comandos internos y externos


Los comandos pueden ser de tipo interno o externo
Interno : Estos comandos son internos a la shell, se ejecutan dentro de esta y forman parte de ella.

Externo : Los comandos externos son binarios dentro del sistema que son llamados cuando se ejecuta el comando
asociado, este comando se carga en memoria y se inicia como proceso.
Para saber si un comando es de tipo interno o externo podemos ejecutar la instruccin type [comando]. En el caso de
que el comando sea externo tambin nos indicara su ubicacin.

Historial
El shell conserva un historial de los comandos que vamos ejecutando y que podemos consultar con el comando history.
Tambin podemos navegar por este historial pulsando la flecha para arriba o la flecha para abajo de nuestro teclado.
Esto es algo de mucha utilidad ya que nos va permitir no tener que re-escribir los comandos utilizados hace poco.

Ayuda de las instrucciones


Es imposible conocer cada uno de los parmetros y argumentos de todas las instrucciones que tenemos a nuestra
disposicin pero esto no hace falta gracias a la ayudas que nos ofrece Linux. Tenemos tres tipos de ayuda que nos van a
ofrecer informacin sobre cada una de las instrucciones :

Ayuda interna del shell : Cuando necesitemos ayuda sobre comandos internos tenemos que utilizar esta
opcin. El comando en cuestin es >help . Si utilizamos help sin ningn parmetro nos devolver todos los comandos
internos. Si le pasamos como parmetro la instruccin de la que deseamos informacin esta nos devolver los
parmetros y argumentos que puede usar esta instruccin

Ayuda propia de los comandos : Los comandos pueden traer ayuda con ellos mismos, es decir, en el mismo
programa traern una ayuda que podremos llamar. Para llamar esta ayuda usaremos el comando >Instruccin
help ( doble guion ) , siendo instruccin la orden de la que queremos la informacin. No todos los comandos traen esta
ayuda por lo que puede que la instruccin nos devuelva un mensaje de error.

Ayuda en linea : Como tercera opcin tenemos el manual de Unix en linea. Esta opcin es la mas completa y la
que mas informacin ofrece. No esta asociada a ningn shell y vale en todos los sistemas Unix. Para llamar a esta ayuda
basta con >man instruccin donde instruccin es el comando del que queremos informacin.

Privilegios
Muchos de los comandos que vamos a presentar a continuacin necesitan privilegios para poder ser ejecutados. Para
llamar a un comando con derechos de administrador tendremos que colocar antes de la instruccin el comando >sudo
( por ejemplo >sudo shutdown ). Despus de ejecutar instrucciones con sudo el interprete nos pedir las credenciales de
administrador.
Tambin podemos ejecutar el comando >su con el que conseguiremos derechos de root, evidentemente el interprete
tambin nos pedir las credenciales de root.
Chiste muy Geek :)

Comandos bsicos

Comandos y una breve descripcin de las instrucciones mas bsicas de la linea de comandos.
Comandos de sistema

Comandos que nos van a servir tanto para obtener informacin de nuestro sistema como para apagarlo, reiniciarlo
Mostrar la arquitectura del PC >uname -m
Mostrar la versin del kernel usado >uname -r
Mostrar los componentes hardware del sistema >dmidecode -q
Mostrar fecha >date
Mostrar calendario >cal
Con el comando cal podemos usar parmetros tipo:
>cal 2013 ( nos mostrara el calendario de 2013 )
>cal 05 2013v ( nos mostrara mayo del 2013 )
Apagar el sistema >shutdown -h now
Reiniciar el sistema >reboot
Cerrar sesion >logout
Comandos de gestin de ficheros y directorios

Para gestionar nuestros ficheros y directorios tenemos una lista de comandos bsicos que nos van a ayudar con este
cometido.
Mostrar ruta completa >pwd
Nos muestra la ruta completa del directorio actual.
Contenido del directorio actual >ls
El comando ls nos mostrara el contenido del directorio actual.
Movernos por los directorios >cd
El comando cd sirve para movernos de directorio ( changue directory ).
>cd Documentos (esto nos situara en la carpeta Documentos).
>cd /etc/systemd/system/ (de esta manera nos situaremos en esta ubicacin directamente.)
>cd .. (subiremos un nivel. Por ejemplo si estamos en home/Documentos y hacemos cd .. nos situaremos en home)
>cd ( sin nada nos llevara a la carpeta de usuario.)
Crear directorios >mkdir
El comando mkdir ( make directory ) nos va permitir crear uno o varios directorios. Tambin podemos crear una estructura
completa.
>mkdir dir1 ( creara una carpeta dir1 en la posicin actual )
>mkdir -p dir1/dir2 ( creara una carpeta dir2 dentro de otra carpeta dir1 en la situacin actual en el sistema de ficheros )
Borrar directorios >rmdir
El comando rmdir ( remove directory ) remueve uno o varios directorios pero no puede remover estructuras. Funciona de
la misma manera que mkdir pero sin este detalle de las estructuras.
Copiar ficheros >cp

El comando cp ( copy ) nos permite copiar uno o varios ficheros.


>cp fichero1 fichero2 ( este comando ara una copia de fichero1 y lo guardara en fichero2)
Mover o cambiar de nombre a ficheros >mv
El comando mv ( move ) permite mover y/o renombrar un fichero.
>mv fich1 hola/fich1 ( movemos el fichero fich1 a la carpeta hola ).
>mv fich1 fich1.doc ( renombramos el fichero fich1 a fich1.doc ).
Suprimir ficheros y estructuras >rm
El comando rm ( remove ) eliminara un fichero o varios. Tambin podemos eliminar estructuras. Tenemos que tener en
cuenta que el borrado sera definitivo.
>rm fich1 ( Eliminamos fich1 )
>rm -r hola ( suprime la carpeta hola y todo el contenido de esta, tanto ficheros como directorios )
>rm -r dir1/dir2 ( Elimina la estructura dir1/dir2 )

Busqueda

La instruccin Find permite buscar ficheros en la estructura del sistema de ficheros con la ayuda de diferentes criterios. El
comando tiene una estructura tipo :
find [ruta] [criterios] [opciones]
El comando >find es recursivo por lo que cuando le indiquemos un directorio bsico nos devolver toda la estructura.
Como criterios de bsqueda tenemos diferentes opciones:

-size : para definir el tamao de los archivos buscados. ( Funciona por bloques de 512kb por defecto ). Se puede
utilizar un + o un despues del tamao para acotar la bsqueda por mas o menos del tamao especificado.

-name :para realizar una busqueda por nombre. ( Se especifica entre dobles comillas )

-type : seleccion por tipo de fichero ( Funciona con codigos, por ejemplo d son directorios )

-ctime, -mtime, -atime :Busqueda por fechas ( ctime = modificacion , mtime = ultima modificacion , atime =
ultimo acceso )
El comando por defecto es -print que nos imprimir por pantalla los resultados, pero existen otros como -ls que nos dar
informacin detallada del resultado.
La bsqueda de archivos trae consigo criterios y conceptos mas complejos que no traeremos aqu debido a que no es
nuestra intencion profundizar mucho.

Lnea de comandos de Linux : Entrada y salida estndar

Cuando ejecutamos comandos en la shell de Linux, normalmente los introducimos


con nuestro teclado y recibimos el resultado a travs de nuestra pantalla, sin embargo, es posible modificar esto y hacer
que tanto la entrada como la salida reciban y emitan la informacin por otra fuente. Este proceso se denomina re
direccionamiento, pero antes de empezar a hablar sobre esto, es mejor explicar unos conceptos bsicos para entender
bien cmo funciona la entrada y salida estndar en la shell de Linux.

La entrada y salida estndar


Por defecto, toda instruccin en Linux tiene tres canales bsicos por donde se trasmite la informacin, a estos canales se
les denomina como los canales de entrada, de salida y de error.
Nombre

Descriptor de fichero

Destino por defecto

entrada estndar (stdin)

teclado

salida estndar (stdout)

pantalla

error estndar (stderr)

pantalla

La mejor forma de entender estos tres canales es mediante una breve explicacin y unos sencillos ejemplos, para los
ejemplos vamos a utilizar los comandos echo y wc.
El comando echo de Unix imprime por la salida estndar lo que la entrada estndar le entrega.
El comando wc sirve simplemente para contar lneas, palabras y caracteres que contiene un archivo.
Comando echo y comando wc

La entrada estndar
La Entrada Estndar, en ingls standard input (stdin) es el canal por el cual un usuario le indica a los programas la
informacin que estos deben procesar. Por defecto, como ya he mencionado, es el teclado.
Cuando ejecutamos el comando echo le pasamos un argumento, este argumento tiene que proporcionarlo la entrada
estndar, que por defecto es el teclado. En el siguiente ejemplo este argumento es ovtoaster.
echo ovtoaster

La salida estndar
La Salida Estndar, en ingls standard output (stdout) es el mtodo por el cual el programa transmite la informacin al
usuario. Por defecto, la salida estndar es la pantalla.
En el caso de utilizar el comando echo anterior, el resultado obtenido seria :
ovtoaster
Este resultado lo obtenemos mediante el canal de salida estndar.

Canal de error estndar


El tercer y ltimo canal es el de error en ingls standard error output (stderr), que sirve para emitir los posibles errores
que se den al ejecutar una instruccin. Por defecto se emiten mediante la pantalla.

El re direccionamiento
Como hemos dicho, la entrada y salida estndar por defecto son el teclado y la pantalla, sin embargo es posible re
direccionar ambas a un fichero, de forma que una instruccin reciba la informacin mediante un fichero y/o la informacin
de salida de la instruccin sea almacenada en un fichero.

Re direccionar la salida
Existen dos mtodos para re direccionar la salida a un fichero:

Mediante > se redireccin el resultado de una instruccin a un fichero. Es necesario tener derechos de
escritura, si el archivo no existe, ste es creado, si ya existe, los contenidos existentes generalmente se pierden sin
previo aviso. Ejemplo :
echo ovtoaster > prueba1.txt
En esta instruccin el resultado de echo ovtoaster, que es ovtoaster sera almacenado en el fichero prueba1.txt ( en la
posicin actual en el sistema de ficheros )

Mediante >> se aade el resultado de una instruccin a un fichero, si no existe lo crea y si existe, lo
aade al final.
Ejemplo :

echo ovtoaster >> prueba1.txt


Con esta instruccin guardamos el resultado de echo ovtoaster en el final del fichero prueba1.txt.

Redireccionar la entrada
Para redireccionar la entrada estndar utilizamos el carcter <, de forma que la instruccin :
wc < prueba1.txt
Imprimir por la salida estndar el resultado de la instruccin wc del fichero prueba1.txt ( 2 2 20 ).

Redireccin de la salida de error


Se puede redirigir el error estndar utilizando el operador 2> o 2>>, dependiendo si se desea crear un nuevo fichero o
aadir datos a un fichero existente. Esta notacin se debe a que los canales de E/S estndar son nmeros asignados
( los descriptores ).

Tuberas o pipelines
Las tuberas (en ingls pipelines) son una herramienta con la que vamos a poder redireccionar la salida de un
comando a la entrada de otro, de forma que creamos una tubera de instrucciones en la que cada una va pasando el
resultado a la siguiente para terminar dando el ultimo resultado por la salida estndar. Lo mejor para entenderlo es utilizar
un ejemplo :
ls -l | sort -k5
Con este comando estamos tomando el resultado de ls -l ( listado de ficheros de la ubicacin actual en formato largo ) y
lo pasamos al comando sort -k5 que va a ordenador la informacin en funcin de la 5 tabla ( tamao ) y despus se va a
imprimir en la salida estndar, que en este caso es la pantalla.

Aprendiendo shell scripting en Linux: condicionales


y bucles

Los scripts son mucho ms que simples interpretes de comandos, estos poseen muchas
caractersticas propias de los lenguajes de programacin, y como en todo lenguaje de programacin, es posible y
necesario utilizarcondicionales y bucles . Tanto los condicionales como los bucles son los cimientos de cualquier
lenguaje de programacin, y en el caso de los scripts, nos van a dotar de lo necesario para conseguir mucha ms
profundidad y complejidad, adems de permitirnos realizar tareas que de otra forma seria imposible.

Antes de empezar
Antes de empezar con los condicionales y con los bucles es conveniente dedicarle un minuto a unos comandos que nos
van a ayudar con la elaboracin de ambos, no voy a dar ejemplos exclusivos de estas instrucciones, ya que voy a
requerirlos en los ejemplos de ms adelante y sera entonces cuando se comprenda su funcionamiento. Los comandos en
cuestin son los siguientes:

Comando Break
El comando break permite interrumpir un bucle, cuando un bucle llega a una instruccin break, el script continua
despus del done del mismo bucle.

Comando continue
El comando continue nos va permitir saltar lineas de una iteracin y pasar directamente a la siguiente.

Los comandos true y false


El comando true simplemente devuelve un 1, mientras que el comando false un 0. Mediante estos comandos es
posible realizar bucles infinitos, en los cuales la nica manera de salir es mediante el comando break o mediante la
instruccin exit.
Tanto los condicionales como los bucles utilizan

condiciones para determinar como actuar o cuando terminar, estas

condiciones las tenemos que determinar nosotros. Para esta tarea es conveniente conocer los siguientes conceptos:

Comparacin de cadenas alfanumricas

Operador

Verdad ( valor TRUE ) si

caena1=cadena2

cadena1 es igual a cadena2

cadena1!=cadena2

cadena es diferente a cadena2

cadena1<cadena2

cadena1 es menos que cadena2

cadena1>cadena2

cadena1 es mayor que cadena2

-n cadena1

cadena1 no es nula (longitud mayor que 0)

-z cadena1

cadena1 tiene un valor nulo (longitud 0)

Comparacin de valores numricos


Operador

Verdad ( valor TRUE ) si

varx -lt vary

varx menor que vary

varx -le vary

varx menos o igual que vary

varx -eq vary

varx igual que vary

varx -ge vary

varx mayor o igual que vary

varx -gt vary

varx mayor que vary

varx -ne vary

varx diferente que vary

Comparacin de atributos de fichero

Los condicionales
Los condicionales nos permiten realizar acciones solamente bajo las condiciones que nosotros
indiquemos, de esta forma, podremos ejecutar un conjunto de instrucciones nicamente cuando se cumpla una
condicin determinada. Tenemos dos tipos de condicionales :

Condicional If-then-else
El condicional if es el ms conocido y usado, su estructura es muy bsica:
if [condicin 1]
then
<comandos a ejecutar si se cumple la condicin 1>
else
<comandos a ejecutar si no se cumple condicin 1>
f
Si se cumple la condicin 1 se ejecutara el primer bloque de comandos, sino, el bloque despus del else. Vamos a ver
un ejemplo para que quede ms claro:
cat if.sh
#! /bin/bash
var1=$1
var2=$2

if [ $var1 = $var2 ]; then


echo "Son iguales"
else
echo "Son diferentes"
f

./if.sh hola hola


Son iguales
./if.sh hola adis
Son diferentes
En este ejemplo estamos recibiendo dos parmetros
instruccinecho si ambos son iguales o diferentes.

de posicin y los estamos comparando, indicando mediante la

Evaluacin mltiple con case-esac


Es posible comprobar el valor de una variable de forma mltiple, la mejor forma de verlo es mediante un ejemplo:
cat case.sh

#! /bin/bash
read a
case $a in
1)
echo "uno"
;;
2)
echo "dos"
;;
*)
echo "ni idea de que numero es"
;;
esac

./cate.sh
5
ni idea de que numero es
./cate.sh
1
uno
El script anterior lee una variable desde la entrada estndar con el comando

read y dependiendo su valor realiza un

echo u otro. En este caso si el valor que se lee con el read es 1 o 2, lo indica mediante echo, por lo contrario, indica: ni
idea de que numero es.

Los bucles
Los bucles nos permiten repetir un conjunto de instrucciones todas las veces que necesitemos, estas se repetirn hasta
que la condicin indicada en el bucle se cumpla. Es importante tener cuidado y controlar que la condicin del bucle
se vaya a cumplir en algn momento, sino caeremos en un bucle infinito y tendremos que interrumpir la
ejecucin del script. En bash tenemos los siguientes bucles:

Bucle For
Los bucles for en los shell scripts se basan en una o varias listas de elementos, que se asignan a una variable
sucesivamente.
Su sintaxis es la siguiente:
for var in lista
do
<comandos a ejecutar>
done
Los valores de lista se van sustituyendo en var hasta que ya no queda nada. Vamos a ver algun ejemplo para
comprender mejor el funcionamiento de este bucle:
Si no especificamos nada
cat for.sh

#! /bin/bash
for var
do
echo "$var"
done

./for.sh uno dos tres


uno
dos
tres
En el caso de no especificar ninguna lista al for, este utiliza los parmetros posicionales para el bucle, recorriendo cada
uno de ellos y en este caso realizando un echo para cada uno.

Con una lista explicita


cat for.sh

#! /bin/bash
for var in fch1 fch2

do
mkdir $var
done
Este script nos crea dos ficheros con el comando mkdir llamados fich1 y fich2.
Es posible realizar este bucle con otros elementos, como

criterios de bsqueda, con un contador, etc.

Bucle while
Con el bucle while creamos una iteracin condicional, de forma que, ejecutaremos una secuencia de comandos
continuamente mientras se cumpla la condicin. La estructura es la siguiente:
while condicin
do
<comandos a ejecutar>
done
Veamos un Ejemplo:

cat while.sh

#!/bin/bash
var1=30
echo "Introduzca un numero, a ver si aciertas:"
while true;
do
read var2
if [ $var1 = $var2 ]; then
echo "Numero Correcto"
break
else
echo "Numero incorrecto, vuelve a intentarlo :"
f
done

./while.sh

4
Numero incorrecto, vuelve a intentarlo:
30
Numero Correcto
En este ejemplo hemos realizado un bucle infinito mediante la instruccin true, que solo terminara cuando introduzcamos
el numero correcto (30).

Bucle until
El bucle until nos permite realizar un bucle condicional hasta que se cumpla una condicin, en el momento que se cumpla
esta condicin se sale del bucle. Su funcionamiento es prcticamente el mismo al del while , su
estructura es la siguiente:
until condicion
do
<comandos a ejecutar>
done
Vamos a ver un sencillo ejemplo en el que vamos a recorrer
iteracin, en la vuelta que nos encontramos.

cat until.sh

#!/bin/bash
cont=5
until [ $cont -lt 1 ];
do
echo Vuelta numero : $cont
let cont=cont-1
done

./while.sh
Vuelta numero : 5
Vuelta numero : 4
Vuelta numero : 3
Vuelta numero : 2

un contador desde 5 hasta 1, indicando en cada

Vuelta numero : 1
Bucle select
El bucle select nos va permitir crear mens, con seleccin por numero. La insercin se efecta mediante el teclado, y si
el valor que damos no esta en el rango valido, el men se imprime de nuevo, hasta que insertemos un valor correcto.
Su estructura es la siguiente:
select variable in lista_contenido
do
<comandos a ejecutar>
done
Un ejemplo:
#!/bin/bash
select eleccion in op1 op2 op3
do
if [ $eleccion ];
then
echo "Opcion elegida: $eleccion"
break
else
echo "Eleccin incorrecta"
f
done
En este ejemplo tenemos 3 opciones, la eleccin que hagamos influir en el valor de la variable

eleccion, adems una

vez elegido un valor correcto entre 1-3 entraremos en la secuencia de instrucciones then con su respectivo break.
Mientras no insertemos un valor entre 1-3 entraremos por el else y el bucle continuara.

Aprendiendo shell scripting en Linux: Las


funciones
Cuando realizamos scripts de pocas o por lo menos no demasiadas lineas, suele ser suficiente con la tpica
programacin estructurada: Empezamos desde arriba y escribimos todas nuestras sentencias hacia abajo hasta que
nuestro script termina. Pero cuando el script que estamos programando se complica y empieza a contener demasiadas
lineas, y sobre todo cuando alguna tarea del script se realiza dos o ms veces, es conveniente utilizar una
herramienta que nos evitara repetir lineas de cdigo y nos ayudara a estructurar mejor el script: Las funciones.

Que son las funciones?


Las funciones son trozos de cdigo dentro del script, que bsicamente, funcionan como un script independiente. En otros
lenguajes de programacin son denominados como procedimientos o sub-rutinas y su cometido es evitar duplicacin de
cdigo y dividir un problema en problemas ms pequeos, para que sean ms fciles de solucionar, ya sabis por eso
de: divide y vencers.
Normalmente las funciones se usan cuando un bloque de cdigo se va a ejecutar varias veces dentro del script, de forma
que en vez de duplicar este cdigo a lo largo del script, creamos una funcin que contendr este mismo cdigo, y
llamaremos a la funcin cuando sea requerido.

Defnicin y llamada de las funciones


Las funciones en bash se pueden definir de dos formas, la primera es:
function nombre_funcin(){
cdigo_de_la_funcin
}
y la segunda manera es igual, pero sin la palabra reservada function:
nombre_funcin(){
cdigo_de_la_funcin
}
Para llamar a una funcin basta con usar su nombre, y si queremos pasar parmetros a una funcin, los pasaremos
despus de su nombre:
function nombre_funcin(){
cdigo_de_la_funcin
}

nombre_funcin $parametro1 $parametro2


Tanto la declaracin como la llamada de las funciones no tiene mucho misterio, por lo que la mejor manera de explicar su
funcionamiento es mediante ejemplos.

El ejemplo ms sencillo: Hola mundo


El ejemplo ms sencillo del que podemos hablar es el tpico holamundo, sin ningn parmetro:
#! /bin/bash

# Declaramos la funcin holamundo


function holamundo(){
echo "Hola Mundo!"
}
# Llamamos a la funcin holamundo
holamundo
El resultado del script es:
Hola Mundo!
Como vemos la funcin holamundo contiene una nica instruccin, echo. Lo ms importante en este ejemplo es
comprender el momento de ejecucin de este echo: Se ejecuta cuando se realiza la llamada a la funcin, es decir, en la
ultima linea del script.

Aadamos parmetros al asunto


En este segundo ejemplo vamos a utilizar los parmetros, que funcionan de la misma manera que con los bash
scripts en general. Se crea una funcin y con los parmetros de posicin ( $1 $9) podemos hacer referencia a
variables que sern enviadas en el momento en el que llamemos a la funcin:
#! /bin/bash

#Declaramos la funcin suma


function suma(){
local a=$1
local b=$2
echo $(( $a + $b ))

}
# Llamamos a la funcin Suma
suma 2 3
En este ejemplo imprimimos por la salida estndar la suma de dos variables mediante echo. Como se puede
observar, dentro de la funcin creamos dos variables (a y b), les asignamos los valores de los parmetros pasados a
la funcin ( $1 y $2) y en la tercera linea imprimimos la suma de las dos variables generadas.
Se podra simplificar haciendo echo $(( $1 + $2)), pero de esta manera, podemos observar una declaracin de variables
exclusiva de las funciones: local.
Cuando declaramos una variable con local, esta pasa a ser exclusiva de la funcin en la que es creada, por lo que no
sera posible utilizarla desde fuera de de la misma funcin. Tambin es posible crear variables de la manera tradicional, de
forma que estas sern utilizables fuera de la funcin, pero solamente despus de llamar a la funcin en la que se gener
la variable.

Valor de retorno
Cuando una funcin termina su ejecucin genera un estado de salida, el valor de este estado estar determinado por el
ultimo comando de la funcin: si este se ha ejecutado correctamente el estado de salida tomar el valor cero, sino tomar
como valor un error. Este estado se almacena en la variable global: $?, de forma que si queremos acceder a este valor lo
haremos mediante esta variable.

Return
Este estado de salida en si, no es demasiado til, pero gracias al comando return podemos hacer que adquiera el valor
que necesitemos. La instruccin return puede recibir un argumento como parmetro, de forma que cuando llamemos a
return la funcin terminara su ejecucin y el estado de salida tomara el valor de este argumento.
Analicemos el funcionamiento de return con el ejemplo anterior, pero con una pequea variacin:
#! /bin/bash

#Declaramos la funcin suma


function suma(){
local a=$1
local b=$2
return $(( $a + $b ))
}
# Llamamos a la funcin Suma
suma 2 3
retorno=$?

echo $retorno
Vemos como la funcin en vez de realizar un echo, utiliza la instruccin return para devolver la suma de los dos
parmetros de posicin. Despus se ejecuta la funcin y entonces guardamos el estado de salida en la
variable retorno para despus imprimirla por la salida estndar mediante echo. El resultado es el mismo que en el
ejemplo anterior, es decir: 5.

Recursividad
Entre todas las posibilidades que dan las funciones, una de ellas es la recursividad. Una funcin recursiva es la que se
llama a s misma dentro de su cdigo, es una tcnica que se suele usar para simplificar algoritmos complejos. En
este apartado podramos tirarnos un buen rato, pero no estamos aqu para aprender sobre recursividad, por lo que me
voy a limitar a explicar un ejemplo tpico de la recursividad: el factorial de un numero.
#!/bin/bash
# Declaramos la funcin factorial
function factorial()
{
if (( $1 < 2 ))
then
echo 1
else
# Aqu realizamos la recursividad llamando a factorial desde factorial
echo $(( $1 * $(factorial $(( $1 - 1 ))) ))
f
}
# Llamamos a la funcin
factorial $1
Como vemos, la funcin factorial recibe un nmero y con ese nmero llama recursivamente otra vez a factorial pero
decrementado en uno este nmero, hasta que llega a uno y termina, volviendo hacia atrs y dando el valor de la
recursividad por la salida estndar.

Algunas consideraciones extra


Bsicamente las funciones no tienen ms, pero evidentemente como en cualquier tipo de programacin, podrn adquirir
la complejidad que sea necesaria segn el problema que necesitemos resolver. Aun as, antes de terminar, quiero hablar
de ciertos aspectos de las funciones:
Si se crean dos o ms funciones con el mismo nombre, al llamar a la funcin, se llamar a la ltima de las funciones
declaradas.

No es posible crear una funcin sin cdigo, por muy absurdo que sea ( error al ejecutar el script)
No se puede llamar a una funcin antes de definirla.
Las llamadas a funciones son como utilizar un comando ms.

Potrebbero piacerti anche