Más scripts de Shell

Además 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 continuación cómo utilizar y manipular los parámetros y luego ejemplos que utilizan if, for, while y case, junto con varias herramientas y características del shell, como manejo de funciones, valores de retorno, etc.

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

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

if
!s la estructura que permite ejecutar los comandos solamente si se cumple una determinada condición. +a sintaxis más 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 condición utilizamos la sintaxis de test. -para más información) man test.. +as condiciones serán 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 vacía

otros programas. no lleva el signo " adelante.-ho . +uego utlizamos la estructura de if para compararlo con #. Recordar) el comando 7 normalmente es sinónimo del comando test. se debe escribir "variable.n podemos colocar otra cosa que no sea el comando test. tambi. if ( 0$cuantos /gt 1 )* then echo "1a2 más de un usuario conectado " else echo "S3lo vos estás conectado" fi !n este script. pero si en los comandos se hace referencia a ella. grep "5$i" 6 7dev7null* then -rite $i 88 Eo& 1ola $i9 Eo& . for !s una estructura que permite una iteración durante un n8mero determinado de veces. 4 tambi. !sto lo hacemos utilizando las comillas invertidas. for i in $** do if -ho . !j) "% A continuación realizaremos un script que recibe por parámetro todos los usuarios que queremos saludar y les manda un saludo a cada uno solamente si están conectados al sistema. -c /l.1z cadena1de1caracteres cadena 3 cadena cadena /3 cadena entero 1eq entero +a cadena esta vacía +as dos cadenas son iguales +as cadenas son distintas +os enteros son iguales *or otro lado. primero guardamos la cantidad de usuarios conectados al sistema en la variable cuantos. 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 cuestión. +a sintaxis) for varia4le in lista* do comandos done +a variable. cuando se la coloca al lado del for. !j) # $ 9 : 2na lista de archivos. !j) %. la palabras true y false. la opcion 1gt del comando test significa mayor que. 5ealizaremos un script que escriba un mensaje si hay más de un usuario conectado y otro diferente si hay sólo un usuario conectado. que le devuelvan al if un cero o un uno. cuantos+.java 2na lista de argumentos.n. que el if luego interpretará como false o true respectivamente. +a lista puede ser) 2na lista de n8meros.

= para cualquier caracter.. y luego deberíamos terminar el texto con una línea que contenga 4la4la4la. utilizamos un metacaracter de shell muy especial. while !s una estructura que permite una iteración hasta que una determinada condición no se cumpla. para enviar un saludo a cada uno. para escapar valores especiales y ? ? para . *ara cada uno de los parametros recibidos. !sta cadena podría ser cualquier otra. < se utiliza con la siguiente sintaxis) case $varia4le in patron1: patron%: esac comandos ** comandos ** !l patrón con el que comprobamos al utilizar case es similar al que utiliza el shell -% para cualquier cadena. *ara esto. !ste metacaracter comienza con 88 Eo&. +a sintaxis) -hile ( condicion )* do comandos done +a condición es equivalente a la del if. *ara poder mandar el mensaje. -hile ( "$*" )* do echo $1 shift done !ste simple script imprime en cada línea cada uno de los parámetros recibidos. !n el caso del shell esta estructura es case. y con esto le indica al shell que la entrada de este comando es todo lo que ingresmos a continuación hasta la que encuentre una línea que solamente contenga la cadena Eo&. verificamos si ese usuario está conectado o no. podriamos por ejemplo poner 88 4la4la4la. case !n casi todos los lenguajes de programación encontramos una estructura que nos permite realizar distintas acciones seg8n el valor de una determinada variable.fi done !sta vez utilizamos la estructura for para procesar los argumentos de nuestro comando. 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. pues espera un solo parámetro. (emos que si omitimos las . abusamos un poco del if y demostramos que no es obligatorio usar test con el if. el comando test nos devuelve un error. A continuación veremos otra manera de procesar los parámetros recibidos. 7 > para rangos.

etc. # . en el que utilizamos el comando cal. !ste comando no entiende nombres de meses -enero. reinciarlos.Eun*: m+A ** Dul*.4r*: m+H ** ma2*.. Funciones !l shell nos provee de un manejo de funciones. no del mes #A del a@o actual. y al ejecutar cal 10 la salida será el calendario del a@o #A.!ov*: m+11 ** dec*. # declaracion de funcion . que es más probablemente nuestra expectativa.. usuario es el que está loggeado. 2tilizado sin ninguna opción nos muestra el mes actual. 2na función es un conjunto de instrucciones encerradas en un bloque de código.11.Mct*: m+1> ** nov*. una caja negra que hace determinado trabajo. # Si no vino ning?n parámetro@ m+$% # mostramos el calendario del mes actual 2+$A # 2 del aBo actual= ** 1: m+$1 # Si vino un s3lo parámetro@ set .ene*..Eul*: m+J ** aug*.dic*. !l script que realizaremos permitirá obtener un nuevo comando -ncal.escapar cadenas completas. !ste comando nos permite visualizar calendarios.. estudiaremos un ejemplo.go*: m+K ** sep*.1>. # mostramos el calendario de ese mes 2+$A # 2 del aBo actual= ** %: m+$1 # Si vinieron dos parámetros@ 2+$% # mostramos el calendario de ese mes 2 aBo= ** esac # Seleccionamos el mes Cue corresponde= case $m in Dan*. nos muestra el calendario de ese mes y ese a@o. detenerlos. etc.Ga2*: m+I ** Dun*.date. ademas de un muy cómodo .Fe4*: m+% ** mar*. 0uelen existir scripts de shell que se encargan de iniciarlos. febrero. nos muestra el calendario de ese a@o.date..Ene*: m+1 ** fe4*.Gar*: m+' ** apr*.ug*. que tenga estas funcionalidades. y para llamarlas alcanza con tipear su nombre. 'eben ser declaradas antes de poder llamarlas.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.Nec*.pr*.Sep*: m+L ** oct*. +os demonios son los servicios que se ejecutan en el sistema más allá de qu. < si le pasamos dos parámetros -por ejemplo cal 11 2002..Nic*: m+1% ** (1/L). *ara ver cómo es su funcionamiento. para usarlo como o. Al agregar un n8mero a continuación -por ejemplo cal 2020.ago*.a4r*.nali<amos los parámetros= case $# in >: set .Ean*.

Así como la suma. para poder usar locales se debe usar la instrucción de shell local. 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 . las funciones acceden a variables globales. < devuelven valores entre A y $EE. !n cambio. 0i no recibe ning8n parámetro el resultado es cero. 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 función que suma todos los parámetros que recibe. que luego borra de la lista de parámetros con el comando shift. etc. A continuación. podemos ver tambi.n la multiplicación y la división. algunos ejemplos que se proponen armar una calculadora en shell. utilizando el comando de shell let. que permite realizar operaciones aritm. < a continuación suma uno a uno. !l valor que devuelven puede ser accedido en el script en la variable "=. todos los otros parámetros. inicializa la variable res con el valor del primer parámetro. esto se consigue con la instrucción de shell return.funcion P: Q comandos R # declaracion alternativa= function funcion Q comandos R funcion # #lamado a funcion +as funciones reciben sus parámetros en "#. Cormalmente.ticas simples. "%. "$. si recibe alg8n parámetro.

o leyendo el manual de bash. que no se explican en este curso. .return 1 ** *: let res+$17$% let rem+$1T$% ** esac ** *: ** esac res+>* rem+> R add ' %II 1%' 1%' '> %L H mul $res % % div $res > echo $res* echo $rem !xisten a8n más capacidades para los scripts de shell. Fás información puede encontrarse en la gran documentación disponible en Gnternet.