Professional Documents
Culture Documents
_____________________dash____________________________________________
_____________________bash____________________________________________
_____________________rbash____________________________________________
_________________________________________________________________
2- Diseo de un script
Para empezar a crear un script, lo primero que se necesita es indicar que
tipo de sintaxis se utilizara, de lo contrario se corre el riesgo de ejecutar un
script con un Shell distinto provocando errores de sintaxis que elimine su
ejecucin. Para la definicin del script, la primera lnea del mismo es dicha
definicin. Para el laboratorio, todo script que se realice debe empezar con
la siguiente lnea:
#!/bin/bash
El uso de #! es un caso especial que solo debe aparecer una vez. Despus
de su primera aparicin, si volviera a aparecer causara conflictos en el
script. El uso de # (sin el signo de admiracin) sirve para identificar que
se trata de una lnea de comentario.
Una vez el script este diseado segn las necesidades que se requiera, se
necesita que el mismo sea ejecutable. Todo archivo en Linux se considera un
archivo de texto por defecto pero no son ejecutables. Para volverlo
ejecutable, utilizaremos el comando chmod.
Actividad de laboratorio:
2.1 - Crear el archivo
Cree un archivo de texto de nombre: Ejemplo.sh cuyo contenido sea el
siguiente:
#! /bin/bash
Cat /etc/passwd | grep redes
Como recordara de la prctica pasada, el comando cat /etc/passwd | grep
redes fue utilizado para desplegar todo los usuarios que contuvieran
redes. En este primer ejemplo, pondremos dichos comandos en un script.
NOTA: la extensin .sh no es necesario, se ha utilizado para facilitar que el
usuario diferencie con relativa facilidad un archivo cualquiera de uno de
script.
2.2 - Hacer ejecutable el archivo
Utilizaremos el siguiente comando
Chmod u+x Ejemplo.sh
U Indica User y el +x hace que se active la opcin de ejecutable para el
usuario. Es decir, los dems permisos (R, W) no se ven afectados y
G(rupos) , O(tros) no son alterados. Existen distintos modos de usar el
2.4 Variables
Como se ha mencionado, un script puede manejar variables, entre las ms
usuales estn las que serviran como argumentos (Entradas obligatoria u
opcionales de un programa) adems de las variables internas del programa.
Las variables que se obtengan de los argumentos del script tienen la
siguiente nomenclatura:
$0 Generalmente, es el nombre del script Shell ejecutado.
$1 Primer argumento del script
$2 Segundo argumento del script
$3
$4
$# Total de argumentos que el script recibi.
$@ Un string conteniendo todo los argumentos que introdujo el usuario.
Generalmente se utiliza $# para garantizar que el programa fue utilizado
con suficientes argumentos antes de seguir con la ejecucin del mismo y los
dems para ir accediendo a las distintas variables que el usuario introdujo.
Una caracterstica importante de las variables es que estas pueden contener
todo tipo de valores, a diferencia de la mayora de los lenguajes de alto nivel
que definen el tipo de variable. Eso significa que un desarrollador de Bash
Script tiene que tener cuidado a la hora de manipular las variables de que
su contenido es el esperado.
No es objetivo de este laboratorio profundizar ms en el uso de las
variables.
3- Observaciones de los scripts
Probablemente, todava no le quede claro al alumno las capacidades de un
script, pero estos son extremadamente poderosos ya que permite una gran
gama de ejecuciones y de fcil personalizacin permitiendo que el usuario
cree sus propias herramientas de uso diario.
4- Scripts de ejemplo
El objetivo de este inciso ser la lectura del script y su ejecucin para ir
acostumbrado al alumno respecto al funcionamiento de los mismos.
Ejemplo 1:
Un modo de creacin de un men :
ba
Ejemplo 2:
Seleccin de un nmero aleatorio
secretNumber=$(( ((`date +%N` / 1000) % 100) +1 ))
guess=-1
while [ "$guess" != "$secretNumber" ];
do
echo -n "I am thinking of a number between 1 and 100. Enter your
guess:"
read guess
if [ "$guess" = "" ]; then
echo "Please enter a number."
elif [ "$guess" = "$secretNumber" ]; then
echo -e "\aYes! $guess is the correct answer!"
elif [ "$secretNumber" -gt "$guess" ]; then
echo "The secret number is larger than your guess. Try again."
Else
echo "The secret number is smaller than your guess. Try again."
fi
done
Ejemplo 3:
Validar si una serie de hosts estn disponible en la red.
La secuencia de pings son de la 10.17.117.1 a la 10.17.117.20 es decir, se
revisan 20 dispositivos en la red interna del campus.
#!/bin/bash
is_alive_ping()
{
ping -c 1 $1 > /dev/null
[ $? -eq 0 ] && echo Node with IP: $i is up.
}
for i in 10.17.117.{1..20}
do
is_alive_ping $i & disown
done
Ejemplo 4:
Arreglos
Considere los arreglos como valores guardados en una lista pre-existente
array=(red green blue yellow magenta)
len=${#array[*]}
echo "The array has $len members. They are:"
i=0
while [ $i -lt $len ];
do
echo "$i: ${array[$i]}"
let i++
done
5- Ejercicios:
Ejercicio 1
Utilice el script del ejemplo 3 para crear un script que haga una serie de
pings predefinidos a las mquinas de sus compaeros (y solo a ellas). Puede
basarse en el ejemplo 1 sustituyendo el men de colores por direcciones IP.
Ejercicio 2
Cree un script que permita crear las siguientes carpetas de forma
automatizada:
~/Sesion3
~/Sesion3/Alumno1
~/Sesion3/Alumno1/Califas
~/Sesion3/Alumno3
~/Sesion3/Alumno4
Ejercicio 3
Cree un script similar al ejercicio 2, pero que te pida el nombre las de
carpetas y que pueda ser ejecutado desde cualquier directorio.
Curiosidades
Los siguientes scripts son una recopilacin de la red con el nico propsito
de mostrar algunos usos posibles a los Scripts en Linux.
{
for i
do echo "$PN: $i" >&2
done
}
fatal () { err "$@"; exit 1; }
msg () { [ "$silent" = no ] && err "$@"; }
MyPath=$0
# Export "silent" to subshells, because parameters to the
# invoking shells are not passed to the subshells : ${silent:=yes}
# yes/no, may be set from calling shell export silent
while [ $# -gt 0 ]
do
case "$1" in
-v) silent=no;;
--) shift; break;; # End of parameter list
-h) usage;; -*) usage;;
*) break;;
# Command
Esac
Shift
done
[ $# -lt 1 ] && usage
for i in *
do
[ -d "$i" ] || continue
cd "$i"
"$MyPath" "$@"
# recurse into subdirectories
cd ..
done
msg "`pwd`"
eval "$@"
#!/bin/bash
#Version: 1.0.1 ( 28/01/11 )
#Objetivo: Ensear la forma de leer ORIGENs y manejo de strings
# Elementos clave: "Un shell debe ser flexible en los parametros de entrada
pero estricto en los de salida
# Entrada: Una lista de matriculas (alfa numerico), salida:
A0#######@itesm.mx
# LA parte dinamica es de 9 caracteres, la parte estatica es de 9
# en total cada linea del ORIGEN resultante debera tener 18 caracteres
ARGS=1
#Max de argumentos que puede recibir
ORIGEN="entrada.txt" ; DESTINO="matriculas.txt" #Entrada y Salida no
estandar del bash Match=""
#Variable usada para hacer
busqeudas con grep
Line=$@
EXPREG1="^A0[0-9]*"
#ER utilizadas para buscar los posibles
formatos
EXPREG2="^[0-9]*"
# de las matriculas escritas por los alumnos.
EXPREG3="^A[0-9]?@itesm.mx"
LeerORIGEN()
{
#echo "" > "$DESTINO" #Un archivo temporal es creado para ir guardando
lo exitoso
#El for avanzara en cada Palabra hallada en lo que regrese cat $ORIGEN
for WORD in `cat $ORIGEN`
do
#Aqui es donde buscaremos WORD, en teoria puede ser Alfa
numerico o solo numerico
#Iremos descartando, primero A0#######
Match=`echo "$WORD" | grep -xwi "$EXPREG1"`
if [ "$Match" = "" ]
then
#echo "No es el primer formato "
#Puede estar ya bien en el formato definitivo
Match=`echo "$WORD" | grep -xwi "$EXPREG3"`
if [ "$Match" != "" ]
then
#La longitud es necesaria de checar
if [ "${#Match}" -eq 18 ]
then
#Un correo en el formato y longitud
debido
#echo "Un correo hallado" "$EXPREG3"
": " $Match
echo "$Match" #>> "$DESTINO"
fi
else #Puede ser meramente numero (Sin A0)
Match=`echo "$WORD" | grep -xwi "$EXPREG2"`
if [ "$Match" != "" ]
then
#LA longitud es un problema... A00787620, A0-1787620 y A00-787620 son
# validas, por lo tanto ifelse
if [ "${#Match}" -eq 8 ]
then
#echo "Una matricula escrita
informalmente""$EXPREG2" ": " $Match echo "A""$Match""@itesm.mx" #>>
"$DESTINO"
elif [ "${#Match}" -eq 7 ]
then
#echo "Una matricula escrita
informalmente""$EXPREG2" ": " $Match
LinuxConfig. (2010, November 9). Bash Script for scan and monitoring
network. Retrieved Agosto 2011, from LinuxConfig.org:
http://linuxconfig.org/bash-scripts-to-scan-and-monitor-network
Lutus, P. (2006). Bash Shell Programming in Linux. Retrieved Agosto 2011,
from arachnoid.com:
http://www.arachnoid.com/linux/shell_programming.html
Wiki Doc.Ubuntu. (n.d.). Script. Retrieved Agosto 2011, from doc.ubuntu-es:
http://doc.ubuntu-es.org/Script