You are on page 1of 6

Ms scripts de Shell

Adems de las herramientas para manejo de variables que se explicaron anteriormente, el shell nos permite utilizar herramientas para manejo de ciclos y para estructuras condicionales, veremos a continuacin cmo utilizar y manipular los parmetros y luego ejemplos que utilizan if, for, while y case, junto con varias herramientas y caractersticas del shell, como manejo de funciones, valores de retorno, etc.

Parmetros
omo ya hemos visto, los scripts de shell pueden recibir y manipular parmetros. !stos parmetros se representan dentro de los scripts como "#, "$, etc. !l conjunto de todos los parmetros est representado por "%, mientras que la cantidad de parmetros est representada por "&. !xiste, adems un comando llamado shift que permite eliminar el primer parmetro de la lista, y correr todos los parmetros. 'e tal manera que el segundo parmetro pasa a ser "# y as. (eremos un ejemplo sencillo)
echo "Cantidad de parmetros: $#" echo "Primer parmetro: $1" shift echo "Segundo parmetro $1" shift echo "El resto de los parmetros $*"

!l comando set nos permite ver todas las variables de entorno. *ero adems, nos permite asignarle valor a los parmetros "#, "$, etc. *or ejemplo)
set Viva !" #inu$ echo "Primer parmetro: $1" echo "Segundo parmetro: $%" echo "&ercer parmetro: $'"

if
!s la estructura que permite ejecutar los comandos solamente si se cumple una determinada condicin. +a sintaxis ms usual)
if ( condicion )* then comandos else comandos fi if ( condicion )* then comandos fi

!n realidad, los corchetes ( ) son un comando en si mismo, tambi,n llamado test, por eso, para armar la condicin utilizamos la sintaxis de test. -para ms informacin) man test.. +as condiciones sern de este estilo) /condicion 0i condicion es falsa condicion# 1a condicion$ +as dos condiciones son verdaderas condicion# 1o condicion$ 2na de las dos condiciones es verdadera cadena1de1caracteres +a cadena no esta vaca

1z cadena1de1caracteres cadena 3 cadena cadena /3 cadena entero 1eq entero

+a cadena esta vaca +as dos cadenas son iguales +as cadenas son distintas +os enteros son iguales

*or otro lado, tambi,n podemos colocar otra cosa que no sea el comando test, otros programas, que le devuelvan al if un cero o un uno, que el if luego interpretar como false o true respectivamente. 4 tambi,n, la palabras true y false. 5ealizaremos un script que escriba un mensaje si hay ms de un usuario conectado y otro diferente si hay slo un usuario conectado.
cuantos+,-ho . -c /l, if ( 0$cuantos /gt 1 )* then echo "1a2 ms de un usuario conectado " else echo "S3lo vos ests conectado" fi

!n este script, primero guardamos la cantidad de usuarios conectados al sistema en la variable cuantos. !sto lo hacemos utilizando las comillas invertidas, que son un recurso que nos provee el shell para utilizar la salida de los comandos en nuestro codigo6 cada bloque encerrado por las comillas invertidas es reemplazado por la salida del comando en cuestin. +uego utlizamos la estructura de if para compararlo con #, la opcion 1gt del comando test significa mayor que. Recordar) el comando 7 normalmente es sinnimo del comando test.

for
!s una estructura que permite una iteracin durante un n8mero determinado de veces. +a sintaxis)
for varia4le in lista* do comandos done

+a variable, cuando se la coloca al lado del for, no lleva el signo " adelante, pero si en los comandos se hace referencia a ella, se debe escribir "variable. +a lista puede ser) 2na lista de n8meros. !j) # $ 9 : 2na lista de archivos. !j) %.java 2na lista de argumentos. !j) "% A continuacin realizaremos un script que recibe por parmetro todos los usuarios que queremos saludar y les manda un saludo a cada uno solamente si estn conectados al sistema.
for i in $** do if -ho . grep "5$i" 6 7dev7null* then -rite $i 88 Eo& 1ola $i9 Eo&

fi done

!sta vez utilizamos la estructura for para procesar los argumentos de nuestro comando. *ara cada uno de los parametros recibidos, verificamos si ese usuario est conectado o no. *ara esto, abusamos un poco del if y demostramos que no es obligatorio usar test con el if. Aqu utilizamos la salida de un comando. 0i el usuario est conectado usamos el comando write -que le manda un mensaje a la consola del usuario., para enviar un saludo a cada uno. *ara poder mandar el mensaje, utilizamos un metacaracter de shell muy especial. !ste metacaracter comienza con 88 Eo&, y con esto le indica al shell que la entrada de este comando es todo lo que ingresmos a continuacin hasta la que encuentre una lnea que solamente contenga la cadena Eo&. !sta cadena podra ser cualquier otra, podriamos por ejemplo poner 88 4la4la4la, y luego deberamos terminar el texto con una lnea que contenga 4la4la4la.

while
!s una estructura que permite una iteracin hasta que una determinada condicin no se cumpla. +a sintaxis)
-hile ( condicion )* do comandos done

+a condicin es equivalente a la del if. A continuacin veremos otra manera de procesar los parmetros recibidos.
-hile ( "$*" )* do echo $1 shift done

