Está en la página 1de 61

Bash scripting

Pablo Garaizar Sagarminaga

e-ghost, cursos de verano, 2011

Qu vamos a ver?

El intrprete de comandos:

Comandos bsicos.

Tuberas.

Comandos de filtrado.

Bsquedas y expresiones regulares.

Otros comandos.

Scripting.

Optimizaciones.

Intrprete de comandos

Shells

Existen muchas shells: sh, csh, ksh, bash, etc.

Entorno de trabajo:

Case sensitive: sensible a maysculas (ECHO != echo).


Sintxis: comando arg1 arg2... argn
Si un programa no est en el PATH: ./programa
Prompt:

$: usuario normal
#: usuario administrador/a (root)

Comandos bsicos

ls: listar.

touch: crea fichero.

man: manual.

rm: borra fichero.

pwd: directorio actual.

mkdir: crea directorio.

cd: cambia de directorio.

rmdir: borra directorio.

echo: escribe texto.

cp: copia ficheros.

cat: muestra fichero.

mv: mueve ficheros.

more: paginador.

ln: crea enlaces.

file: muestra tipo de fichero.

date: muestra la fecha.

Tuberas

Un proceso en un sistema UNIX-like tiene


inicialmente abiertos 3 desages:

0: STDIN o entrada estndar

1: STDOUT o salida estndar

2: STDERR o salida de error

Imaginmonos una refinera:

Metes crudo por 0 (STDIN), consigues gasolina por 1


(STDOUT) y bastantes residuos por el desage 2
(STDERR).

Tuberas

Redirigiendo la salida de un comando:

> : redirigir STDOUT a un fichero

>> : redirigir STDOUT al final de un fichero (aadir)

ls>>listados.txt

2> : redirigir STDERR a un fichero

ls>listado.txt

ls2>errores.txt

2>> : redirigir STDERR al final de un fichero

ls2>>errores.txt

Tuberas

Redirigiendo la entrada de un comando:

< : redirigir el contenido de un fichero a STDIN

traA<fichero.txt

Tuberas:

| : es posible recoger la salida de un desage y


conducirlo a la entrada de otro comando.

catfichero.txt|traA

Comandos de filtrado

sort: ordena lneas de ficheros de texto.

tr: reemplaza un carcter por otro.

head: muestra las N primeras lneas de un fichero.

tail: muestra las N ltimas lneas de un fichero.

wc: cuenta lneas, palabras o caracteres.

cut: permite cortar columnas de un fichero en funcin de un


carcter.

Bsquedas y regexps

Comandos de bsqueda:

find: busca ficheros.

grep: busca patrones en ficheros.

sed: modifica patrones.

awk: busca y modifica campos en ficheros.

Todos usan patrones, expresiones regulares.

Bsquedas y regexps

grep: busca una cadena o patrn en ficheros y


muestra las lneas que la contienen.
grep[opciones]patron[fich1fich2...]

Metacaracteresvlidos:

.(uncarctercualquiera)

*(ceroomsocurrenciasdelcarcteranterior)

^(principiodelnea)

$(findelnea)

[af](cualquiercarcterdelrango)

\<\>(principioyfindepalabra)

Bsquedas y regexps

Opciones tpicas:

-c escribe slo el nmero de ocurrencias encontradas.


-i ignora maysculas y minsculas.
-l escribe slo los nombres de fichero donde ha
encontrado el patrn.
-s opera en silencio, slo saca mensajes de error.
-v escribe lneas que NO contienen el patrn
-w trata el patrn como una palabra entera.

Uso tpico: filtrar la salida de un comando


$comando|grep....

Bsquedas y regexps

Patrones

.(uncarctercualquiera)

*(ceroomsocurrenciasdelcarcteranterior)

^(principiodelnea)

$(findelnea)

[af](cualquiercarcterdelrango)

[AD](caracteres'','A','D')

[^56](todosloscaracteresexcepto'5'y'6')

[5^6](caracteres'5','^','6')

[[:alnum:]](todosloscaracteresalfanumricos)

Bsquedas y regexps

Quoted Braces (llaves)

Se utilizan para buscar un nmero determinado de


repeticiones de la expresin:

expresion_regular\{min,max\}

expresion_regular\{exact\}

grep '[345]\{2,4\}' fichero


grep'r\{2\}'fichero(buscados'r'seguidas)

expresion_regular\{min,\}

grep'er\{2,\}'fichero

(buscalineasconalmenosdoscaracteres
'r'precedidosporuna'e').

Bsquedas y regexps

Quoted Parentheses (parntesis)

Almacena los caracteres que concuerdan con la


expresion regular en un registro.
Se pueden utilizar hasta 9 registros en una
expresin regular
Para referenciar los registros utilizamos \1 a \9

