• No results found

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