Inicio > Administracion > Programacion Bash Practica

Programacion Bash Practica


Pura teoría

Los condicionales tienen muchas formas. La más básica es: if expresión then sentencia donde ‘sentencia’ sólo se ejecuta si ‘expresión’ se evalúa como verdadera. ‘2<1’ es una expresión que se evalúa falsa, mientras que ‘2>1’ se evalúa verdadera.

Los condicionales tienen otras formas, como: if expresión then sentencia1 else sentencia2. Aquí ‘sentencia1’ se ejecuta si ‘expresión’ es verdadera. De otra manera se ejecuta ‘sentencia2’.

Otra forma más de condicional es: if expresión1 then sentencia1 else if expresión2 then sentencia2 else sentencia3. En esta forma sólo se añade “ELSE IF ‘expresión2’ THEN ‘sentencia2′”, que hace que sentencia2 se ejecute si expresión2 se evalúa verdadera. El resto es como puede imaginarse (véanse las formas anteriores).

Unas palabras sobre la sintaxis:

La base de las construcciones ‘if’ es ésta:

if [expresión];

then

código si ‘expresión’ es verdadera.

fi

Ejemplo básico de condicional if .. then

#!/bin/bash

if [ “petete” = “petete” ]; then

echo expresión evaluada como verdadera

fi

El código que se ejecutará si la expresión entre corchetes es verdadera se encuentra entre la palabra ‘then’ y la palabra ‘fi’, que indica el final del código ejecutado condicionalmente.

Ejemplo básico de condicional if .. then … else

#!/bin/bash if [ “petete” = “petete” ]; then

echo expresión evaluada como verdadera

else

echo expresión evaluada como falsa

fi

Ejemplo: Condicionales con variables

#!/bin/bash

T1=”petete”

T2=”peteto”

if [ “$T1” = “$T2” ]; then

echo expresión evaluada como verdadera

else

echo expresión evaluada como falsa

fi

Ejemplo: comprobando si existe un fichero

#!/bin/bash

FILE=~/.basrc

if [ -f $FILE ]; then

echo el fichero $FILE existe

else

echo fichero no encontrado

Los bucles for, while y until

En esta sección se encontrará con los bucles for, while y until.

El bucle for es distinto a los de otros lenguajes de programación. Básicamente, le permite iterar sobre una serie de `palabras’ contenidas dentro de una cadena.

El bucle while ejecuta un trozo de códico si la expresión de control es verdadera, y sólo se para cuando es falsa (o se encuentra una interrupción explícita dentro del código en ejecución).

El bucle until es casi idéntico al bucle loop, excepto en que el código se ejecuta mientras la expresión de control se evalúe como falsa.

Si sospecha que while y until son demasiado parecidos, está en lo cierto.

Por ejemplo

#!/bin/bash

for i in $( ls ); do

echo item: $i

done

En la segunda línea declaramos i como la variable que recibirá los diferentes valores contenidos en $( ls ).

La tercera línea podría ser más larga o podría haber más líneas antes del done (4).

`done’ (4) indica que el código que ha utilizado el valor de $i ha acabado e $i puede tomar el nuevo valor.

Este script no tiene mucho sentido, pero una manera más útil de usar el bucle for sería hacer que concordasen sólo ciertos ficheros en el ejemplo anterior.

for tipo-C

Fiesh sugirió añadir esta forma de bucle. Es un bucle for más parecido al for de C/perl…

#!/bin/bash

for i in `seq 1 10`;

do

echo $i

done

Ejemplo de while

#!/bin/bash

CONTADOR=0

while [ $CONTADOR -lt 10 ]; do

echo El contador es $CONTADOR

let CONTADOR=CONTADOR+1

done

