Administracion UNIX:´ Programacion en...

35
Administraci ´ on UNIX: Programaci ´ on en bash Antonio LaTorre atorre@fi.upm.es Septiembre 2014 atorre@fi.upm.es Administraci ´ on UNIX: Programaci ´ on en bash 1/1

Transcript of Administracion UNIX:´ Programacion en...

Page 1: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Administracion UNIX:Programacion en bash

Antonio [email protected]

Septiembre 2014

[email protected] Administracion UNIX: Programacion en bash 1/1

Page 2: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

bash (Bourne-Again Shell)

• Shell de texto basada en el Bourne Shell• Creada por Brian Fox en 1989• POSIX shell con extensiones (Cumple con SUS)• Software libre (parte del proyecto GNU)• Estandar de facto en la mayorıa de Linux• Presente en casi todos los UNIX modernos

Sintaxis basicamandato [parametros...]

[email protected] Administracion UNIX: Programacion en bash 2/1

Page 3: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Mandatos

mandato [parametros...]

• Los mandatos se invocan usando el nombre del ficheroejecutable

• El ejecutable tiene que estar dentro del PATH• Los parametros se separan por uno o mas espacios• Se pueden redirigir la entrada y salida estandar del

proceso que se arranca• Se puede invocar mas de un mandato en secuencia• Se puede recuperar y operar con el valor de retorno del

mandato invocado

[email protected] Administracion UNIX: Programacion en bash 3/1

Page 4: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Mandatos

Valor de retorno

• Cuando terminan, todos los procesos tienen un valor deretorno (numero entero)

• La shell captura ese valor y lo almacena por si esnecesario su uso posterior

• El valor de retorno 0 indica terminacion satisfactoria (elprograma ha terminado sin problemas)

• Un valor de retorno distinto de 0 suele indicar que se haproducido algun error. Diferentes valores de retorno (1, 2,

3...) se usan como codigos de error• La mayorıa de shells tratan ademas el valor de retorno 0

como valor logico verdadero y cualquier otro como falso

[email protected] Administracion UNIX: Programacion en bash 4/1

Page 5: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Variables

Declaracion y expansion basica

• bash permite declarar variables que almacenansecuencias de caracteres

• Se declaran asignandoles un valor:nombre=valor

• Se pueden convertir en variables de entorno usando elmandato export

VAR1=12

export VAR1

• Se accede a su valor usando el operador prefijo deexpansion $

mandato $VAR1

[email protected] Administracion UNIX: Programacion en bash 5/1

Page 6: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Variables

Tipo, expansion aritmetica

• Las variables no tienen tipo explıcito, y normalmente setratan como cadenas de textoVAR=1+2

la variable valdra la cadena “1+2”• bash puede operar con el valor de una variable como si

fuese un numero entero. Para ello se usa el entorno$(( )). Lo que haya dentro se resuelve como unaoperacion matematicaVAR=$((1+2))

la variable valdra la cadena “3”Los nombres de variables se expanden automaticamenteen esta construccion

[email protected] Administracion UNIX: Programacion en bash 6/1

Page 7: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Variables de entorno

• Valores con nombre que se almacenan en el entorno delsistema

• Usadas por los procesos y servicios• Muestran parte del estado y caracterısticas de

configuracion del sistema• De sistema o de usuario• Ejemplos:

• PATH: Rutas donde buscar ejecutables• PWD: Directorio actual• UID: Uid del usuario• ?: Valor del retorno del ultimo mandato invocado• RANDOM: Generador de numeros aleatorios (bash)

• El mandato env muestra todas las variables de entornodefinidas

[email protected] Administracion UNIX: Programacion en bash 7/1

Page 8: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Redirecciones

bash permite redirigir la entrada y salida estandar de losprocesos que crea• El operador < se usa para redirigir la entrada de un

mandato a un ficheromandato [params...] < fichero

• El operador > se usa para redirigir la salida de un mandatoa un ficheromandato [params...] > fichero

Se puede especificar el descriptor que se desea redirigir:mandato > fichero redirige la salida estandarmandato 2> fichero redirige la salida estandar de error

• El operador >> es similar a >, pero escribe al final delfichero (append)

[email protected] Administracion UNIX: Programacion en bash 8/1

Page 9: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Redirecciones

• El operador &numero permite referirse a otro descriptor defichero

• Combinado con los operadores < y > permite agruparredirecciones

