Está en la página 1de 11

I

TEMA 9: Programaci6n en shell



9. 1 Almacenamiento de ordenes del shell en ficheros 9.2 Uso de variables

9.3 Argumentos en linea de orden 9.4 Control de fluio

9.5 Expresiones. Orden test 9.6 Otras ordenes titiles

9.7 Calculos en programacion shell 9.8 Funciones

9.9 Deteccion de interrupciones: traps

9.1 Almacenamiento de ordenes del shell en ficheros

Es conocido que cualquier orden 0 secuencia de 6rdenes de shell puede ser almacenada y ejecutada desde un fichero script.

De esta forma el interprete de comandos ejecuta 6rdenes que provienen, no desde el terminal 0 entrada estandar sino desde el contenido de un fichero de texto.

Para ello, si un fichero es un script y se desea ejecutarlo se hara:

sh < fichero 0 sh fichero

Tambien el Linux:

bash < fichero 0 bash fichero

Otra forma es activar el permiso de ejecuci6n del fichero y ejecutarlo poniendo el nombre simplemente. De esta forma el Bourne shell 0 el Bourne Again shell de Linux puede ser considerado como un Lenguaje Interprete que permite realizar programas sin tener que recurrir a un lenguaje de prograrnacion especifico. Y por tanto, los scripts pueden ser considerados programas shell.

Los elementos que utiliza la programacion shell (Bourne) son:

• Variables
• Metacaracteres
• Estructuras de control
• Ordenes shell
• Funciones Los programas shell 0 shell-script pueden incluir comentarios del programador. Para ello, se utiliza el metacaracter #. Todo 10 que se escriba en la misma linea de orden a continuacion del caracter # es ignorado por el shell.

9.2 Uso de variables

Una variable se caracteriza por poseer un nombre simb6lico, un valor 0 contenido, y un tipo determinado. EI interprete shell admite nombre el simb6lico que se de see utilizar, siempre que no coincida con el nombre de una palabra reservada (6rdenes, metacaracteres, estructuras de control, variables de entorno, etc.)

EI interprete de shell no distingue entre variables numericas y alfanumericas, a cualquier variable se Ie puede dar cualquier valor. De forma que, una variable puede ser utilizada en cualquier lugar donde sea posible utilizar el valor que contiene.

La asignaci6n de un valor a una variable se realiza mediante:

nombre=valor (si el valor es alfanumerico y tiene espacios en blanco debera entrecomillarse)

La sustituci6n (obtenci6n del valor) de una variable se realiza:

$nombre

Aunque existen las siguientes sustituciones condicionales segun la variable nombre tenga 0 no valor, 0 este 0 no definida. A continuaci6n vamos a relacionar todas las posibles sustituciones condicionales y el resultado que provo ca. Para poder ver el resultado es necesario utilizar la orden echo.

${nombre:-val} La variable se sustituye por su valor 0 por val si esta vacia 0 no definida. Es decir, no se asigna el valor a variable.

${nombre:=val} Igual que la anterior, ademas se asigna val a nombre si esta vacia. ${nombre:?mensaje} La variable se sustituye por su valor 0 emite el mensaje por pantalla y se detiene la ejecuci6n si esta vacia.

${nombre:+val} La variable se sustituye por val si tiene valor 0 por nada si esta vacia.

9.3 Argumentos en linea de orden: Variables Internas y Parametros posicionales

Existen determinadas variables de entorno, relacionadas con la obtenci6n de los parametros pasados al proceso que se ejecuta, vamos a recordar cuales son:

$0, $1, $2, ... , $9

$*

y ~lo~ ~eR~d~:.~gu~,ento e~i lin~a de ord~~

~v .. I .,.;~ ,_,)~,,~ __ '~-'\f}, _:"<~ _) t_~_\._'_'.'

Valor de todos los argumentos

$# $?

i..

Valor del numero de argumentos c,'\J "'\"'i 'Of \ T ·'i. .t-: •. if i».,

Valor de retorno del ultimo mandato: cero si se ha ejecutado bien y se interpreta como verdadero. Distinto de cera si se ha ejecutado mal y se interpreta como falso.

9.4 Control de fluio

En cualquier lenguaje, las estructuras de control permit en al programador controlar el flujo de ejecucion para establecer las condiciones logicas necesarias, tendentes a la resolucion de un problema determinado.

La programacion shell dispone de las siguientes estructuras de control:

