Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Construcción de Scripts Básicos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

9.

1Control de flujo

Como lenguaje de programación el “shell” (bourne shell) no permite trabajar


con variables y primitivas de control de flujo para manipular estructuras
simples, condicionales y repetitivas.

9.1.1 Variables “SHELL”


El “shell” nos provee de diversos mecanismo para crear variables
destinadas a ser usadas en archivos de comandos. Los nombres de
variables se conforman por secuencias de letras, dígitos y / o subrayados
(‘_’), debiendo ser su primer carácter una letra.

Su uso está destinado tanto para asignar valores como para abreviar
cadenas de caracteres de uso frecuente. Los valores se designan ya sea
mediante una sentencia de asignación, o invocando un comando cuyos
argumentos son vistos como variables o valores de éstas, según si van
precedidos por el meta carácter ‘$’.

En una misma sentencia de asignación puede aparecer más de una


asignación, debiendo tenerse presente que el “shell” realiza la asignación
de derecha a izquierda.

Ejemplo:

a=$b b=abc (sh)

El resultado que se obtiene es que a la variable a le es asignado el valor


‘abc’.

Ejemplo:

Figura 9.1 Válidación de una variable


Fuente: Elaboración propia

La primera línea representa una sentencia de asignación, donde se asigna


el valor ‘antonio’ a la variable usuario; en tanto que la segunda línea invoca
el comando ‘echo’ con el argumento $usuario, que es la variable a la que se
le asignó previamente el valor ‘antonio’. La ejecución de este archivo
arrojará en pantalla el valor ‘antonio’.
Ejemplo:

Figura 9.2 Válidación de la variable $a


Fuente: Elaboración propia

En este otro ejemplo, debe visualizar si antonio es un directorio.

También es posible asignar una cadena de caracteres nula a una variable,


especificándolo como sigue:

<nombre-variable>=

Ejemplo:
~#%usuario=

Existen ciertas variables a las cuales se le llaman parámetros posicionales;


éstos son creados implícitamente toda vez que es invocado un archivo de
comandos. Este llamado es realizado mediante una línea de comando en el
que cada uno de sus argumentos es asignado a los parámetros posicionales
$1, $2,…respectivamente. El nombre del comando es asignado al parámetro
$0.

El número de parámetros posicionales es asignado a la variable $#. Esta


última variable es de interés, sobre todo cuando se trata de revisar el número
de argumentos que incluyen una línea de comando, como veremos más
adelante.

Otras variables “Shell”, y cuyo uso veremos en adelante, son las siguientes:

$0, $1, $2,… son variables posicionales. También reciben el nombre de


parámetros posicionales. Los valores que toman son cada una de las
secuencias de caracteres separados por espacios en blanco contenidas en
las líneas de comandos.

A continuación, se muestran ejemplos de variables en ambiente shell (sh).

Variable ambiente Significado


$# Número de parámetros
posicionales.
$! Número del último proceso
“background” (sumergido).
$$ Número del proceso actual.
Indica el código de retorno del
último comando ejecutado, y
$? cuyo valor es cero si su ejecución
ha sido exitosa, y otro valor en
caso contrario.
Variable que define el argumento
por defecto del comando cd; de
$HOME esta forma ‘cd’ es equivalente a
‘cd $HOME’.
Variable que define los
$PATH directorios que interesa recorrer
en la búsqueda de comandos.
$PS1 Variable que contiene el
indicador o rótulo del “shell”
(prompt).
$PS2 Contiene un prompt alternativo.
$USER Contiene el nombre de la cuenta.

Tabla 9.1 Variables ambientes y su significado


Fuente: Elaboración propia

En caso de que desee obtener el valor de algunas de estas variables se


procede haciendo uso del comando echo.

Ejemplo:

~#echo $PS1

Figura 9.3 Variable $PS1


Fuente: Elaboración propia

~#echo $PATH

Figura 9.4 Variable $PATH


Fuente: Elaboración propia
~#echo $HOME

Figura 9.5 Variable $HOME


Fuente: Elaboración propia
~#echo $$

Figura 9.6 Variable echo $$


Fuente: Elaboración propia

9.2 Comentarios en los scripts

En un script todo lo relacionado con un comentario se realiza con el símbolo


# y hasta el siguiente carácter se toma como un comentario y no se ejecuta.

Ejemplo:

Figura 9.7 Inserción de comentarios


Fuente: Elaboración propia

sólo imprime “bienvenidos”

En este otro ejemplo:

Figura 9.8 Otro ejemplo se inserción de comentarios


