-[ 0x0F ]-------------------------------------------------------------------- -[ SHELL SCRIPTING ]--------------------------------------------------------- -[ by UnderCode ]-----------------------------------------------------SET-19- Introduccion al shell scripting ============ == ===== ========= Welcome to Linux!! Retomando un poco la idea de una nota aparecida en una edicion anterior de este zine, donde se explicaban los comandos basicos de la bash (Bourne Again Shell), en esta oportunidad voy a tratar de aclarar algo de que se trata la programacion en shell y que es eso del shell scripting y para que te puede llegar a servir. --------------------------------------------------------------------------- Nota: De mas esta decir que no soy un gran conocedor de linux (solo otro usuario mas) y que si aparece algun error o alguien desea criticar, comentar o apliar esta nota, mi mail esta al final de la misma. Todo comentario es valido. --------------------------------------------------------------------------- Hechas las aclaraciones pertinentes al caso, empecemos: 1) Shell?, que es eso? No, no es la compa~ia de combustibles y lubricantes :) Cuando hablamos de shell en un sistema Unix, nos referimos al interprete de comandos. Esto es una interface entre el OS y el usuario que recibe las ordenes de este ultimo y las traduce en un lenguaje comprensible para la maquina. En el caso de no reconocer lo que se le solicite, puede producir o no algun mensaje de error. Una caracteristica importante de las shells es que pueden reconocer estructuras (bloques de instrucciones), permitiendo el uso de sentencias de control, variables y todo lo que se te ocurra a la hora de programar. Como mas de uno sabra, existen dos "familias" de shell disponibles en Unix, estas son las sh y las csh. Las mas simples como interface y como lenguaje de programacion son las sh o Bourne Shell, en tanto que las csh poseen, en su lenguaje de scripting, una sintaxis similar a la de c (de alli su nombre), que la vuelven un poco (no mucho) mas complicado para el usuario newbie. Como quienes tengan Linux instalado, seguramente usaran la bash (perteneciente a la linea de shells sh), la nota se centrara en esta shell en particular, ademas es la que yo mejor conozco :) 2) Primeros pasos. Basta de palabras y empecemos con la accion. Con cualquier editor (yo prefiero vi, pero pueden usar cualquier otro, como emacs) vamos a crear un nuevo archivo y le copiamos el codigo que sigue: ----------comienzo codigo----------- #!/bin/sh echo "Where do you want to go tomorrow?" -----------final codigo------------- Listo, veamos que significa esto. La linea "#!/bin/sh" indica que debe utilizarse el conjunto de comandos de la shell sh que se encuentra en el directorio /bin en linux. Luego sigue la sentencia "echo" que indica que el texto que sigue, enmarcado entre comillas debe ser imprimido por la salida estandar (en nuestro caso, el monitor). Otra cosa que se aprecia es que el salto de linea indica el final de la instruccion, sin necesidad de colocar un terminador de linea como en c (donde se debe colocar ";" cada vez que se finaliza una sentencia). Pero bueno, diran, y esto que hace?...como lo ejecuto? Ok, ok, vamos por partes. Otra buena caracteristica de la programacion en shell es que no hace falta compilacion, uno puede crear sus propio ejecutables (similar a los batch de DOS). Esto se debe a que se esta utilizando un lenguaje interpretado y que siempre que se conozca el interprete, los scripts seran ejecutados. Nos cubrimos de toda contingencia y por eso le indicamos en la primera linea el interprete que queremos utilizar, esto es conveniente y recomendable (aunque no siempre necesario) de realizar. Lo único que resta es darle al archivo permisos de ejecucion mediante la orden "chmod +x archivo" por ejemplo, donde "archivo" es el nombre del archivo (si no sabes asignar los permisos para archivos en linux, consulta el manual de chmod, tecleando "man chmod"). Solo resta ejecutar nuestro script, para ello solo tenes que teclear "archivo" y listo!...oops!...no anda?...ok, tal vez "archivo" este en un directorio que no esta referenciado en el path de tu sistema. Ok, no problem. Aqui tenemos dos opciones, una, colocar la referencia del directorio que usamos para programar en el path (no lo recomiendo) y la otra es ejecutar el script de la siguiente manera "./archivo" lo cual indica a la shell que debe ejecutar el archivo llamado "archivo" que se encuentra en el directorio ".", o sea el directorio actual. Bien probemos: $ ./archivo $ Where do you want to go tomorrow? Listo. Nuestro peque~o programilla funciona. Ahora vamos a potenciar un poco, solo un poco, nuestros conocimientos de scripting. Quienes esten habituados a programar (en cualquier lenguaje), de seguro estarán acostumbrados a utilizar variables. La programacion en shell permite hacer uso de dos tipos de variables: de usuario y de shell. Las de usuario, son las definidas por el propio programador y que tienen un significado solo para este; en tanto que las de shell poseen un significado propio y pueden ser modificadas en funcion de las necesidades. Todas las variables deben comenzar con un caracter y pueden estar formadas por letras, numeros y el caracter "_". Otra características de las variables es que se definen en forma dinamica o por asignacion, esto significa que no es necesario que sean declaradas al principio. Esta asignacion en sh se realiza de la siguiente manera: VAR1=/usr/local/librerias La asignación en las shells csh es similar solo que la variable debe estar precedida por el comando "set". 3- Estructuras de control Como no. Siempre aparecen y son muy necesarias. En este caso las sentencias y estructuras de control no difieren mucho de las utilizadas en cualquier lenguaje. Empecemos por el final...huh?...si. En ciertas ocasiones puede ser necesario que un programa finalice en algun punto y nos lo indique con un valor de retorno (indicado por nosotros, claro) esto puede ser util a la hora de seguir el flujo del mismo. Para indicar al programa donde debe detenerse se utiliza la instruccion "exit" seguida del valor que queremos que devuelva, por ejemplo "exit 1". Decisiones. Como siempre el archiconocido "if" if VAR1="windows" then echo "sucks" else echo "rulez" fi Que significa todo eso? Destripemos las lineas: if es la instruccion que indica condicion VAR1 es la variable a la que vamos a aplicar la condicion. Esta condicion sera ="windows" que indica que si el contenido de la variable VAR1 es "windows", debera producirse la salida indicada por echo, en este caso "sucks", sino (else) "rulez", la instruccion fi indica la finalizacion de la estructura if, esto es algo a tener en cuenta ya que muchos estaremos acostumbrados a finalizar con endif. Una variante utilizada para anidar condiciones es elif, similar a elsif en otros lenguajes. La particularidad de elif es que no hace falta cerrar cada condicion con fi, por ejemplo: if VAR1="windows" then echo "sucks" elif VAR1="linux" then echo "rulez" fi Como se ve, aca hay dos condiciones anidadas, una preguntando por VAR1="windows" y otra por VAR1="linux", ambas producen una salida diferente. Si de agrupar condiciones hablamos, otra estructura conocida y bastante útil es "case", su sintaxis: echo -n 'Elija su opcion:' read opcion case $opcion in 1) echo 'Primera Opcion' echo 'Mala eleccion';; 2) echo 'Segunda Opcion' echo 'Muy bien!';; [03456789]) echo 'Debias elegir 1 o 2, pajaron!!';; esac Ahora veamos, la linea echo -n indica que luego de imprimir "Elija su opcion" no debe realizarse un salto de linea, es decir el cursor esperara la opcion al final de "Elija su opcion". Vemos una instruccion read, esta indica que el valor de la variable "opcion" debe ser leida desde el teclado. Luego viene la estructura case, que comienza con "case $opcion in". Lo cual indica que de acuerdo a lo que se ingrese en opcion seran las opciones que se tomaran. Para indicar cada valor de los posibles casos se utiliza ")", como veran en las opciones 1) y 2) que consisten en un solo caracter (1 o bien 2), en el tercer caso entre "[]" se indican los valores que activaran a este caso, los corchetes se utilizan cuando los valores aceptados sean mas de uno. Otra opcion es colocar "*)" lo cual indica que cualquier entrada despertara a la opcion. Luego de las opciones estan las instrucciones que se ejecutaran en cada caso, en este ejemplo son solo salidas simples por pantalla. Por ultimo debe indicarse el final de las instrucciones de una determinada opcion, para esto se utilizan doble punto y coma (;). La estructura se cierra con "esac" que curiosamente, al igual que ocurre con if, es la instruccion de apertura al reves; pero cuidado que no siempre es asi. A continuacion vamos a ver el manejo de bucles en shell. Tenemos en shell los bucles for, while y until, veamos cada uno de ellos. for valor in "valor_1" "valor_2" "valor_3" "zero" do echo $valor done El bucle comienza con la orden "for". En el ejemplo se lee el contenido de la variable "valor" si este es coincidente con "valor_1", "valor_2", "valor_3" o "zero" se realiza lo que se indica entre do y done, en este caso mostrar el contenido de "valor". [Daemon: El bucle for en Bash tiene una estructura del tipo siguiente for name [in words;] do list; done, esto significa que name va tomando ciclicamente el valor de la lista [in words] y que los comandos do list se le van aplicando sucesivamente a name[words]. Continuemos con while: while valor="anything" do echo "El valor no ha cambiado" done Esto realiza una comparacion del contenido de "valor", mientras este sea igual a "anything" imprimira por pantalla el mensaje que se indica. Este bucle puede no ejecutarse ninguna vez, todo dependiendo del contenido de la variable "valor", la cual si fue definida como distinta a "anything" hara que el bucle sea salteado. Por ultimo tenemos la sentencia until: until valor=2 do valor=/usr/local/value echo $valor done Esto indica que mientras valor sea igual a 2, se asigne a este el contenido del archivo /usr/local/value y se muestre el mismo. Diran, este archivo sera siempre igual!!...pero recordemos que estamos en Linux donde pueden convivir varios programas ejecutandose a la vez, uno de ellos puede modificar el contenido de /usr/local/value y este ejemplo nos lo indicara. [Daemon: En realidad el bloque de codigo comprendido dentro de una sentencia como Until se ejecuta mientras la condicion es FALSA, en este caso mientras valor es _distinto_ de 2] Para finalizar con los bucles, existe una instruccion que puede romper la ejecucion de los mismos en cualquier punto, esta instruccion es "break", su sintaxis es: break n Donde n indica el numero de niveles de bucle en caso de haber bucles anidados de todos modos el parametro n es opcional. Para salir de la iteraccion en que se encuentre el programa en un momento dado y continuar con la siguiente se utiliza "continue", cuya sintaxis es: continue n Donde n tambien es opcional y solo se utilizara en el caso de haber varios bucles anidados. Creo que esto es todo por ahora, si me dan el tiempo, las ganas y las teclas, para la proxima edicion voy a ampliar algo de lo comentado hasta aca. Esto solo fue, como lo indica el titulo una peque~a introduccion para todos aquellos que estan curiosos de saber de que se trata la programacion en shell y como empezar con la misma. Como dije, en numeros sucesivos voy a tratar de avanzar con este tema que es mas que interesante y particularmente util para los usuarios de Linux, en especial a la hora de automatizar tareas. Esto fue todo, como siempre, agradecimientos a: * Set - Por bancarme, y poner mis notas en su zine, salvo alguna que se perdio por ahi :) * La gente de #hack.ar (conectados.ciudad.com.ar) por la buena onda del canal mas alla de alguna que otra discusion. * Todos los teams argentos: X-Team, Forever, Side, Gac's, Xcaliber y todos los que me olvido. * Y un muy especial saludo a los responsables de http://www.fruta.net UnderCode undercode@iname.com