• Ejemplo:

mandato > fichero 2>&1

La salida estandar de error (2) se redirige al mismo sitioque la salida estandar (1)

mandato >& fichero

Ambas salidas estandar se redirigen al mismo fichero.

[email protected] Administracion UNIX: Programacion en bash 9/1

Page 10: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Expansiones

Expasion de nombre de ficheroLos caracteres *, ?, [, ] se usan para reemplazar un patron porla lista ordenada de todos los ficheros en el directorio actualque encajan con el patron:

Todos los ficheros de extension txt

ls *.txt

Todos los ficheros con cualquier extension de 3 caracteres:ls *.???

Todos los ficheros que empiezan por a, b o c:ls [abc]*

[email protected] Administracion UNIX: Programacion en bash 10/1

Page 11: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Expansiones

Expansion de llavesUtil para escribir secuencias repetitivas de argumentos:

{a,b,c}d→ ad bd cd

fichero{1..3} → fichero1 fichero2 fichero3

{a..b}{1..2} → a1 b1 a2 b2

Expansion con substitucionExpansion de variable con sustitucion con la construccion${var/patron/sub}:

VAR=fichero.png

EXT=.jpeg

${VAR/.png/$EXT} → fichero.jpeg

[email protected] Administracion UNIX: Programacion en bash 11/1

Page 12: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Expansiones

Expansion de tildebash permite expresar invocaciones a mandatos anidados• Usando la sitaxis `mandato [params...]` se puede