Este script ‘emula’ la conocida (C, Pascal, perl, etc) estructura `for’.

Ejemplo de until

#!/bin/bash

CONTADOR=20

until [ $CONTADOR -lt 10 ]; do

echo CONTADOR $CONTADOR

let CONTADOR-=1

done

Utilizando select para hacer menús sencillos —

#!/bin/bash

OPCIONES=”Hola Salir”

select opt in $OPCIONES; do

if [ “$opt” = “Salir” ]; then

echo done

exit

elif [ “$opt” = “Hola” ]; then

echo Hola Mundo

else

clear

echo opción errónea

fi

done

Si ejecuta este script verá que es el sueño de un programador para hacer menús basados en texto. Probablemente se dará cuenta de que es muy similar a la construcción ‘for’, sólo que en vez de iterar para cada ‘palabra’ en $OPCIONES, se lo pide al usuario.

Utilizando la línea de comandos

#!/bin/bash

if [ -z “$1″ ]; then

echo uso: $0 directorio

exit

fi

SRCD=$1

TGTD=”/var/backups/”

OF=home-$(date +%Y%m%d).tgz

tar -cZf $TGTD$OF $SRCD

Lo que hace este script debería estar claro para usted. La expresión del primer condicional comprueba si el programa ha recibido algún argumento ($1) y sale si no lo ha recibido, mostrándole al usuario un pequeño mensaje de uso. El resto del script debería estar claro.

Leyendo información del usuario

En muchas ocasiones, puede querer solicitar al usuario alguna información, y existen varias maneras para hacer esto. Ésta es una de ellas:

#!/bin/bash

echo Por favor, introduzca su nombre

read NOMBRE

echo “¡Hola $NOMBRE!”

Como variante, se pueden obtener múltiples valores con read. Este ejemplo debería clarificarlo.

#!/bin/bash

echo Por favor, introduzca su nombre y primer apellido

read NO AP

echo “¡Hola $AP, $NO!”

Evaluación aritmética

Pruebe esto en la línea de comandos (o en una shell):

echo 1 + 1

Si esperaba ver ‘2’, quedará desilusionado. ¿Qué hacer si quiere que BASH evalúe unos números? La solución es ésta:

echo $((1+1))

Esto producirá una salida más ‘lógica’. Esto se hace para evaluar una expresión aritmética. También puede hacerlo de esta manera:

echo $[1+1]

Si necesita usar fracciones, u otras matemáticas, puede utilizar bc para evaluar expresiones aritméticas.

Si ejecuta “echo $[3/4]” en la línea de comandos, devolverá 0, porque bash sólo utiliza enteros en sus respuestas. Si ejecuta “echo 3/4|bc -l”, devolverá 0.75.

Capurando la salida de un comando–

Este pequeño script muestra todas las tablas de todas las bases de datos (suponiendo que tenga MySQL instalado). Considere también cambiar el comando ‘mysql’ para que use un nombre de usuario y clave válidos.

#!/bin/bash

DBS=`mysql -uroot -e”show databases”`

for b in $DBS ;

do

mysql -uroot -e”show tables from $b”

done

Operadores de comparación de cadenas

s1 = s2

s1 coincide con s2

s1 != s2

s1 no coincide con s2

s1 < s2

s1 es alfabéticamente anterior a s2, con el locale actual

s1 > s2

s1 es alfabéticamente posterior a s2, con el locale actual

-n s1

s1 no es nulo (contiene uno o más caracteres)

-z s1

s1 es nulo

Ejemplo de comparación de cadenas

Comparando dos cadenas

#!/bin/bash

S1=’cadena’

S2=’Cadena’

if [ $S1!=$S2 ];

then

echo “S1(‘$S1’) no es igual a S2(‘$S2’)”

fi

if [ $S1=$S1 ];

then

echo “S1(‘$S1’) es igual a S1(‘$S1’)”

fi

Operadores aritméticos

+ (adición)

– (sustracción)

* (producto)

/ (división)

% (módulo)

Operadores relacionales aritméticos

-lt (<)

-gt (>)

-le (<=)

-ge (>=)

-eq (==)

-ne (!=)

Los programadores de C tan sólo tienen que corresponder el operador con su paréntesis.

Comandos útiles

Esta sección ha sido reescrita por Kees (véanse agradecimientos)

Algunos de estos comandos contienen lenguajes de programación completos. Sólo se explicarán las bases de estos comandos. Para una descripción más detallada, eche un vistazo a las páginas man de cada uno.

sed (editor de flujo)

Sed es un editor no interactivo. En vez de alterar un fichero moviendo el cursor por la pantalla, se utiliza una serie de instrucciones de edición de sed, y el nombre del fichero a editar. También se puede describir a sed como un filtro. Miremos algunos ejemplos:

$sed ‘s/a_sustituir/sustituto/g’ /tmp/petete

Sed sustituye la cadena ‘a_sustituir’ por la cadena ‘sustituto’, leyendo del fichero /tmp/petete. El resultado se envía a stdout (normalmente la consola), pero se puede añadir ‘> captura’ al final de la línea de arriba para que sed envíe la salida al fichero ‘capture’.

$sed 12, 18d /tmp/petete

Sed muestra todas las líneas de /tmp/petete excepto la 12 y la 18. El fichero original no queda alterado por este comando.

awk (manipulación de bases de datos, extracción y proceso de texto)

Existen muchas implementaciones del lenguaje de programacin AWK (los intérpretes más conocidos son gawk de GNU, y el ‘nuevo awk’ mawk). El principio es sencillo: AWK busca un patrón, y por cada patrón de búsqueda que coincida, se realiza una acción.

Si tenemos un fichero /tmp/petete con las siguientes líneas:

“prueba123

prueba

pprruueebbaa”

y ejecutamos:

$awk ‘/prueba/ {print}’ /tmp/petete

El patrón que busca AWK es ‘prueba’ y la acción que realiza cuando encuentra una línea en /tmp/petete con la cadena ‘prueba’ es `print’.

$awk ‘/prueba/ {i=i+1} END {print i}’ /tmp/petete

Cuando se utilizan muchos patrones, se puede reemplazar el texto entre comillas por ‘-f fichero.awk’, y poner todos los patrones y acciones en ‘fichero.awk’.

grep (impresión de líneas que coinciden con un patrón de búsqueda)—

Ya hemos visto ejemplos del comando grep en los capítulos anteriores, que muestra las líneas que concuerdan con un patrón. Pero grep puede hacer más que eso.

$grep “busca esto” /var/log/messages -c

12

Se ha encontrado 12 veces la cadena “busca esto” en el fichero /var/log/messages.

[vale, este ejemplo es falso, el fichero /var/log/messages está alterado :-)]

wc (cuenta líneas, palabras y bytes)

En el siguiente ejemplo, vemos que la salida no es lo que esperábamos. El fichero petete utilizado en este ejemplo contiene el texto siguiente:

“programación en bash

como de introducción”

$wc –words –lines –bytes /tmp/petete

2 5 41 /tmp/petete

Wc no tiene en cuenta el orden de los parámetros. Wc siempre los imprime en un orden estándar, que es, como se puede ver: líneas, palabras, bytes y fichero.

sort (ordena líneas de ficheros de texto)

Esta vez, el fichero petete contiene el texto siguiente:

“b

c

a”

$sort /tmp/petete

Esto es lo que muestra la salida:

a

b

c

Categorías:Administracion
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: