Tutorial de bash

De LIDSOL

Contenido

Shell: aquel desconocido

Nota: El signo "$" indica tecleo directo en consola de los comandos y parámetros.

¿Qué es un shell?

  • El shell es un interprete de comandos.
  • Pero también es un lenguaje.
  • El conjunto de comandos es un script.
  • Un script sirve como 'pegamento' de diversos comandos sencillos, que en conjunto son considerablemente poderosos.

¿Por qué aprender a programarlo?

  • Te evita hacer tareas repetitivas.
  • Es bueno conocerlos, algún dia resolverá algun problema como con los scripts en /etc/rc.d.
  • Es fácil de aprender: piensa que quieres hacer - escribelo - revisalo (ahora ponlo todo en un archivo o script).
  • Usualmente no tienes que debugear mucho, es como si vaciaras lo que harías en el prompt de comandos, pero escrito en un archivo.
  • Es ideal para hacer algunos prototipos.
  • Es muy *NIX: Keep It Simple Stupid! (divide y venceras).

No se use en caso de...

  • Hacer matemáticas intensas - Use Fortran (sí, aún existe).
  • Requerir super portabilidad - Use Java, .NET o 'C'.
  • Aplicaciones complejas - Por ejemplo, que requieran estructuras mas elaboradas.
  • Aplicaciones de misión crítica.
  • Requerir estructuras de datos 'elegantes' - Listas enlazadas, árboles.
  • Crear Aplicaciones propietarias - Es difícil de ofuscar :).

API de shell

API de shell

  • Todo comando de *nix puede ser invocado.
  • Comandos de testing.
  • loops - ciclos.
  • Tus propios programas o scripts son parte del API!

¿Cómo creo un script?

  • Crea un archivo miscript.sh con tu editor de textos favorito.
  • Dale permisos de ejecuci\'on: $chmod +x miscript.sh.
  • Ejecutalo: $./miscript.sh
  • Listo!
  • En serio, eso es todo. :).

Ejemplo

  1. #!/bin/bash
  2. echo 'Hello world'

Corriendo el script

  • Guardarlo en el archivo script.sh
  1. $chmod +x script.sh
  2. $./script.sh

Ejemplo

  1. #!/bin/bash
  2. DATE=`date +%d-%m-%y`
  3. USER=foobar
  4. echo 'Comenzando el backup'
  5. tar cjvf /tmp/$USER-$DATE.tbz /home/foobar
  6. echo 'Backup terminado'

Redireccionando

  • Redireccionar stdout a un archivo.
  • Redireccionar stderr a un archivo.
  • Redireccionar stdout a stderr.
  • Redireccionar stderr a stdout.
  • Redireccionar stdout y stderr a un archivo.

Ejemplo de redireccionamiento

 $ls -l >ls-l.txt

Ejemplo de redireccionamiento

 $grep da * 2> grep-errors.txt

Ejemplo de redireccionamiento

 $grep da * 1>&2 grep-errors.txt

Ejemplo de redireccionamiento

 $grep * 2>&1

Ejemplo de redireccionamiento

 $rm -f $(find / -name core) &> /dev/null

Tuberias o Pipes

  • Una tuberia sirve para redireccionar la salida de un comando a la entrada de otro.
  • Por omision, la salida estandar sera redireccionada a la entrada estandar del otro programa.

Ejemplo de tuberia

 $ls -l | grep "\.txt$ 

Variables

  • Las variables no necesitan ser declaradas.
  • Son dinámicas además (no tienes que 'alojar' memoria).

Ejemplo Hola mundo! meet variables

  1. #!/bin/bash
  2. STR=''Hello world!''
  3. echo $STR

Ejemplo de Respaldo

  1. #!/bin/bash
  2. OF=/var/my-backup-$(date +%Y%m%d).tgz
  3. tar -cZf $OF /home/me/

Ejemplo de Hola mundo! con funciones

  1. #!/bin/bash
  2. HELLO=Hello
  3. function hello {
  4. local HELLO=World
  5. echo $HELLO
  6. }
  7. echo $HELLO
  8. hello
  9. echo $HELLO

Condicionales

  • Tenemos if's en bash! Con diferentes sabores.
  • if expression then statement.
  • if expression then statement1 else statement2.
  • if expression1 then statement1 else if expression2 then statement2 else statement3.

Ejemplo de if-then

  1. #!/bin/bash
  2. if [ ``foo'' = ``foo'' ]; then
  3. echo ``Cierto, foo == foo''
  4. fi

Ejemplo de if-then-else

  1. #!/bin/bash
  2. if [ ``foo'' = ``foo'' ]; then
  3. echo ``Cierto, foo == foo''
  4. else
  5. echo ``Era falsa''
  6. fi

Cuando las variables y condicionales se encuentran

  1. #!/bin/bash
  2. T1=''foo''
  3. T2=''bar''
  4. if [ $T1 = $T2 ]; then
  5. echo ``Cierto, ``$T1''== ``$T2
  6. else
  7. echo ``No es cierto''
  8. fi

-Fruit- Loops err... ciclos

  • for - es un poco diferente, puedes iterar sobre cadenas o palabras en las cadenas.
  • while - ejecuta un pedazo de codigo si una condicion se cumple, y para cuando es falsa.
  • until - ejecuta un pedazo de codigo, hasta que una expresion sea falsa.
  • Cuide sus expresiones, no vaya a caer en un ciclo infinito.

Ejemplo Mi primer for

  1. #!/bin/bash
  2. for i in $( ls ); do
  3. echo item: $i
  4. done

Ejemplo Mira mamá, como en C

  1. #!/bin/bash
  2. for i in `seq 1 10`;
  3. do
  4. echo $i
  5. done

Ejemplo del while

  1. #!/bin/bash
  2. COUNTER=0
  3. while [ $COUNTER -lt 10 ]; do
  4. echo The counter is $COUNTER
  5. let COUNTER=COUNTER+1
  6. done

¡Hey! ¿qué era eso de let?

  • Note el uso de let, let lo que hace es evaluar arithmeticamente la expresion que sigue.
  • Para mas en expresiones aritmeticas, da: 'man bash' y busca ARITHMETIC EVALUATION.

Ejemplo del until

  1. #!/bin/bash
  2. COUNTER=20
  3. until [ $COUNTER -lt 10 ];
  4. do
  5. echo COUNTER $COUNTER
  6. let COUNTER-=1
  7. done

Funciones

  • Para hacer los programas ordenados.
  • Para reusar codigo.
  • Para ser recursivo.

Ejemplo de funcion

  1. #!/bin/bash
  2. function quit {
  3. exit
  4. }
  5. function hello {
  6. echo Hello!
  7. }
  8. hello
  9. quit
  10. echo foo

Ejemplo de funciones con argumentos

  1. #!/bin/bash
  2. function quit {
  3. exit
  4. }
  5. function e {
  6. echo $1
  7. }
  8. e Hello
  9. e World
  10. quit
  11. echo foo

Haciendo un menú

  • Podemos hacer un menu en shell!

Menu simple

  1. #!/bin/bash
  2. OPTIONS=''Hello Quit''
  3. select opt in $OPTIONS; do
  4. if [ ``$opt'' = ``Quit'' ]; then
  5. echo done
  6. exit
  7. elif [ ``$opt'' = ``Hello'' ]; then
  8. echo Hello World
  9. else
  10. clear
  11. echo bad option
  12. fi
  13. done

Revisando argumentos

  • Para completar el menu, tenemos forma de revisar los argumentos!

Ejemplo Mira mamá, con argumentos!

  1. #!/bin/bash
  2. if [ -z ``$1'' ]; then
  3. echo usage: $0 directory
  4. exit
  5. fi
  6. SRCD=$1
  7. TGTD=''/var/backups/''
  8. OF=home-$(date +%Y%m%d).tgz
  9. tar -cZf $TGTD$OF $SRCD
  10. done

Leyendo entradas de los usuarios

  • Podemos leer entradas 'interactivas' del usuario.
  • Notan que podemos hacer un facil juego en BASH?
  • Si, un juego en texto :).

Ejemplo de read

  1. #!/bin/bash
  2. echo Por favor, meta su nombre
  3. read NAME
  4. echo ``Hi $NAME!''

Ejemplo + reads

  1. #!/bin/bash
  2. echo Por favor, meta su nombre y apellido
  3. read FN LN
  4. echo ``Hi! $LN, $FN !''

Usando bash como calculadora

  • Uno puede hacer uso del sistema de expresiones aritmeticas de bash.
  • Si hacen algo como: echo 1+1 - no obtendran los resultados adecuados (bash interpretara 1+1 como cadena, y como tal, la imprimira).
  • Se puede hacer: echo \$((1+1)).
  • Se puede hacer: echo \$[1+1].
  • Solo funciona con enteros. Si necesita algo mas alla de ello, use bc.

Si necesita uno debugear

  • Use #!/bin/bash -x

Mas recursos

Herramientas personales