B. Competitive Bidding
2. Requests for Proposals
En general las comillas se usan para prevenir que la shell int´erprete ciertos caracteres dentro de una cadena y para que tome una cadena con espacios como una sola palabra.
7.1.2.1. Comillas dobles
En general los caracteres especiales no son interpretados cuando est´an entre comillas dobles. Sin embargo algunos de ellos s´ı son interpretados:
$ Est´a permitido referenciar variables dentro de las comillas dobles. \ Se pueden escapar caracteres.
` Se puede realizar sustituci´on de comandos, esto es, ejecutar un comando y sustituir la cadena por su salida.
7.1.2.2. Comillas simples
Dentro de las comillas simples todos los caracteres son interpretados literalmente, ninguno de los caracteres especiales conserva sus significado dentro de ellas.
7.1.2.3. Comillas invertidas
Poner una cadena entre comillas invertidas supone ejecutar su contenido como un comando y susti- tuir su salida.
7.1.3. Tests
Un test es una expresi´on que permite evaluar si una expresi´on es verdadera o falsa. Los tests no s´olo operan sobre los valores de las variables, tambi´en permiten conocer, por ejemplo, las propiedades de un archivo.
Los tests se usan, principalmente, en la estructura if then else fi para determinar qu´e parte del script se va a ejecutar. Un if puede evaluar, adem´as de un test, otras expresiones, como una lista de comandos (usando su valor de retorno), una variable o una expresi´on aritm´etica. Este es un ejemplo del uso de if:
if grep snoopy archivo-lindo.txt > /dev/null then
echo "archivo-lindo.txt contiene la palabra snoopy" else
echo "archivo-lindo.txt no contiene la palabra snoopy" fi
Hay dos formas distintas de escribir un test, [ ] y [[ ]]. No son equivalentes, (por ejemplo los opera- dores && —— ¡y ¿s´olo funcionan en la ´ultima), pero de momento las diferencias son irrelevantes.
if [[ test ]] then comando else comando fi 7.1.4. Estructuras de control
Como en cualquier lenguaje de programaci´on, la shell ofrece estructuras que permiten controlar el flujo de ejecuci´on de los scripts.
7.1.4.1. Bucle for
Su sintaxis b´asica es la que sigue:
for var in lista de valores do
comandos done
La variable $var toma el valor del siguiente valor de la lista en cada iteraci´on. Un ejemplo:
for i in $(ls *.sh) do
if [ -x "$i" ] then
echo "El archivo \"$i\" es ejecutable" fi
7.1.4.2. Bucle while Su sintaxis es la siguiente: while [ condicion ] do comandos done
La condicion puede ser, al igual que en un if, cualquier test, comando o expresi´on, el bucle se ejecu- tar´a mientras que la condici´on devuelva verdadero, es decir, cero.
En los bucles break y continue tienen el mismo funcionamiento que en otros lenguajes. break termina el bucle y continue salta a la siguiente iteraci´on.
7.1.4.3. Case
Como en otros lenguales case sirve para ejecutar una zona de c´odigo u otra, en funci´on del valor de una expresi´on o variable:
case $var in
valor ) comandos ;; valor2 ) comandos ;; esac
El funcionamiento de case puede verse en los scripts de inicio del sistema, lo usan para discernir si han sido llamados con los par´ametros start restart stop o alg´un otro.
7.1.5. Globbing
El globbing, tambi´en conocido por “filename expansion”, es decir, expansi´on de nombres de archivos, es el tratamiento que hace la shell cuando encuentra un nombre de archivo. Cuando se le indica a la shell el nombre de un archivo, algunos caracteres tienen un significado especial que la shell interpreta antes de hacer lo que tenga que hacer con ese nombre. Los caracteres son estos:
* Corresponde con cualquier secuencia de cero o m´as caracteres, con la excepcion de los archivos cuyo nombre empieza con un punto.
? Corresponde con cualquier caracter, una sola vez.
[ ] Corresponde con cualquiera de los caracteres o rangos de caracteres que contenga. ˆ Niega la expresi´on que le sigue.
7.2.
Creaci´on de Scripts
Ahora que se tiene un poco m´as claro cu´al es el concepto de programaci´on en bash, se pueden empezar a crear rutinas que automaticen algunas tareas que hagamos constantemente.
La primera linea de los scripts debe ser:
#!/bin/bash o
#!/bin/sh
Si el archivo tiene permisos de ejecuci´on, la primera l´ınea indica qu´e interprete se requiere para su ejecuci´on (en este caso, bash), de otra manera, se deber´a llamar al interprete de comandos al ejecutar el script. Ejemplo
# /bin/bash /mi/lindo/script.sh
Todo lo que contenga el archivo script, ser´a interpretado l´ınea a l´ınea de manera ordenada y secuen- cial por el int´erprete. Las l´ıneas que contengan el signo “#”, a partir desde ese punto, se considerar´an comentarios y por lo tanto no se ejecutar´a nada de lo que est´e escrito a la derecha de ´este.
7.2.1. Hola mundo!
Partamos con el ejemplo m´as b´asico de todos. . . el script que nos muestre un “Hola mundo!”. Con el editor de preferencia que ocupe, escribir un archivo llamado hola.sh que contenga lo siguiente:
#!/bin/bash
#Evitando la maldici´on... TEXTO="Hola mundo!" echo $TEXTO
Luego le damos permiso de ejecuci´on a este archivo
# chmod 755 hola.sh
y lo ejecutamos
# ./hola.sh Hola mundo!
F´acil, no?
Las posibilidades son inmensas y con las herramientas que ya se tienen, se puede hacer lo que uno quiera. S´olo es necesario un poco de pr´actica y algo de imaginaci´on.
7.2.2. Un ejemplo m´as complejo
Con el siguiente ejemplo (respaldo autom´atico de una Base de Datos MySQL), se pretende demos- trar lo f´acil que puede ser para uno automatizar tareas tediosas que puedan ser repetidas diariamente. Adem´as se aprovecha de mostrar la utilizaci´on de crons.
#!/bin/bash #MySQL Backup
# echo "0 9 * * * backup.sh" > crontab -e #Declaraci´on de Variables EMAIL = "[email protected]" HOST = "localhost" DB = "testin" USER = "mave007" PASSWD= "LaClave" DIR = "/opt/Backup" FECHA = "$(date +%Y.%m.%d)" CONT = 10
FILE = "$DIR/testin-bak-$FECHA.sql" MAQ = $(uname -n)
GZIP = "1" #0 no, 1 yes
#Viendo si existe $DIR if [ ! -d $DIR ] ; then
mkdir -p $DIR &>/dev/null chmod 700 $DIR &>/dev/null fi
#Haciendo el Dump
mysqldump -h$HOST -u$USER -p$PASSWD --opt $DB > $FILE 2> $DIR/error
#Comprimimos??
if [ "$GZIP" = "1" ] ; then gzip -9 $FILE &>/dev/null fi
#Cu´antos backups hay??
num=$(ls $DIR/*.sq* |wc -l)&>/dev/null
#Dejando solo los $CONT archivos cd $DIR
while ( [ $num -gt $CONT ] ); do rm -f $(ls -t |tail -n 1)
num=$(ls $DIR/*.sq* |wc -l)&>/dev/null done
#Enviando un email si hay error a $DIR tam_error= $(du $DIR/error|cut -d ’/’ -f 1)
echo -e "\nError (auto)" >> $DIR/error cat $DIR/error|mail -s"Backup :(" $EMAIL fi
Luego, podemos agregar este script (backup.sh), para que se ejecute todos los d´ıas a las 9:00 de la ma˜nana:
echo "0 9 * * * backup.sh" > crontab -e