invocar a un mandato como parametro de otro• bash ejecuta primero el mandato entre tildes ` (tecla a la

derecha de la P en el teclado ES, no con confundir con elapostrofe ’) primero, y lo sustituye en la invocacion delsegundo por su salida estandar (NO su valor de retorno)

mandato1 param1 `mandato2 param2 param3` param4

[email protected] Administracion UNIX: Programacion en bash 12/1

Page 13: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Escapado

• El operador \ se utiliza para escapar caracteresespeciales como &, ", |, ; o el propio \\& \"\| \; \\

• Para indicar que una secuencia de caracteres debeinterpretarse como una cadena unica se pueden usar lascomillas simples (’) o dobles (”):

• La comilla doble permite algunas expansiones, tales comola de variables. Habitual para evitar que una variable conespacios sea interpretada como multiples argumentos.

"${NOMBRE}"

• La comilla simple no permite ninguna expansion.

[email protected] Administracion UNIX: Programacion en bash 13/1

Page 14: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Secuencias de mandatos

bash permite crear secuencias de mandatos usandooperadores de concatenacion• El operador ; se usa para crear una lista de mandatos.

Los mandatos se ejecutan secuencialmentemandato1 [args...] ; mandato2 [args...] ; ...

• El operador && es similar a un AND logico perezoso:El segundo mandato solo se ejecuta si el primerotermino correctamente (retorno 0)mandato1 [args...] && mandato2 [args...] && ...

[email protected] Administracion UNIX: Programacion en bash 14/1

Page 15: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Secuencias de mandatos

• El operador || es similar a un OR logico perezoso:El segundo mandato solo se ejecuta si el primero notermino correctamente (retorno 6= 0)mandato1 [args...] || mandato2 [args...] || ...

• El operador | crea una tuberıa o pipe que comunica lasalida estandar (fd 1) del primer mandato con la entradaestandar (fd 0) del segundomandato1 [args...] | mandato2 [args...] | ...

[email protected] Administracion UNIX: Programacion en bash 15/1

Page 16: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Secuencias de control

if

Condicion if tıpica

if <condicion>

then

mandato1

...

elif <condicion>

then

...

else

...

fi

• Las condiciones son asu vez secuencias demandatos, que seinterpretan en funcionde su valor de retorno

• El sub-bloque else sepuede omitir

• El sub-bloque elif

puede aparecer 0 o masveces

if <cond>; then mandato1; ...; else mandato2; ...; fi

[email protected] Administracion UNIX: Programacion en bash 16/1

Page 17: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Secuencias de control

Condiciones [ ]

• Es muy habitual evaluar condiciones usando el mandatotest

if test $VAR -gt 10

then

echo "Es mayor que 10"

fi

• bash permite remplazar este mandato por sus parametrosentre corchetes [ ]

if [ $VAR -gt 10 ]

then

echo "Es mayor que 10"

fi

[email protected] Administracion UNIX: Programacion en bash 17/1

Page 18: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Secuencias de control

case

case <expresion> in

caso_1 )

mandato1

mandato2;;

caso_2 )

mandato3

...;;

...

esac

Se evalua el resultado de laexpresion, no su retorno

while

while <condicion>

do

...

done

until

until <condicion>

do

...

done

[email protected] Administracion UNIX: Programacion en bash 18/1

Page 19: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Secuencias de control

for

for variable in <lista>

do

...

done

• La lista esta formada poruna secuencia de una omas cadenas separadaspor espacios

select

select variable in <lista>

do

...

[break]

done

• La sentencia select

muestra un pequenomenu con las opcionesde la lista. break seemplea para romper elbucle

[email protected] Administracion UNIX: Programacion en bash 19/1

Page 20: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Algunos mandatos utiles

trueMandato que no hace nada. Termina con valor de retorno 0

falseMandato que no hace nada. Termina con valor de retorno 1

echoImprime por su salida estandar un mensaje pasado comoparametro

echo hola

hola

echo $PATH

/usr/sbin:/usr/bin:/sbin:/bin

[email protected] Administracion UNIX: Programacion en bash 20/1

Page 21: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Algunos mandatos utilescatMuestra el contenido de un fichero

cat fichero1

este es el contenido del fichero1

headMuestra las primeras lıneas de un fichero

tailMuestra las ultimas lıneas de un fichero

Si no se indica fichero operan con la entrada estandar

seq

Genera secuencias de numeros

[email protected] Administracion UNIX: Programacion en bash 21/1

Page 22: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Algunos mandatos utiles

wcCuenta lıneas, palabras y bytes de un fichero

wc /var/log/auth.log

433 5266 41533 /var/log/auth.log

cutSelecciona columnas especıficas en ficheros de texto

ls -l | cut -d’ ’ -f1

-rw-r-----

-rw-r-----

drwxr-xr-x

Si no se indica fichero operan con la entrada estandar

[email protected] Administracion UNIX: Programacion en bash 22/1

Page 23: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Algunos mandatos utiles

grep

Muestra la lıneas de un fichero que presentan un patrongrep [OPTIONS] PATTERN [FILE...]

cat fichero1

esta es la primera lınea

esta es la segunda

esta es la tercera lınea

grep lınea fichero1

esta es la primera lınea

esta es la tercera lınea

grep nos permite usar expresiones regulares. Si no se indicafichero, opera con la entrada estandar

[email protected] Administracion UNIX: Programacion en bash 23/1

Page 24: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Algunos mandatos utiles

sedRealiza transformaciones sobre cadenas de texto• Anadir y eliminar fragmentos• Reemplazar sub-cadenas• ...

echo "Hola Mundo" | sed s/"Mundo"/"a todos"/g

Hola a todos

Opera con expresiones regulares (al igual que grep). Si no seindica fichero, opera con la entrada estandar

[email protected] Administracion UNIX: Programacion en bash 24/1

Page 25: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Algunos mandatos utiles

testRealiza comprobaciones y evalua condiciones logicas• Comprueba si un fichero existetest -f fichero

• Comprueba si dos cadenas son igualestest STRING1 = STRING2

• Comprueba si un numero es mayor que otrotest INTEGER1 -gt INTEGER2

• ...Ejemplos:

test -f fichero1 && cat fichero1

test $I -gt $MAX || I=$(($I+1))

[email protected] Administracion UNIX: Programacion en bash 25/1

Page 26: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Combinando mandatos en bash

Ejemplos

• test $PWD = /tmp && echo "Estamos en $PWD"

Imprime un mensaje indicando el directorio en que nosencontramos, si este es /tmp

• cat /var/log/messages | grep "^A.*m$" | head -n2

Muestra las dos primeras lıneas del fichero/var/log/messages que empiezan por A y acaban por m

• cd /tmp; echo "probando" > prueba.txt; cd -

Cambia al directorio /tmp, escribe el mensaje "probando"

en el fichero prueba.txt y regresa al directorio original• grep "`date + %D`" /tmp/prueba.txt > /dev/null ||

date + %D > /tmp/prueba.txt

[email protected] Administracion UNIX: Programacion en bash 26/1

Page 27: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

• Un bash script es un fichero de texto plano que contieneuna serie de mandatos y operadores que pueden serinterpretados y procesados por bash

• Mecanismo basico: invocar a bash como un mandato,pasandole el script como parametrobash mi script.sh

• Alternativamente se pueden dar permisos de ejecucion alfichero y lanzarlo con un programa mas. Para que estofuncione es necesario incluir una cabecera al principio delfichero (primera lınea)#!/bin/bash

[email protected] Administracion UNIX: Programacion en bash 27/1

Page 28: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

Estructura basicaUn script de bash contiene lıneas con declaraciones devariables, secuencias de mandatos, sentencias de control...Ejemplo:

#!/bin/bash

# Leemos los parametros de entrada

CADENA=$1

FICHERO=$2

# Contamos las lıneas de FICHERO en las

# que aparece CADENA

grep $CADENA $FICHERO | wc -l

# Terminamos satisfactoriamente

exit 0

[email protected] Administracion UNIX: Programacion en bash 28/1

Page 29: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

Parametros de entradaLos scripts se pueden invocar pasando parametros de entrada.Para acceder a ellos se usan variables especiales dentro delscript• $# almacena el numero de parametros que se han pasado• $0 almacena el nombre del propio script• $1, $2, $3, ... almacenan los parametros, por orden• $* almacena todos los parametros como una sola cadena

[email protected] Administracion UNIX: Programacion en bash 29/1

Page 30: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

shiftDescarta el primer parametro y desplaza los demas unaposicion

VAR1=$1

VAR2=$2

Es lo mismo queVAR1=$1

shift

VAR2=$1

readLee uno o mas parametros por la entrada estandar y losalmacena en variables

read VAR1 VAR2 VAR3 ...

[email protected] Administracion UNIX: Programacion en bash 30/1

Page 31: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

OpcionesLas argumentos opcionales se pueden tratar por medio debloques case y usanso shift pero resulta mas sencillo usargetops:

while getopts ab: opcion

do

case $opcion in

a) activar_a=1;;

b) activar_b=1

valor_b="$OPTARG";;

?) printf "Usage: %s: [-a] [-b valor] args\n" $0

exit 2;;

esac

done

Este metodo no sirve para multiples parametros por opcion.

[email protected] Administracion UNIX: Programacion en bash 31/1

Page 32: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

Ejemplo

#!/bin/bash

if [ $# -ne 3 ]

then

echo "uso: $0 <palabra> <letra> <repeticiones>"

exit 1

fi

PALABRA=$1

LETRA=$2

REP=$3

POS=1

while [ $POS -le $REP ]

do

echo ‘echo $PALABRA | sed s/$LETRA/A/g‘ "(repeticion $POS)"

POS=$(($POS+1))

done

[email protected] Administracion UNIX: Programacion en bash 32/1

Page 33: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

Otro ejemplo

#!/bin/bash

echo "Parametro 1: $1"

echo "Parametro 2: $2"

echo "Parametro 3: $3"

select OP in concatenar reemplazar salir

do

case $OP in

"concatenar" )

echo $1$2$3 ;;

"reemplazar" )

echo $1 | sed s/$2/$3/g ;;

"salir" )

break ;;

esac

done

[email protected] Administracion UNIX: Programacion en bash 33/1

Page 34: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

Funcionesbash permite declarar funciones dentro de un script• Funcionan como sub-scripts• Se usan igual que otros mandatos• Pueden recibir parametros, que se gestionan con $#, $*,

$1, $2, ...

• Tienen valor de retorno

function nombre {

...

return <valor>

}

nombre () {

...

return <valor>

}

[email protected] Administracion UNIX: Programacion en bash 34/1

Page 35: Administracion UNIX:´ Programacion en bash´laurel.datsi.fi.upm.es/_media/docencia/asignaturas/asi/bash_2014.pdf · Scripts en bash Un bash script es un fichero de texto plano que

Scripts en bash

Ejemplo con funciones

#!/bin/bash

function sum {

echo $(($1+$2))

return 0

}

div () {

if [ $2 = 0 ]

then

echo "ERROR. Denominador = 0"

return 1

fi

echo $(($1/$2))

return 0

}

echo "Dime dos numeros"

read NUM1 NUM2

echo "Suma: "‘sum $NUM1 $NUM2‘

RES_DIV=‘div $NUM1 $NUM2‘

if [ $? = 1 ]

then

echo $RES_DIV

echo "No se puede dividir"

else

echo "Division: "$RES_DIV

fi

[email protected] Administracion UNIX: Programacion en bash 35/1