Fuente: Elaboración propia

no ejecuta nada, debido a que la instrucción cat tiene delante el carácter #,


que hace que toda la instrucción se convierta en simple comentario.

Por lo tanto, en la construcción de script, todos, empiezan su encabezado


con un comentario, lo que nos permite indicar el nombre del archivo y lo que
hace el script. A su vez, se incorporan comentarios de documentación en
diversas partes del script permitiendo así mejorar la comprensión y lectura.

De igual forma, el uso del carácter # al inicio de la primera línea le está


indicando al intérprete con que se ejecutará el script.

Veamos el siguiente ejemplo:


Figura 9.9 Script misdatos.sh
Fuente: Elaboración propia

Se observa en la primera línea que le script será ejecutado con el intérprete


del comando bash. Esto debe ir siempre en la primera línea del script y no
puede tener caracteres en blanco.
9.3 Estructura repetitivas

Para implementar procedimientos repetitivos se dispone de la siguientes


estructuras:

Estructura for

Formato:
for <nombre> [in <p1> <p2> …]
do
<lista-comandos>
done
donde:

Es una secuencia de comandos,


<lista-comandos> separados un cambio de línea
(newline) o el meta carácter ‘;’

Es una variable “shell” que


<nombre> asume los valores indicados en
<p1>, <p2>,…

Son palabras reservadas: for, in, do, done.

La estructura definida se repetirá tantas veces como valores <p1>, <p2>,


… aparezcan y la variable <nombre> asumirá cada uno de estos valores
para cada vez que se efectúe el ciclo. Cada ejecución del ciclo implica la
ejecución de la secuencia de comandos indicada.

Si se omiten ‘in <p1>, <p2>…’, el ciclo es ejecutado usando los parámetros


posicionales $1, $2, …
Ejemplo:
Construya y pruebe el siguiente script.
El script se va a llamar listapalabras.sh

Figura 9.10 Script listapalabras.sh


Fuente: Elaboración propia

Se puede observar la creación de una variable ambiente, la cual va a


contener una cadena de caracteres. Luego esta misma variable es
invocada a través de la variable I mediante la estructura for. La sintáxis
echo $I, visualiza el contenido de la variable I.

Ejemplo:
Construya y pruebe el siguiente script.
El script se va a llamar nombresyarchivos.sh

Figura 9.11 Script nombresyarchivos.sh


Fuente: Elaboración propia

El archivo denominado nombresyarchivos.sh, inicializa el archivo con un


contador, CUENTA, el cual inicializa en cero. A su vez, en una variable
denominada ARCH, incorpora todos los nombres y cuentas de archivos
del directorio actual para posteriormente invocarlos a través de la
expresión (CUENTA =’expr $CUENTA + 1’).

Estructura while

Formato:
while <lista-comandos-1>
do
<lista-comando-2>
done
donde:

Es una secuencia de comandos


<lista-comandos-1> a ser ejecutada y que representa
una condición.

Es la secuencia de comandos a
ser ejecutada. Si la condición
<lista-comandos-2> representada por <lista-
comandos-1> es satisfecha, lo
que se refleja por el valor cero de
la variable de estado $?
Asociada.

Son palabras reservadas: while, do, done.

La <lista-comando-2> se repetirá en tanto que la condición expresada por


<lista-comando-1> se cumpla:

Ejemplo: El siguiente script crea una listado de números de 0 a 10.

Figura 9.12 Script listado.sh


Fuente: Elaboración propia

Se crean dos variables, una denominada contador para inicializar la pila


y termina que permite llegar hasta el valor 10. Se compara la variable
termina con la variable contador mediante el parámetro -ge (si es mayor
o igual). A través del comando let se incrementa la variable contador en
1.

Ejemplo: En este script se verifica el contenido del archivo test


mediante el uso de la variable $1.

Figura 9.13 Script test.sh


Fuente: Elaboración propia

test $1 prueba que el contenido de $1 sea un archivo existente.

El resultado que se obtendría de ejecutar el script anterior sería:

Figura 9.14 Resultado de ejecutar nombresyarchivos.sh


Fuente: Elaboración propia
Esta estructura es equivalente a:
for i
do
cat
done

Ejemplo: Este script permite borrar con confirmación todos los archivos
indicados como argumentos desde la línea de comandos.

Figura 9.15 Script borrar.sh


Fuente: Elaboración propia

Ejemplo: Este script permite hacer múltiples copias de archivos a


pares. En cada iteración desaparecerán los argumentos 1 y
2, respectivamente.
Figura 9.16 Script múltiplescopias.sh
Fuente: Elaboración propia

Estructura until

Esta estructura es similar a la estructura while, con la salvedad de que


primeramente es ejecutada la <lista-comandos-2> y luego la condición
expresada por <lista-comando-1>

9.4 Estructura alternativas

La implementación de procedimientos alternativos es realizada apelando a


las siguientes estructuras:

Estructura case

Formato:
case <palabra> in
<alternativa-1> <lista-comandos-1>;;
<alternativa-2> <lista-comandos-2>;;

esac

donde:
Es una secuencia de comandos
separados por un cambio de
línea (newlinea) o el meta
<lista-comandos-i> carácter ‘;’. El término de la lista
de comandos es representado
mediante el meta carácter ‘;;’.

Es la variable que será cotejada


<palabras> con cada una de las alternativas
en el orden en que ellas
aparecen.

Es la alternativa a ser cotejada


con el valor de la variable
<alternativa-i> <palabra>. La alternativa por
defecto es simbolizada con el
meta carácter ‘*’.

Son palabras reservadas: case, in, esac.

Mediante esta estructura el “shell” coteja el valor de la variable <palabra>


con cada una de las alternativas y en caso de encontrarla es ejecutada la
lista de comandos asociada a la alternativa pertinente. En caso contrario es
ejecutada la alternativa ‘*’.

Ejemplo:
Construya un archivo de comando de nombre ‘encolar’ que al
llamarlo me permita incorporar el contenido de un archivo en la
cola del contenido de otro archivo.

Figura 9.17 Script encolar.sh


Fuente: Elaboración propia

La variable ‘$#’ contiene el número de argumentos que se incluya en la línea


de nombre encolar.

Asumamos el siguiente llamado al procedimiento definido:

~#%encolar antonio hector

Y su ejecución provocará que el contenido del archivo antonio se incorpore


en la cola del archivo hector.

Si el comando encolar incluye más de 2 argumentos en el archivo de salida


por defecto, generalmente la pantalla, se obtendrá el mensaje que indique
su uso correcto.

Si se incluye un único argumento el contenido del archivo de entrada por


defecto, generalmente el teclado, es copiado en la cola del archivo
mencionado por el argumento:

~#%encolar antonio

Ejemplo: El siguiente script construye un menú. Lo llamaremos menú.sh

Figura 9.18 Script menú.sh


Fuente: Elaboración propia

Estructura if

Formato:
if <lista-comando-1>
then
<lista-comando-2>
fi
donde:

Es una secuencia de comandos


<lista-comandos-1> a ser ejecutada y que representa
una condición.

Es la secuencia de comandos a
ser ejecutada. Si la condición
<lista-comandos-2> representada por <lista-
comandos-1> es satisfecha, lo
que se refleja por el valor cero de
la variable de estado $?
asociada.

Son palabras reservadas: if, then, fi.

Ejemplo:

if test $# -lt 2;

then
echo ‘se requieren 2 o más argumentos’
fi

Esta estructura puede ser representada también como sigue:

<lista-comandos-1> && <lista-comando-2>

Otro formato, pero con un significado inverso es el siguiente:

<lista-comandos-1> || <lista-comando-2>

Por lo tanto, <lista-comando-2> es ejecutada sólo si la condición reflejada


por <lista-comando-1> no se cumple.

Ejemplo:
if test -f “$1” #es $1 un archivo?
then
pr $1
fi
que también podríamos haber escrito de la siguiente forma:

test -f “$1” && pr $1

Un formato más general de la estructura consiste en agregar la cláusula


else que permita incorporar la lista de comandos a ejecutarse.
Si la condición no es satisfecha:

if <lista-comandos-1>
then
<lista-comando-2>
else
<lista-comando-3>
fi

Ejemplo:

if test -f “$1” #es $1 un archivo?


then
pr $1
else #en caso contrario es un directorio
(cd $1; pr*)
fi

Múltiples condiciones pueden ser incluidas usando la cláusula elif, de else-


if, como se muestra en el siguiente ejemplo.

Veamos el siguiente script, denominado archivoodirectorio.sh, en el cuál


se prueba que la variable “$1”, no es un directorio ni un archivo.

Figura 9.19 Script archivoodirectorio.sh


Fuente: Elaboración propia

El comando test válida condiciones y devuelve valores de cierto (0) o falso


(distintos de 0), según los criterios del shell.

Por otra parte, la condición [-f “$1”] es cierta si el archivo existe y es un


archivo normal. El parámetro -d, válida si es un directorio.

También podría gustarte