Administracion UNIX:´ Programacion en...
Transcript of Administracion UNIX:´ Programacion en...
Administracion UNIX:Programacion en bash
Antonio [email protected]
Septiembre 2014
[email protected] Administracion UNIX: Programacion en bash 1/1
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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