Ejemplo: listamos lneas con dos caracteres idnticos


seguidos:
grep '\(.\)\1' fichero

Bsquedas y regexps

Qu es awk?

Awk es un lenguaje de programacin utilizado para


manipular texto.
Los datos se manipulan como palabras (campos)
dentro de una lnea (registro).
Un comando awk consiste en un patrn y una
accin que comprende una o ms sentencias.

awk'patron{accion}'fichero...

Bsquedas y regexps

Qu es awk?

awk comprueba cada registro de los ficheros


indicados en busca de coincidencias con el patrn;
si se encuentra alguna se realiza la accin
especificada.
awk puede actuar como filtro tras un pipe o obtener
los datos de la entrada estndar si no se especifica
ningn fichero.

Bsquedas y regexps

Expresiones regulares

Las expresiones regulares quedan delimitadas con


el carcter '/' (ej: /x/)
Adems de todas las comentadas hasta ahora, awk
puede utilizar:

/x+/
Una o ms ocurrencias de x
/x?/
Una o ninguna ocurrencia de x
/x|y/ Tanto x como y
(string) Agrupa una cadena para usar con + o ?

Bsquedas y regexps

Sentencia print

Es de las ms utilizadas

awk'patron{print}'f_ent>f_sal

esteejemploseralomismoque:

$greppatronf_ent>f_sal

Referenciandocampos:

$0:Registrocompleto

$1:Primercampodelregistro

$2:Segundocampodelregistro

...

Bsquedas y regexps

Ms funcionalidades:

Multiples sentencias en una accin

Usando ; o salto de lnea:

Comentarios con #

Comparaciones de expresiones regulares o strings

==, !=, <, <=, >, >=, ~, !~, ||, &&


$1 ~ /x/

$awk'$1~/^[T]/||$3~/^[46]/{print}fichero

Bsquedas y regexps

Ms funcionalidades:

Variables de usuario

Operaciones aritmticas

Estructuras de control

if else if else
while
for

Bsquedas y regexps

find: herramienta muy potente para realizar


bsquedas de ficheros. Sintaxis:

find[path]opciones

Opcionestpicas:

namenombre

type(d|f|l|s|...)

maxdepthn

mindepthn

mtimen

execcomando\;({}indicaelfichero)

Usuarios y grupos

useradd: aade un usuario en el sistema.

userdel: elimina un usuario del sistema.

usermod: modifica las propiedades de un usuario.

groupadd: aade un grupo de usuarios en el sistema.

groupdel: elimina un grupo del sistema.

groupmod: modifica las propiedades de un grupo.

passwd: modifica la contrasea de un usuario.

gpasswd: aade un usuario a un grupo.

Propietarios y permisos

chmod: modifica el modo de acceso de un fichero.

chown: modifica el propietario de un fichero.

chgrp: modifica el grupo propietario de un fichero.

who: muestra usuarios conectados al sistema.

whoami: muestra el nombre de usuario del usuario actual.

id: muestra las propiedades del usuario y grupo actuales.

su: cambio de usuario actual.

Gestin de procesos

top: muestra informacin de procesador, procesos y memoria.

ps: muestra la lista de procesos que se estn ejecutando.

pstree: ps en forma de rbol.

pgrep: ps + grep.

pidof: muestra el PID del proceso que solicitemos.

kill: enva una seal a un proceso (PID).

killall: enva una seal a un proceso (nombre).

Gestin de procesos

&: al lanzar un proceso lo lanza en segundo plano.

bg: manda un proceso a ejecutarse en segundo plano.

fg: lleva un proceso a ejecutarse en primer plano.

ctrl+z: interrumpe un proceso y lo suspende.

ctrl+c: interrumpe un proceso y lo para (seal KILL).

jobs: muestra las tareas de la sesin actual en segundo plano.

nohup: hace que un proceso cuelgue de init y redirige su salida


a nohup.out.
disown: hace un nohup de un proceso ya en ejecucin.

Comandos de backup

gzip: compresor estndar

bzip2: compresor ms pontente pero ms lento

tar: empaquetador de ficheros (muy til)

zcat: cat sobre archivos comprimidos

zmore: more sobre archivos comprimidos

zgrep: grep sobre archivos comprimidos

zgrepcadenafile.gz
gzipcfile.gz|grepcadena

Shell Scripts

Script = Guin.
Tareas repetitivas se pueden agrupar en un
guin y ejecutarse automticamente (Batch
Processing).

Es sencillo ejecutar 4 comandos para crear un


buzn de correo.
No lo es tanto para crear 20.000 buzones.
Es sencillo hacer un bucle que se repita 20.000
veces ;-)

