513372 - Linux, Scripts y GMT

CLASE 4 - Scripts y loops

back

4.1 Introducción a scripts en bash

Un script es muy similar a un programa, aunque se puede correr solamente dentro de un contexto específico. Los shell scripts son un tipo de script desarollado para correr dentro de un terminal, como el de bash.

Todos  los shell scripts que encontraremos en este curso (incluyendo los de GMT) empiezan de la misma manera, con un gato-exclamación (#!), donde este informa  la ruta del shell que queremos usar para interpretar el script, en nuestro caso /bin/bash.

Ejemplo:

#! /bin/bash
# Este es el inicio de un shell script

Cualquier línea que empieza con un # (menos el  #! /bin/bash) es un comentario. Estos comentarios son ignorados durante la ejecución - solamente sierven para dar información a la gente que lee el script.

4.2 Fijando una variable

Fijar una variable es fácil, por ejemplo

MIVAR="Mi variable"

para ver  la variable, usamos

echo $MIVAR

Note que no hay espacios alrededor del = cuando se pone una variable.

4.3 Scripts muy básicos

Tipea esto dentro de un nuevo archivo de texto (vamos a llamarlo hola.sh)

#! /bin/bash
echo "Hola a todos!"

Ahora cambie los permisos del archivo para hacerlo ejecutable:

chmod a+x hola.sh

Ahora ya puedes correr tu primer shell script, tecleea :

./hola.sh
_____________________________________________________________________________

Ahora introducimos una variable dentro de un script (hola2.sh)

#! /bin/bash
VAR="Hola de nuevo"
echo $VAR

Cambie los permisos y corre este script.
_____________________________________________________________________________

Usaremos en este curso comandos que aceptan parámetros para definir operaciones. Con esto tenemos scripts  más flexibles que aquellos que definen los parámetros dentro del script.

Para usar argumentos, a cada variable pasada a nuestro script, se le asigna un número $1, $2, $3 etc. Por ejemplo, argumentos.sh

#! /bin/bash
echo "El primer argumento es" $1
echo "El segundo argumento es" $2

Hace el script ejecutable y córrelo !

./argumentos.sh 100 hola
_____________________________________________________________________________

Siempre los scripts requieren un cierto número de argumentos. Por ejemplo, si no recibe dos argumentos, el script argumentos2.sh alerta al usario y, no corre si no recibe el número de parámetros que requiere:,

#! /bin/bash

#condicion que requiere el numero de argumentos sea 2
if [ ! $# -eq 2 ]
then echo "Correct usage: argumentos2.sh arg1 arg2"
exit
fi

#si pasamos la condicion, corremos el siguiente
echo "El primer argumento es" $1
echo "El segundo argumento es" $2

corre este script con y sin dos argumentos para ver la diferencia. Note que hay unos comentarios (líneas que empiezan con #) y también hay un condicional [if ... then ... fi] dentro.
_____________________________________________________________________________

A veces, se requiere que un script pida algo al usario. Para eso usamos el comando read, como en hola3.sh

#! /bin/bash
echo "Cual es tu nombre?"
read VAR
echo "Hola "$VAR"!"

4.4 Aritmética en bash

Los shell scripts son usualmente usados para correr una serie de comandos con ciertos parámetros.
A veces un poco de aritmética es útil. Acá hay una lista de algunos operadores que se pueden usar:

Sintaxis:Significado:

a+b, a-b
a*b, a/b
a%b
a**b Exponential

adición/sustracción
multiplicación/división
modulo (el resto después de división)
exponencial

por ejemplo, prueba los siguientes comandos:

echo $[100+5]
echo $[100/3]
echo $[100%3]
echo $[2**4]

Note que el comando awk puede hacer aritmética también, por ejemplo:

echo 100 3 | awk '{printf"%0.2f\n", $1/$2}'

4.5 Loops

Si queremos repetir algo varias veces, podemos usar loops dentro de un script:

4.5.1 for loops

For loops eligen un rango de variables, o una lista de archivos, y aplican comandos a cada uno de ellos. Por ejemplo, en el script for.sh imprimos los números del 1 al 10 en el terminal.

#! /bin/bash

for x in {1..10}
do
echo $x
done

o si queremos hacer una copia de seguridad back up (copiar cada archivo de un directorio a un archivo.bak ), podemos usar for1.sh

#! /bin/bash

for archivo in `ls -1`
do
cp $archivo $archivo.bak
done

4.5.2 Condicionales de if

Antes de ver el script, aca hay una tabla de comparaciones que podemos hacer para dos enteros $a y $b:

Sintaxis:Significado:

if [ $a -eq $b ]
if [ $a -ne $b ]
if [ $a -gt $b ]
if [ $a -ge $b ]
if [ $a -lt $b ]
if [ $a -le $b ]

is equal to (eq)
is not equal to (ne)
is greater than (gt)
is greater than or equal to (ge)
is less than (lt)
is less than or equal to (le)


ahora vamos a modificar el script for.sh de arriba, para imprimir los números 1 a 10 en el terminal, y si son par o inpar. Para  eso tenemos que tomar el modulo de cada número despues de dividir por dos y ver si es cero (par) o no (impar).

por ejemplo, pruebe

echo $[9%2]
echo $[8%2]

aca esta el script, for3.sh, que muestra si los números son par o inpar :

#! /bin/bash

for x in {1..10}
do

#tomar el modulo del numero dividido por 2
modulo=$[x%2]

#condiccion de if, definiendo el variable num a ser par o inpar
if [ $modulo -eq 0 ]
then
num=par
else
num=inpar
fi

#imprimir los resultados
echo $x $num

done

4.5.3 while loop - script para ver números primos

En este script, vamos tomar los modulos del número x dividido por todos los números 1 a x,  los números primos nunca van a tener un modulo cero.

Primeramente, aca esta el script para tomar x de 1 a 10, y para cada valor de x, tomar y de 2 a $x-1: for4.sh

#! /bin/bash

#corre un loop para x de 1 a 10
for x in {1..10}
do
#define y igual a 2
y=2
#condicion para hacer el siguiente loop solo cuando y esta menor que x
while [ $y -lt $x ]
do
echo $x $y
#aumenta el valor de y por 1
y=$[$y+1]
#termina la condiccion de "while"
done
#termina el loop de "for"
done

ahora vamos a modificar esto, con unas condiciones de if, para revisar si para cualquier division x/y el modulo es cero. Si no hay un set de (x, y) que da un módulo cero, entonces el número x es primo.
Esto es dado en el siguiente script, for5.sh. Note que este script no esta optimizado (¿porque?) - es posible escribir algo que corra más rápido que eso?

#! /bin/bash

#corre un loop para x de 1 a 10
for x in {1..10}
do

#define un variable $primo para ser igual a 1
primo=1

#define y igual a 2
y=2

#condicion para hacer el siguiente loop solo cuando y esta menor que x
while [ $y -lt $x ]
do

#toma el modulo de x%y
modulo=$[$x%$y]

#si el modulo es cero para cualquier set de $x, $y, cambia el variable $primo a cero
if [ $modulo -eq 0 ]
then
primo=0
fi

#aumenta el valor de y por 1
y=$[$y+1]
#termina la condiccion de "while"
done

#si todavia el valor de primo es 1,
#es decir, no hay ningun set de $x, $y que tiene modulo cero,
#entonces el numero $x es primo
if [ $primo -eq 1 ]
then
echo $x "es primo"
fi

#termina el loop de "for"
done


4.6 Condicional case

Para ver como trabaja el condicional case, haz click aquí.

Aquí  paramos con los ejemplos. La próxima semana aplicamos for, if y while a datos geofisicos  para extraer la información necesaria dentro de ellos.

back