o Seleccion Simple

Se admit en dos formas sintacticas segun se separen los elementos de la seleccion mediante el caracter ";" 0 el de nueva linea.

Sintaxis Forma 1:

if expresion ; then 000

[else 0 0 0 ;] fi

Sintaxis Forma 2:

if expresion then

[else

.. 0]

fi

Donde expresion puede ser el valor de una variable 0 el valor de retorno de una orden. Recuerdese que la rnayoria de las ordenes devuelven un valor numerico de retorno despues de su ejecucion.

Si expresion se resuelve con valor cero (true) se ejecutaran las ordenes de la parte del then y hasta el else, en caso que expresion se evalue distinto de cero (false) se ejecutaran las ordenes de la parte del else y hasta elfi.

o Seleccion por casos 0 sentencia condicional multiple Sintaxis:

case $VAR in valor1) . 0 0

... , ,

valor2lvalor3) ValorN) 000;; *)

esac

... , ,

Se ejecutan las ordenes entre el caracter ")" y la cadena ";;" del valor correspondiente a la variable V AR. La salida de la estructura se produce por la ejecucion de las ordenes del *, si la variable toma valor diferente a todos los indicados.

Es posible indicar varios val ores antes de cada parentesis, separandolos con el caracter "I". Tambien se puede utilizar como patron los caracteres "[]" indicador de rango y "?" que eouivale a cualauier caracter.

(

,,'

[v"'V Repeticion con condicien inicial 0 tipo mientras Sintaxis:

while expresion do

1 ,

lu' '.

r" J?,' I' c,

r\t- --it"

'l>' I,

r

done ~;! feO& n (CC./t-. r

Se ejecutan las 6rdenes situadas entre do y done, mienfras la expresi6n sea verdadera (cero). Si la expresi6n no es verdadera en un principio, no se Uegan a ejecutar ninguna vez las 6rdenes contenidas en estructura.

Si se especifica como expresi6n el signa ":", se genera un bucle infinito e incondicional.

. Estructura de Repetieion complementaria a while Sintaxis:

until expresion do

done

Se ejecutan las 6rdenes situadas entre do y done, mientras la expresion no sea verdadera (distinto de cero). Si la expresi6n es verdadera en un principio, no se llegan a ejecutar ninguna vez las 6rdenes contenidas en la estructura.

. Repeticion por casos Sintaxis:

FOR var IN valorl valor2 ... valorN do

done

Las 6rdenes situadas entre do y done se ejecutan tantas veces como valores existan tras la particula in, de manera que, la variable var ira tomando sucesivamente cada uno de esos val ores al principio de cada vuelta de bucle.

Los val ores pueden sustituirse por comodines, u 6rdenes entre comillas inversas. Veamos algunos ejemplos:

(>/'---'~--.,.--,

for f in 1 2 3 4 5 do

more ejer$f.c done

Este ejemplo muestra todos los ficheros .c que empiecen por uno de los nUmeros especificados.

for fichero in *.c do

echo $fichero done

Este ejemplo muestra todos los ficheros con extension .c

Is *.c > temp

)

.'

4

for fichero in 'cat temp' (6 tambien: for fichero in 'ls *.c') do

echo $fichero done

Este ejemplo muestra otro ejemplo de listar todos los ficheros con extension .c

El shell permite la utilizaci6n de 6rdenes multilinea en linea de comandos, es decir, una misma orden puede extenderse en varias lineas.

Cuando se pulsa la tecla de ejecuci6n de orden [INTRO] y la orden no ha finalizado, aparece automaticamente el valor della variable PS2, que represent a el prompt de segundo nivel cuyo valor por defecto es el caracter ">". Por ejemplo:

$ if [ $VARIABLE ]

> then # > prompt de segundo nivel

> echo -e "VAR esta definida y su valor es $VAR \n" > fi

$

Son utiles si se utilizan 6rdenes 0 estructuras de controllargas en linea de 6rdenes.

Algunas estructuras de control (if, while y until) incluyen en su sintaxis una expresi6n. Esta expresi6n puede tomar:

• EI valor de una variable

• EI valor de una orden

• El valor de una expresi6n condicional

De manera que, la expresi6n se evalua como true si toma valor 0 y como false si toma valor distinto de O.

La orden test: permite evaluar una expresi6n condicionaL De esta forma, es posible establecer las condiciones del problema.

Evaluaci6n de expresiones condicionales: test

EI efecto que produce es evaluar como falso si el argumento no esta definido.

La sintaxis es:

test argumento (0 bien la abreviatura I argumento ]

En la abreviatura los espacios en blanco antes y despues de los corchetes son necesarios. ill argumento es una expresi6n condicional de los siguientes tipos:,

Argumento

LA ORDEN TEST

Valor que devuelve PARA FICHEROS

True si existe fie y no esta vacio True si existe fie y es ordinario True si existe fie y es directorio True si existe fie y es de lectura True si existe fie y es de escritura True si existe fie y es de ejecucion

Negacion de todo 10 anterior

-s fichero

-ffichero

-d fichero

-r fichero

-w fichero

-x fichero

! -argumento fichero

PARA CADENAS (con valor entre comillas dobles)

$A = cadena True si son iguales

$A != cadena True si no son iguales

-n cadena True si no esta vacia

-z cadena True si esta vacia

! -n 0 -z cadena Negacion de todo 10 anterior PARA VALORES NUMERICOS

nl -eq n2 True si son iguales

nl -ne n2 True si no son iguales

nl -gt n2 True si nl > n2

nl -ge n2 True si nl >= n2

nl -lt n2 True si nl < n2

nl -le n2 True si nl <= n2

Las expresiones condicionales anteriores pueden agruparse entre parentesis y combinarse con los operadores logicos -a (AND), -0 (OR) y ! (NOT~ para formar expresiones condicionales compuestas.

9.6 Otras ordenes utiles

A continuacion vamos a relacionar otras ordenes relacionadas con la programacion shell que nos van a permitir completar scripts mas complejos:

. read: Acepta informacion desde la entrada estandar, La sintaxis es:

read variable

Permite leer datos desde el terminal hasta encontrar un [INTRO] 0 un final de fichero, Y los almacena en una variable.

· exit: Provoca la salida del programa. La sintaxis es:

exit [mimero]

Provoca la salida del script al proceso anterior. Tras la orden puede ponerse un valor numerico que sera el valor de retorno del programa.

· export: Propagacion del entorno. La sintaxis es:

export V ARt [V AR2 ... V ARn]

Propaga las variables a los subshells.

· readonly: Variable de solo lectura. La sintaxis es:

readonlyvar

No permite aIterar el valor de una variable.

· break: Interrupcion del bucle. La sintaxis es:

break

Interrumpe cualquier repeticion.

· continue: lnicio de repeticion. La sintaxis es:

continue

Hace comenzar una repeticion desde un punto intermedio del bucle.

· shift: Desplazamiento de argumentos de shell. La sintaxis es:

shift

Desplaza los argumentos que recibe un programa shell una posicion a la izquierda. El argumento 1 desaparece y el i = i - 1.

. set y sh: Depuradores de programas shell. La sintaxis es:

set [-1+ x v] (- activa, + desactiva) sh [-v] [-x] [script]

• [ -v]: A medida que va ejecutandose el script este va apareciendo en pantalla.

• [ -x]: Ejecucion paso a paso y se visualiza interpretando ordenes.

Las ordenes set deben incluirse en el script a depurar, mientras que sh se ejecuta desde la linea de ordenes.

Devolucion de secuencias de terminal: Orden tput.

Obtiene de terminfo las secuencias de escape asociadas con una accion sobre el terminal actual. Asi, las secuencias de escape quedan determinadas mediante un nombre independiente definido para cada terminal. Puede ocurrir que determinadas secuencias no se encuentren definidas para determinados terminales. Se puede ver en lusr/lib/terminfo. La sintaxis es:

tput [nombre_ secuencia _ terminal]

clear Borrado de la pantalla
bold Video brillante
blink Video parpadeante
n Scroll hacia abajo
ind Scroll hacia arriba
CIVIS Cursor invisible
CVVIS Cursor Visible
cup I c Posiciona el cursor en la linea I
columna c
setb n Fija el color del fondo con el codigo n
setfn Fija el color de la tinta con el codigo n
sgrO Valores por defecto ~{\\;Cl HO

Para gestionar la salida por pantalla, tambien pueden utilizarse las secuencias de los caracteres de barra invertida, que suelen intervenir fundamental mente con la orden echoL con su opcion -e, y que son:

echo -e

, '> i.' t

Backspace

No avanza un caracter tras escribir

en pantalla lev! k d >Jl,.j (~ \;b\i.cL')

A vance de pagina

Retorno de carro

A vance de linea mas retorno de carro

T abulador horizontal

Escribe por pantalla el caracter \ ya que este caracter inhibe la interpretacion del siguiente

Pitido, beep. ..

1c....t;vlldt\ \ilJltitcD

Se pueden afiadir nuevas secuencias de escape asociadas a un terminal. Para ello habra que definirlas y compilarlas posteriormente con la orden tic. La sintaxis es:

tic [opciones] [fichero jlescripcien]

La orden tic compila un fichero conteniendo una descripcion de terminal en formato fuente y afiade el resultado en terminfo.

9.7 Calculos en programacion shell

Imaginar que a una variable se Ie asigna un valor nurnerico, y que despues, se Ie qui ere sumar otra cantidad. Es logico que se intentara hacer de la siguiente forma:

a=$a+2 (a es la variable con valor 5, y 2 la cantidad a sumar)

El resultado que se obtendria seria "5+2", y no 7.

Para realizar esto la programacion shell dispone de una orden concreta para la realizacion de calculos numericos.

Esta orden es expr. La sintaxis es:

expr [expresion]

Expresion usa precedencia aritmetica normal, no modificable. Necesita que cada elemento este rodeado por blancos.

La expresion se construye usando enteros sin tipo y operadores aritmeticos normales,

estos son: + - I \*(multiplicacion, el * debe ir precedido de \ puesto que este caracter es el simbolo comodin del shell). Entonces, la operacion anterior quedaria asi:

a='expr $a + 2' L...

9.8 Funciones

La programacion shell pennite el uso de funciones, entendiendo como tal, un grupo de ordenes a las que su les referencia mediante un nombre que se invoca desde el modulo llamador en el momenta de su ejecucion y que puede devolver un valor de retorno. Las funciones deben estar declaradas antes de ser invocadas por su modulo llamador, que puede ser del mismo nivel jerarquico. La declaraci6n de funciones se realiza de la siguiente forma:

nombre ()

return [valor_retorno]

Donde la orden return provoca la vuelta al modulo llamador y devuelve valor _retorno que se almacena en la variable $? La orden return se puede encontrar en cualquier punto de la funci6n. Para invocar esta funcion desde otro m6dulo se hara simplemente poniendo: nombre

Es posible enviar parametres por valor que se recogeran mediante las variables $ { 1 } , ${2}, ... ${9} no en la cabecera, sino en el cuerpo de la funci6n. La Hamada a una funcion con paso de parametros se hara asi:

nombre valorl valor2 ..• valorN Si se trata de valores constantes. nombre $varl $var2 ... $varN Si se trata de varibles.

Las funciones pueden definirse tambien en linea de comandos como una orden multilinea. Asi, quedan residentes en el shell y pueden ser invocadas en cualquier momento desde linea de 6rdenes.

Las funciones no son exportables ni estan automaticamente desponibles para otros subshells. Se pueden ver con la orden set

9.9 Deteccion de interrupciones: traps

Cualquier buen programa shell debe tener en cuenta los errores y la recepcion de sefiales que se produzcan en tiempo de ejecuci6n.

Los errores de las 6rdenes en tiempo de ejecuci6n es conveniente que se redireccionen a un fichero, 0 bien, Idev/null que es un dispositivo nulo de Unix.

Aparte de los errores, deben ser controladas las senales recibidas por el script durante su ejecuci6n. Una sefial puede estar causada por diferentes sucesos en determinados momentos, por ejemplo, un error grave en el sistema, la pulsaci6n de la tecla de interrupci6n [DEL], etc. Para controlar estas seiiales, las que son controlables, desde los programas shell de usuario se dispone de la orden trap

10

Control de sefiales: Orden trap. La sintaxis es:

trap "orden" numeros_de_seiial

Invoca la orden especificada entre comillas dobIes, en caso de recepcion en el script donde se incluye de una de las sefiales indicadas. Veamos algunas de estas sefiales:

o Salida del shell (/\d u otra razon)

1 Colgar el telefono de cornunicacion.

Corte.

2 Interrupcion (tecla [DEL])

3 Abandonar (/\\, se produce un vaciado de memoria)

r\

C)ft'f '(jy $ jlUW/ ~

Cut"

'(clIO ~[DlJD~" (§j- OuAr<:.1_ RtJe~9J

JJlteetl ~ " II eiJ =0JWA~1.

También podría gustarte