Shell Scripts

Nuestro primer shell script:

Usamos un editor y creamos el fichero hola.sh

Contenido de hola.sh:

#!/bin/sh
echohola

Con #! en la primera lnea indicamos quin debera


interpretar el resto de comandos (/bin/sh).
Posteriormente escribimos los comandos
separados por saltos de lnea.

Shell Scripts

Variables:

Una variable tiene un nombre y un valor, y sirve


para dotar de dinamismo a nuestros scripts:

FECHA=15/07/2004
echoHoyes$FECHA

FECHA es el nombre de la variable.


$FECHA es su valor.

Para asignar un valor, se utiliza =. SIN


ESPACIOS!!!

Shell Scripts

Variables de entorno:

Al arrancar una shell, ya hay muchas variables


definidas, son las variables de entorno.

Podemos ver su valor con el comando env.

mbito de una variable:

Si se define una variable en una shell, slo tiene valor en


esa shell, a no ser que se exporte a los programas hijo.
exportUSUARIO=joaquin
Si desde esa shell lanzamos un script u otro programa, la
variable USUARIO contendr joaquin.

Shell Scripts

Variables: interactividad

Es posible leer del usuario el valor de una variable,


dotando a nuestros scripts de interactividad.
cat hola.sh

#!/bin/sh
echoDimetunombre:
readNOMBRE
echoHola$NOMBRE,encantadode
conocerte

Shell Scripts

Variables: argumentos

Es posible pasar los parmetros o argumentos que


queramos y utilizarlos dentro del script.

cat nombre.sh

#!/bin/sh
echoNombre:$1
echoPrimerApellido:$2
echoSegundoApellido:$3

./nombre.shJuanLpezMartnez

./nombre.shMariaDoloresPraderaSnchez

Shell Scripts

Variables: argumentos

$1, $2, $3... ${10}, ${11}: argumentos

$0 es el propio script.

basename $0: nombre del script.


dirname $0: ruta al nombre del script.

shift: rota los argumentos hacia la izquierda

$1 ahora vale lo que vala $2, $2 lo que vala $3, etc.


$0 no cambia.

Shell Scripts

Variables: argumentos especiales

$#: nmero de argumentos que nos han pasado.

$*: todos los argumentos. $* = $1 $2 $3...

$@: todos los argumentos. $@ = $1 $2 $3...

$_: comando anteriormente ejecutado.

$$: PID del propio proceso shell.

Shell Scripts

Variables: sustitucin de comandos

Es posible almacenar en una variable el resultado


de la ejecucin de un comando.
Dos sintaxis:

Acentos graves: compatibilidad

LISTADO=`ls`

Con $(): anidable

LISTADO=$(ls)
LISTADO=$(ls$(catdirectorios.txt))

Shell Scripts

expr: Permite realizar operaciones aritmticas.

Sintaxis: exprARG1OPARG2

$SUMA=`expr7+5`

(ojoespacios!)

$echo$SUMA
12
$expr7\>5 (ojoescaparoperadores!)
$expr\(7+5\)\*2

Ejercicio:Obtenerelmesanterioralactualconunasola
sentenciaexpr;)

Shell Scripts

Control del flujo de ejecucin:

Condiciones: test [ ]

test $NOMBRE == Juan


test $DINERO -eq 1000
-le)
test -f /etc/passwd
Modifican el valor de $?

cero = verdadero
no cero = falso

(==, !=, >, <, >=, <=)


(-eq, -ne, -gt, -lt, -ge,
(-f, -d, -L, -r, -w, -x)

(AL REVS QUE EN C!!)

Shell Scripts

Control del flujo de ejecucin:

if: alternativa simple. Sintaxis:

ifcomando_if
then
comandos_then
elifcomando_elif
then
comandos_elif
else
comandos_else
fi

Shell Scripts

Control del flujo de ejecucin:

if. Ejemplo:

iftest$NOMBRE==Juan
then
echoHolaJuanin,qutal?
eliftest$NOMBRE==Pedro
then
echoPedreteee,cuntotiempo!
else
echoNoteconozco
fi

Shell Scripts

Control del flujo de ejecucin:

case: cmodo para evitar alternativas anidadas. Sintaxis:

case$VARIABLEin
VALOR1)comandos_valor1
;;
VALOR2)comandos_valor2
;;
*)comandos_default;
esac

Shell Scripts

Control del flujo de ejecucin:

case. Ejemplo:

case$NOMBREin
Juan)echoHolaJuanin,qutal?
;;
Pedro)echoPedro,cuntotiempo!
;;
*)echonoteconozco;
esac

Shell Scripts

Control del flujo de ejecucin:

while. Ejecucin de 0 a N veces. Sintaxis:

whilecomando
do
comandos
done

Shell Scripts

Control del flujo de ejecucin:

while. Ejemplo:

N=1
while[$Nlt100]
do
echoRepito,yavoy$Nveces
N=$(expr$N+1)
sleep1#Esperamos1segundo
done

Shell Scripts

Control del flujo de ejecucin:

until. Ejecucin de 0 a N veces. Idntico a while con


la condicin negada. Sintaxis:

untilcomando
do
comandos
done

Shell Scripts

Control del flujo de ejecucin:

until. Ejecucin de 0 a N veces. Idntico a while con la


condicin negada. Sintaxis:

N=1
until[$Nge100]
do
echoRepito,yavoy$Nveces
N=$(expr$N+1)
done

Shell Scripts

Control del flujo de ejecucin:

for: ejecucin repetitiva asignando a una variable


de control valores de una lista. Sintaxis:

forVARIABLEinLISTA
do
comandos
done

Shell Scripts

Control del flujo de ejecucin:

for. Ejemplo:
forNinSopaArrozPandeajo
do
echoHoycomemos$N
done

Shell Scripts

Control del flujo de ejecucin:

for: la LISTA define la separacin de cada elemento por el


valor de la variable IFS (que por defecto vale \t\n).
Ejemplo:

IFS=:
echoDirectoriosenelPATH...
forDIRin$PATH
do
echo$DIR
done

Shell Scripts

Control del flujo de ejecucin:

for. Ejemplos numricos:

forNin12345678910
do
echoNahoravale$N
done
forNin$(seq10)
do
echoNahoravale$N
done

Shell Scripts

Control del flujo de ejecucin:

select: muestra las opciones especificadas en


LISTA y asigna a VARIABLE la opcin escogida.
Sintaxis:

selectVARIABLEinLISTA
do
comandos
done

Shell Scripts

Control del flujo de ejecucin:

select: Ejemplo:

selectOPCIONinDonerKebabPizza
do
case$OPCIONin
DonerKebab)echoMmmm...
break;;
Pizza)echoSlurppp!
break;;
*)echoNosqueseso
esac
done

Shell Scripts

function:

Podemos modularizar los scripts agrupando tareas


en funciones.
Es necesario que una funcin est definida ANTES
de que sea llamada.
Dentro de una funcin, $1, $2, $3, etc. sern los
parmetros pasados a la funcin, no al script en s.

Shell Scripts

function. Ejemplo:
#!/bin/sh
functionsuma
{
echo$(expr$1+$2)
}
suma46
suma3234

Shell Scripts

source, .

Con source o con . podemos incluir el cdigo de


otro script en el nuestro:
#!/bin/sh
sourcefunciones.sh#ahsedefinesuma
suma13
suma1212312

Optimizaciones

$(ls)*

forFin$(ls)==forFin*

catfichero|comandocomando<fichero

catfichero|greppatron

greppatron<fichero

echo$VAR|comandocomando<<<$VAR

echo$PATH|cutd:f1

cutd:f1<<<$PATH

: es como una NOP

: >> es lo mismo que touch. Ej: :>>fichero

while:;doechosiempre;done

Optimizaciones

Listas AND y OR:

AND (&&): comando1&&comando2

ifcomando1
then
comando2
fi

testf/etc/passwd&&echopasswd
encontrado

Optimizaciones

Listas AND y OR:

OR (||): comando1||comando2

ifcomando1
then
:
else
comando2
fi

testf/etc/passwd||echoerror:sinpasswd

Optimizaciones

Bloques:

{ }: agrupar E/S de comandos:

{
echoListado...;ls;
echoFindelistado
}>listado.txt

Tambin se puede hacer con bucles:

forFin*
do
cat$F
done|wclines

Optimizaciones

Bloques:

( ): subshells.

(sleep3&&echofinshell1)&
(sleep5&&echofinshell2)&

Seales:
trap'echocapturadaseal'23
kill2PID
kill3PID

Referencias

BASH Programming - Introduction HOW-TO:


http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
Advanced Bash-Scripting Guide:
http://www.tldp.org/LDP/abs/html/
Gua de Administracin de Redes con Linux:
http://es.tldp.org/Manuales-LuCAS/GARL2/garl2/
UNIX Security:
http://es.tldp.org/Manuales-LuCAS/SEGUNIX/unixsec-2.1-html
Kernel HOWTO:
http://www.tldp.org/HOWTO/Kernel-HOWTO.html

Todas las imgenes son propiedad de


sus respectivos dueos*, el resto del
contenido est licenciado bajo Creative
Commons by-sa 3.0

* Universidad de Deusto

También podría gustarte