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 variableFijar una variable es fácil, por ejemplo
MIVAR="Mi variable"para ver la variable, usamos
echo $MIVARNote que no hay espacios alrededor del = cuando se pone una variable.
4.3 Scripts muy básicosTipea 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.shAhora 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 bashLos
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 LoopsSi queremos repetir algo varias veces, podemos usar loops dentro de un script:
4.5.1 for loopsFor
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