!ste simple script imprime en cada lnea cada uno de los parmetros recibidos. (emos que si omitimos las ; ; el comando test nos devuelve un error, pues espera un solo parmetro.

case
!n casi todos los lenguajes de programacin encontramos una estructura que nos permite realizar distintas acciones seg8n el valor de una determinada variable. !n el caso del shell esta estructura es case. < se utiliza con la siguiente sintaxis)
case $varia4le in patron1: patron%: esac comandos ** comandos **

!l patrn con el que comprobamos al utilizar case es similar al que utiliza el shell -% para cualquier cadena, = para cualquier caracter, 7 > para rangos, para escapar valores especiales y ? ? para

escapar cadenas completas., ademas de un muy cmodo . para usarlo como o. *ara ver cmo es su funcionamiento, estudiaremos un ejemplo, en el que utilizamos el comando cal. !ste comando nos permite visualizar calendarios. 2tilizado sin ninguna opcin nos muestra el mes actual. Al agregar un n8mero a continuacin -por ejemplo cal 2020. nos muestra el calendario de ese a@o. < si le pasamos dos parmetros -por ejemplo cal 11 2002. nos muestra el calendario de ese mes y ese a@o. !ste comando no entiende nombres de meses -enero, febrero, etc., y al ejecutar cal 10 la salida ser el calendario del a@o #A, no del mes #A del a@o actual, que es ms probablemente nuestra expectativa. !l script que realizaremos permitir obtener un nuevo comando -ncal. que tenga estas funcionalidades.
# ;nali<amos los parmetros= case $# in >: set ,date, # Si no vino ning?n parmetro@ m+$% # mostramos el calendario del mes actual 2+$A # 2 del aBo actual= ** 1: m+$1 # Si vino un s3lo parmetro@ set ,date, # mostramos el calendario de ese mes 2+$A # 2 del aBo actual= ** %: m+$1 # Si vinieron dos parmetros@ 2+$% # mostramos el calendario de ese mes 2 aBo= ** esac # Seleccionamos el mes Cue corresponde= case $m in Dan*.Ean*.ene*.Ene*: m+1 ** fe4*.Fe4*: m+% ** mar*.Gar*: m+' ** apr*.;pr*.a4r*.;4r*: m+H ** ma2*.Ga2*: m+I ** Dun*.Eun*: m+A ** Dul*.Eul*: m+J ** aug*.;ug*.ago*.;go*: m+K ** sep*.Sep*: m+L ** oct*.Mct*: m+1> ** nov*.!ov*: m+11 ** dec*.Nec*.dic*.Nic*: m+1% ** (1/L).1>.11.1%: ** # El mes era numOrico= *: 2+$m* m+""* # S3lo vino el aBo= esac # #lamamos al calendario con el mes Cue elegimos= cal $m $2

2n uso muy frecuente del case de shell se encuentra en los demonios de BC2D+inux. +os demonios son los servicios que se ejecutan en el sistema ms all de qu, usuario es el que est loggeado. 0uelen existir scripts de shell que se encargan de iniciarlos, detenerlos, reinciarlos, etc.

Funciones
!l shell nos provee de un manejo de funciones. 2na funcin es un conjunto de instrucciones encerradas en un bloque de cdigo, una caja negra que hace determinado trabajo. 'eben ser declaradas antes de poder llamarlas, y para llamarlas alcanza con tipear su nombre.
# declaracion de funcion

funcion P: Q comandos R # declaracion alternativa= function funcion Q comandos R funcion # #lamado a funcion

+as funciones reciben sus parmetros en "#, "$, "%, etc. < devuelven valores entre A y $EE, esto se consigue con la instruccin de shell return. !l valor que devuelven puede ser accedido en el script en la variable "=. Cormalmente, las funciones acceden a variables globales, para poder usar locales se debe usar la instruccin de shell local. A continuacin, algunos ejemplos que se proponen armar una calculadora en shell.
res+>* rem+> add P: Q local i case $# in >: res+> ** *: res+$1 shift for i in $** do let resS+$i done ** esac R

0e trata de una funcin que suma todos los parmetros que recibe. 0i no recibe ning8n parmetro el resultado es cero. !n cambio, si recibe alg8n parmetro, inicializa la variable res con el valor del primer parmetro, que luego borra de la lista de parmetros con el comando shift. < a continuacin suma uno a uno, todos los otros parmetros, utilizando el comando de shell let, que permite realizar operaciones aritm,ticas simples. As como la suma, podemos ver tambi,n la multiplicacin y la divisin.
mul P: Q local i case $# in >: res+> ** *: res+$1 shift for i in $** do let res*+$i done ** esac local i case $# in %: case $% in >: echo "Error: divisi3n por cero"* res+>* rem+>

R div P: Q

return 1 ** *: let res+$17$% let rem+$1T$% ** esac ** *: ** esac res+>* rem+>

add ' %II 1%' 1%' '> %L H mul $res % % div $res > echo $res* echo $rem

!xisten a8n ms capacidades para los scripts de shell, que no se explican en este curso. Fs informacin puede encontrarse en la gran documentacin disponible en Gnternet, o leyendo el manual de bash.

You might also like