He aquí la segunda entrada, un poco corta y sin contenido cómico para distraer (En esta entrada no hay zombies :-( ).
Bucles
Los bucles permiten ejecutar un trozo de código una o más veces dependiendo de si se cumple o no una condición.
.: While :.
Permite ejecutar un trozo de código mientras una condición se cumpla, y sólo se detiene cuando dicha condición es falsa, o también, cuando dentro del mismo trozo de código que se está ejecutando por medio de while hay alguna interrupción.
(En lenguaje humano → Mientras que tal cosa sea cierta, repita...)
-le es un comparador que significa menor, una de las entradas estará destinada a ese tipo de comparadores.
Ejemplo de salida:
CONTADOR es igual a 1
CONTADOR es igual a 2
CONTADOR es igual a 3
CONTADOR es igual a 4
CONTADOR es igual a 5
Ahora, supongamos que tenemos un archivo llamado ip_ping.lst con la siguiente lista de IPs a las que queremos hacer ping:
File: ip_ping.lst
173.194.37.69
173.194.37.70
173.194.37.71
69.171.242.11
66.220.149.11
La forma de hacer ping a cada dirección por medio de un while sería:
Otro ejemplo con más información en el archivo ip_ping.lst, el cual contendrá ahora la siguiente estructura:
ip del sitio a dar ping (espacio) nombre del sitio (espacio) bytes a enviar (espacio) numero de “ecos” a enviar. Ejemplo:
File: ip_ping.lst
173.194.37.69 google.com 64 1
173.194.37.70 google.com 128 5
173.194.37.71 google.com 64 2
69.171.242.11 facebook.com 64 3
66.220.149.11 facebook.com 64 4
En otra entrada veremos como cambiar el "espacio" por un caracter. La idea de poner más datos en el archivo es poder leer cada dato como una variable diferente:
“ip nombre size ecos” son nombres de variables que decidí usar para cada palabra que se encuentre en el archivo ip_ping.lst
.: for :.
En bash scripting el bucle for se usa de manera un poco diferente a como se usa en C.
Para cada elemento de una lista de elementos repite la accion:
La salía seria:
bra blablabla
zil blablabla
fw blablabla
Ahora, supongamos que tenemos una carpeta llena de imágenes, y necesitamos cambiarles el tamaño (util cuando estan muy pesadas para enviar por mail):
Ahora, cada ip del archivo ip_ping.lst ahora podría estar separado por espacios así:
File: ip_ping.lst
173.194.37.69 173.194.37.70 173.194.37.71 69.171.242.11 66.220.149.11
Funciones
Al igual que en la mayoria de lenguajes de programación, en bash es posible utilizar funciones. Una funcion es como tener otro script dentro del mismo script “principal”, esto evita tener que crear un archivo diferente para cada script, también es ideal cuando tenemos que repetir código, las funciones nos evitan tener que estar escribiendo el mismo código una y otra vez. En fin tienen muchas ventajas que se resumen en ahorro de tiempo, facilidad de leer, mantener y programar el script.
Con el anterior script se crean dos funciones, una llamda fn_saludar y otra llamda fn_salir. Finalmente se llama a cada una de las funciones: primero llamamos la funcion fn_saludar y luego la funcion fn_salir, por lo tanto la frase “esto nunca se mostrará...” nunca saldrá en pantalla.
Las funciones también se pueden declarar sin la palabra "function":
Ahora, un ejemplo con argumentos:
O lo que da lo mismo:
Cuando llamamos a la funcion sumar:
también le estamos pasando los valores de $num1 y $num2, la funcion leerá el primer argumento en este caso $num1 como $1 y el segundo argumento como $2
Ultimo ejemplo:
Bucles
Los bucles permiten ejecutar un trozo de código una o más veces dependiendo de si se cumple o no una condición.
.: While :.
Permite ejecutar un trozo de código mientras una condición se cumpla, y sólo se detiene cuando dicha condición es falsa, o también, cuando dentro del mismo trozo de código que se está ejecutando por medio de while hay alguna interrupción.
(En lenguaje humano → Mientras que tal cosa sea cierta, repita...)
CONTADOR=1
#mientras el valor de la variable llamada CONTADOR sea menor a 5 haga:
while [ $CONTADOR -le 5 ]; do
echo "CONTADOR es igual a $CONTADOR"
CONTADOR=$(( $CONTADOR + 1 ))
done
-le es un comparador que significa menor, una de las entradas estará destinada a ese tipo de comparadores.
Ejemplo de salida:
CONTADOR es igual a 1
CONTADOR es igual a 2
CONTADOR es igual a 3
CONTADOR es igual a 4
CONTADOR es igual a 5
Ahora, supongamos que tenemos un archivo llamado ip_ping.lst con la siguiente lista de IPs a las que queremos hacer ping:
File: ip_ping.lst
173.194.37.69
173.194.37.70
173.194.37.71
69.171.242.11
66.220.149.11
La forma de hacer ping a cada dirección por medio de un while sería:
#!/bin/sh
while read direccion_ip; do
echo "Haciendo ping a $direccion_ip"
ping -c1 $direccion_ip
done < ip_ping.lst
Otro ejemplo con más información en el archivo ip_ping.lst, el cual contendrá ahora la siguiente estructura:
ip del sitio a dar ping (espacio) nombre del sitio (espacio) bytes a enviar (espacio) numero de “ecos” a enviar. Ejemplo:
File: ip_ping.lst
173.194.37.69 google.com 64 1
173.194.37.70 google.com 128 5
173.194.37.71 google.com 64 2
69.171.242.11 facebook.com 64 3
66.220.149.11 facebook.com 64 4
En otra entrada veremos como cambiar el "espacio" por un caracter. La idea de poner más datos en el archivo es poder leer cada dato como una variable diferente:
#!/bin/sh
while read ip nombre size ecos; do
echo "Haciendo ping al sitio $nombre"
ping -c $ecos -z $size $ip
done < ip_ping.lst
“ip nombre size ecos” son nombres de variables que decidí usar para cada palabra que se encuentre en el archivo ip_ping.lst
.: for :.
En bash scripting el bucle for se usa de manera un poco diferente a como se usa en C.
Para cada elemento de una lista de elementos repite la accion:
#!/bin/bash
#para cada elemento haga:
for ELEMENTO in bra zil fw; do
echo "$ELEMENTO blablabla"
done
La salía seria:
bra blablabla
zil blablabla
fw blablabla
Ahora, supongamos que tenemos una carpeta llena de imágenes, y necesitamos cambiarles el tamaño (util cuando estan muy pesadas para enviar por mail):
#!/bin/sh
mkdir resized #Creamos un nuevo directorio donde quedaran las imagenes modificadas
for img in `ls`; do
mogrify -resize 800x600 -compress jpeg -quality 90 -path ./resized $img
done
Ahora, cada ip del archivo ip_ping.lst ahora podría estar separado por espacios así:
File: ip_ping.lst
173.194.37.69 173.194.37.70 173.194.37.71 69.171.242.11 66.220.149.11
#!/bin/sh
for element in $(cat ip_ping.lst); do
echo “Haciendo ping a $element”
ping -c1 $element
done
Funciones
Al igual que en la mayoria de lenguajes de programación, en bash es posible utilizar funciones. Una funcion es como tener otro script dentro del mismo script “principal”, esto evita tener que crear un archivo diferente para cada script, también es ideal cuando tenemos que repetir código, las funciones nos evitan tener que estar escribiendo el mismo código una y otra vez. En fin tienen muchas ventajas que se resumen en ahorro de tiempo, facilidad de leer, mantener y programar el script.
#!/bin/bash
function fn_salir() {
clear
exit
}
function fn_saludar() {
echo "Hola mundo!"
}
fn_saludar
fn_salir
echo “esto nunca se mostrará...”
Con el anterior script se crean dos funciones, una llamda fn_saludar y otra llamda fn_salir. Finalmente se llama a cada una de las funciones: primero llamamos la funcion fn_saludar y luego la funcion fn_salir, por lo tanto la frase “esto nunca se mostrará...” nunca saldrá en pantalla.
Las funciones también se pueden declarar sin la palabra "function":
#!/bin/bash
fn_salir() {
clear
exit
}
fn_saludar() {
echo "Hola mundo!"
}
Ahora, un ejemplo con argumentos:
#!/bin/bash
#declaramos la funcion llamada sumar:
function sumar(){
resultado=$(( $1 + $2 ))
}
echo "Ingrese primer número"
read num1
echo "Ingrese el segundo número"
read num2
sumar $num1 $num2
echo "el resultado es $resultado"
exit
O lo que da lo mismo:
#!/bin/bash
function sumar(){
echo "el resultado es $(( $1 + $2))"
}
echo "Ingrese primer número"
read num1
echo "Ingrese el segundo número"
read num2
sumar $num1 $num2
exit
Cuando llamamos a la funcion sumar:
sumar $num1 $num2
también le estamos pasando los valores de $num1 y $num2, la funcion leerá el primer argumento en este caso $num1 como $1 y el segundo argumento como $2
resultado=$(( $1 + $2 ))
Ultimo ejemplo:
#!/bin/bash
function fn_ping(){
ping -c1 $1
}
function fn_arping(){
arping -c1 $1
}
function fn_menu(){
echo ":::: Que desea hacer? ::::"
echo -e "1. hacer pingn2. hacer arpingn3. Salir"
read opcion
case $opcion in
1) fn_ping $ip;;
2) fn_arping $ip;;
3) exit;;
*) echo "opcion no válida";;
esac
fn_menu
}
echo "Ingrese una ip para comenzar:"
read ip
fn_menu