Copy Link
Add to Bookmark
Report

SET 019 0x0f

  

-[ 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


← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT