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 iltrado. B!s"uedas # e$presiones regulares. %tros comandos. &cripting. %ptimi'aciones.

7ntrprete de comandos

&hells

E$isten muchas shells: sh( csh( )sh( bash( etc. Entorno de traba*o:

Case sensitive: sensible a ma#!sculas +EC,% -. echo/. &int$is: comando arg0 arg1... argn &i un programa no est en el 23T,: .4programa 2rompt:

5: usuario normal 6: usuario administrador4a +root/

Comandos bsicos

ls: listar. man: manual. p8d: directorio actual. cd: cambia de directorio. echo: escribe te$to. cat: muestra ichero. more: paginador. ile: muestra tipo de ichero.

touch: crea ichero. rm: borra ichero. m)dir: crea directorio. rmdir: borra directorio. cp: copia icheros. mv: mueve icheros. ln: crea enlaces. date: muestra la echa.

Tuberas

9n proceso en un sistema 9:7;<li)e tiene inicialmente abiertos = >desag?es@:


A: &TB7: o entrada estndar 0: &TB%9T o salida estndar 1: &TBECC o salida de error 7maginmonos una re inera:

Detes crudo por A +&TB7:/( consigues gasolina por 0 +&TB%9T/ # bastantes residuos por el >desag?e@ 1 +&TBECC/.

Tuberas

Cedirigiendo la salida de un comando:

E : redirigir &TB%9T a un ichero

ls > listado.txt ls >> listados.txt ls 2> errores.txt ls 2>> errores.txt

EE : redirigir &TB%9T al inal de un ichero +aFadir/

1E : redirigir &TBECC a un ichero

1EE : redirigir &TBECC al inal de un ichero

Tuberas

Cedirigiendo la entrada de un comando:

G : redirigir el contenido de un ichero a &TB7:

tr a A < fichero.txt

Tuberas:

H : es posible recoger la salida de un desag?e # conducirlo a la entrada de otro comando.

cat fichero.txt | tr a A

Comandos de iltrado

sort: ordena lneas de icheros de te$to. tr: reempla'a un carcter por otro. head: muestra las : primeras lneas de un ichero. tail: muestra las : !ltimas lneas de un ichero. 8c: cuenta lneas( palabras o caracteres. cut: permite >cortar@ columnas de un ichero en unciIn de un carcter.

B!s"uedas # rege$ps

Comandos de b!s"ueda:

ind: busca icheros. grep: busca patrones en icheros. sed: modi ica patrones. a8): busca # modi ica campos en icheros.

Todos usan patrones( e$presiones regulares.

B!s"uedas # rege$ps

grep: busca una cadena o patrIn en icheros # muestra las lneas "ue la contienen.
grep [opciones] patron [fich1 fich2...]

Metacaracteres vlidos:

. (un carcter cualquiera) * (cero o ms ocurrencias del carcter anterior) ^ (principio de lnea) $ (fin de lnea) [a-f] (cualquier carcter del rango) \< \> (principio y fin de palabra)

B!s"uedas # rege$ps

%pciones tpicas:

<c escribe sIlo el n!mero de ocurrencias encontradas. <i ignora ma#!sculas # min!sculas. <l escribe sIlo los nombres de ichero donde ha encontrado el patrIn. <s opera en silencio( sIlo saca mensa*es de error. <v escribe lneas "ue :% contienen el patrIn <8 trata el patrIn como una palabra entera.

9so tpico: iltrar la salida de un comando $ comando | grep ....

B!s"uedas # rege$ps

2atrones

. (un carcter cualquiera) * (cero o ms ocurrencias del carcter anterior) ^ (principio de lnea) $ (fin de lnea) [a-f] (cualquier carcter del rango) [-AD] (caracteres '-', 'A', 'D') [^56] (todos los caracteres excepto '5' y '6') [5^6] (caracteres '5', '^', '6') [[:alnum:]] (todos los caracteres alfanumricos)

B!s"uedas # rege$ps

Quoted Braces +llaves/

&e utili'an para buscar un n!mero determinado de repeticiones de la e$presiIn:

expresion_regular \{min, max\}

grep '[345]\{2,4\}' fichero grep 'r\{2\}' fichero (busca dos 'r' seguidas) grep 'er\{2,\}' fichero

expresion_regular \{exact\}

expresion_regular \{min,\}

(busca lineas con al menos dos caracteres 'r' precedidos por una 'e').

B!s"uedas # rege$ps

Quoted 2arentheses +parntesis/

3lmacena los caracteres "ue concuerdan con la e$presion regular en un registro. &e pueden utili'ar hasta J registros en una e$presiIn regular 2ara re erenciar los registros utili'amos K0 a KJ

E*emplo: listamos lneas con dos caracteres idnticos seguidos: grep LK+.K/K0L ichero

B!s"uedas # rege$ps

Qu es a8)?

38) es un lengua*e de programaciIn utili'ado para manipular te$to. Mos datos se manipulan como palabras +campos/ dentro de una lnea +registro/. 9n comando a8) consiste en un patrn # una accin "ue comprende una o ms sentencias.

awk 'patron { accion }' fichero ...

B!s"uedas # rege$ps

Qu es a8)?

a8) comprueba cada registro de los icheros indicados en busca de coincidencias con el patrInN si se encuentra alguna se reali'a la acciIn especi icada. a8) puede actuar como iltro tras un pipe o obtener los datos de la entrada estndar si no se especi ica ning!n ichero.

B!s"uedas # rege$ps

E$presiones regulares

Mas e$presiones regulares "uedan delimitadas con el carcter L4L +e*: 4$4/ 3dems de todas las comentadas hasta ahora( a8) puede utili'ar:

4$O4 9na o ms ocurrencias de $ 4$?4 9na o ninguna ocurrencia de $ 4$H#4 Tanto $ como # +string/ 3grupa una cadena para usar con O o ?

B!s"uedas # rege$ps

&entencia print

Es de las ms utili'adas

awk 'patron { print }' f_ent > f_sal

este ejemplo sera lo mismo que:

$ grep patron f_ent > f_sal

Referenciando campos:

$0: Registro completo $1: Primer campo del registro $2: Segundo campo del registro ...

B!s"uedas # rege$ps

Ds uncionalidades:

Dultiples sentencias en una acciIn

9sando >N@ o salto de lnea:

Comentarios con >6@ Comparaciones de e$presiones regulares o strings


..( -.( G( G.( E( E.( P( -P( HH( QQ 50 P 4$4

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

B!s"uedas # rege$ps

Ds uncionalidades:

Rariables de usuario %peraciones aritmticas Estructuras de control


i S else i S else 8hile or

B!s"uedas # rege$ps

ind: herramienta mu# potente para reali'ar b!s"uedas de icheros. &inta$is:

find [path] opciones -name nombre -type (d|f|l|s|...) -maxdepth n -mindepth n -mtime n -exec comando \; ({} indica el fichero)

Opciones tpicas:

9suarios # grupos

useradd: aFade un usuario en el sistema. userdel: elimina un usuario del sistema. usermod: modi ica las propiedades de un usuario. groupadd: aFade un grupo de usuarios en el sistema. groupdel: elimina un grupo del sistema. groupmod: modi ica las propiedades de un grupo. pass8d: modi ica la contraseFa de un usuario. gpass8d: aFade un usuario a un grupo.

2ropietarios # permisos

chmod: modi ica el modo de acceso de un ichero. cho8n: modi ica el propietario de un ichero. chgrp: modi ica el grupo propietario de un ichero. 8ho: muestra usuarios conectados al sistema. 8hoami: muestra el nombre de usuario del usuario actual. id: muestra las propiedades del usuario # grupo actuales. su: cambio de usuario actual.

TestiIn de procesos

top: muestra in ormaciIn de procesador( procesos # memoria. ps: muestra la lista de procesos "ue se estn e*ecutando. pstree: ps en orma de rbol. pgrep: ps O grep. pido : muestra el 27B del proceso "ue solicitemos. )ill: enva una seFal a un proceso +27B/. )illall: enva una seFal a un proceso +nombre/.

TestiIn de procesos

Q: al lan'ar un proceso lo lan'a en segundo plano. bg: manda un proceso a e*ecutarse en segundo plano. g: lleva un proceso a e*ecutarse en primer plano. ctrlO': interrumpe un proceso # lo suspende. ctrlOc: interrumpe un proceso # lo para +seFal U7MM/. *obs: muestra las tareas de la sesiIn actual en segundo plano. nohup: hace "ue un proceso cuelgue de init # redirige su salida a nohup.out. diso8n: hace un nohup de un proceso #a en e*ecuciIn.

Comandos de bac)up

g'ip: compresor estndar b'ip1: compresor ms pontente pero ms lento tar: empa"uetador de icheros +mu# !til/ 'cat: cat sobre archivos comprimidos 'more: more sobre archivos comprimidos 'grep: grep sobre archivos comprimidos

zgrep cadena file.gz gzip -c file.gz | grep cadena

&hell &cripts

&cript . TuiIn. Tareas repetitivas se pueden agrupar en un guiIn # e*ecutarse automticamente +Batch 2rocessing/.

Es sencillo e*ecutar V comandos para crear un bu'In de correo. :o lo es tanto para crear 1A.AAA bu'ones. Es sencillo hacer un bucle "ue se repita 1A.AAA veces N</

&hell &cripts

:uestro primer shell script:


9samos un editor # creamos el ichero hola.sh Contenido de hola.sh:

#!/bin/sh echo hola

Con 6- en la primera lnea indicamos "uin debera interpretar el resto de comandos +4bin4sh/. 2osteriormente escribimos los comandos separados por saltos de lnea.

&hell &cripts

Rariables:

9na variable tiene un nombre # un valor( # sirve para dotar de dinamismo a nuestros scripts:

FECHA=15/07/2004 echo Hoy es $FECHA


WEC,3 es el nombre de la variable. 5WEC,3 es su valor.

2ara asignar un valor( se utili'a >.@. XXX&7: E&23C7%&---

&hell &cripts

Rariables de entorno:

3l arrancar una shell( #a ha# muchas variables de inidas( son las variables de entorno.

2odemos ver su valor con el comando >env@. &i se de ine una variable en una shell( sIlo tiene valor en esa shell( a no ser "ue se e$porte a los programas >hi*o@. export USUARIO=joaquin &i desde esa shell lan'amos un script u otro programa( la variable 9&93C7% contendr >*oa"uin@.

Ymbito de una variable:


&hell &cripts

Rariables: interactividad

Es posible leer del usuario el valor de una variable( dotando a nuestros scripts de interactividad. cat hola.sh

#!/bin/sh echo Dime tu nombre: read NOMBRE echo Hola $NOMBRE, encantado de conocerte

&hell &cripts

Rariables: argumentos

Es posible pasar los parmetros o argumentos "ue "ueramos # utili'arlos dentro del script.

cat nombre.sh

#!/bin/sh echo Nombre: $1 echo Primer Apellido: $2 echo Segundo Apellido: $3


./nombre.sh Juan Lpez Martnez ./nombre.sh Maria Dolores Pradera Snchez

&hell &cripts

Rariables: argumentos

50( 51( 5=... 5Z0A[( 5Z00[: argumentos 5A es el propio script.


basename 5A: nombre del script. dirname 5A: ruta al nombre del script. 50 ahora vale lo "ue vala 51( 51 lo "ue vala 5=( etc. 5A no cambia.

shi t: rota los argumentos hacia la i'"uierda


&hell &cripts

Rariables: argumentos especiales


56: n!mero de argumentos "ue nos han pasado. 5\: todos los argumentos. >5\@ . >50 51 5=...@ 5]: todos los argumentos. >5]@ . >50@ >51@ >5=@... 5^: comando anteriormente e*ecutado. 55: 27B del propio proceso shell.

&hell &cripts

Rariables: sustituciIn de comandos

Es posible almacenar en una variable el resultado de la e*ecuciIn de un comando. Bos sinta$is:

3centos graves: compatibilidad

LISTADO=`ls` LISTADO=$(ls) LISTADO=$(ls $(cat directorios.txt))

Con 5+/: anidable


&hell &cripts

e$pr: 2ermite reali'ar operaciones aritmticas.

&inta$is: expr ARG1 OP ARG2

$ SUMA=`expr 7 + 5` $ echo $SUMA 12

(ojo espacios!)

$ expr 7 \> 5 (ojo escapar operadores!) $ expr \( 7 + 5 \) \* 2

Ejercicio: Obtener el mes anterior al actual con una sola sentencia expr ;-)

&hell &cripts

Control del lu*o de e*ecuciIn:

Condiciones: test I _ `

test >5:%DBCE@ .. >auan@ test 5B7:EC% <e" 0AAA <le/ test < 4etc4pass8d Dodi ican el valor de 5?

+..( -.( E( G( E.( G./ +<e"( <ne( <gt( <lt( <ge( +< ( <d( <M( <r( <8( <$/

cero . verdadero no cero . also

+XX3M CERb& Q9E E: C--/

&hell &cripts

Control del lu*o de e*ecuciIn:

i : alternativa simple. &inta$is:

if comando_if then comandos_then elif comando_elif then comandos_elif else comandos_else fi

&hell &cripts

Control del lu*o de e*ecuciIn:

i . E*emplo:

if test $NOMBRE == Juan then echo Hola Juanin, qu tal? elif test $NOMBRE == Pedro then echo Pedreteee, cunto tiempo! else echo No te conozco fi

&hell &cripts

Control del lu*o de e*ecuciIn:

case: cImodo para evitar alternativas anidadas. &inta$is:

case $VARIABLE in VALOR1) comandos_valor1 ;; VALOR2) comandos_valor2 ;; *) comandos_default; esac

&hell &cripts

Control del lu*o de e*ecuciIn:

case. E*emplo:

case $NOMBRE in Juan) echo Hola Juanin, qu tal? ;; Pedro) echo Pedro, cunto tiempo! ;; *) echo no te conozco; esac

&hell &cripts

Control del lu*o de e*ecuciIn:

8hile. E*ecuciIn de A a : veces. &inta$is:

while comando do comandos done

&hell &cripts

Control del lu*o de e*ecuciIn:

8hile. E*emplo:

N=1 while [ $N -lt 100 ] do echo Repito, ya voy $N veces N=$(expr $N + 1) sleep 1 # Esperamos 1 segundo done

&hell &cripts

Control del lu*o de e*ecuciIn:

until. E*ecuciIn de A a : veces. 7dntico a 8hile con la condiciIn negada. &inta$is:

until comando do comandos done

&hell &cripts

Control del lu*o de e*ecuciIn:

until. E*ecuciIn de A a : veces. 7dntico a 8hile con la condiciIn negada. &inta$is:

N=1 until [ $N -ge 100 ] do echo Repito, ya voy $N veces N=$(expr $N + 1) done

&hell &cripts

Control del lu*o de e*ecuciIn:

or: e*ecuciIn repetitiva asignando a una variable de control valores de una lista. &inta$is:

for VARIABLE in LISTA do comandos done

&hell &cripts

Control del lu*o de e*ecuciIn:

or. E*emplo: for N in Sopa Arroz Pan de ajo do echo Hoy comemos $N done

&hell &cripts

Control del lu*o de e*ecuciIn:

or: la M7&T3 de ine la separaciIn de cada elemento por el valor de la variable 7W& +"ue por de ecto vale \t\n/. E*emplo:

IFS=: echo Directorios en el PATH... for DIR in $PATH do echo $DIR done

&hell &cripts

Control del lu*o de e*ecuciIn:

or. E*emplos numricos:

for N in 1 2 3 4 5 6 7 8 9 10 do echo N ahora vale $N done for N in $(seq 10) do echo N ahora vale $N done

&hell &cripts

Control del lu*o de e*ecuciIn:

select: muestra las opciones especi icadas en M7&T3 # asigna a R3C73BME la opciIn escogida. &inta$is:

select VARIABLE in LISTA do comandos done

&hell &cripts

Control del lu*o de e*ecuciIn:

select: E*emplo:

select OPCION in Doner Kebab Pizza do case $OPCION in Doner Kebab) echo Mmmm... break;; Pizza) echo Slurppp! break;; *) echo No s qu es eso esac done

&hell &cripts

unction:

2odemos modulari'ar los scripts agrupando tareas en unciones. Es necesario "ue una unciIn est de inida 3:TE& de "ue sea llamada. Bentro de una unciIn( 50( 51( 5=( etc. sern los parmetros pasados a la unciIn( no al script en s.

&hell &cripts

unction. E*emplo: #!/bin/sh function suma { echo $(expr $1 + $2) } suma 4 6 suma 3 234

&hell &cripts

source( .

Con source o con >.@ podemos incluir el cIdigo de otro script en el nuestro:
#!/bin/sh source funciones.sh # ah se define suma suma 1 3 suma 12 12312

%ptimi'aciones

$(ls) *

for F in $(ls) == for F in * cat fichero | grep patron grep patron < fichero echo $PATH | cut -d: -f1 cut -d: -f1 <<<$PATH : EE es lo mismo "ue touch. E*: :>> fichero while : ; do echo siempre; done

cat fichero | comando comando < fichero


echo $VAR | comando comando <<< $VAR


: es como una :%2


%ptimi'aciones

Mistas 3:B # %C:

3:B +QQ/: comando1 && comando2

if comando1 then comando2 fi

test -f /etc/passwd && echo passwd encontrado

%ptimi'aciones

Mistas 3:B # %C:

%C +HH/: comando1 || comando2

if comando1 then : else comando2 fi

test -f /etc/passwd || echo error: sin passwd

%ptimi'aciones

Blo"ues:

Z [: agrupar E4& de comandos:

{ echo Listado...; ls; echo Fin de listado } > listado.txt

Tambin se puede hacer con bucles:

for F in * do cat $F done | wc --lines

%ptimi'aciones

Blo"ues:

+ /: subshells.

(sleep 3 && echo fin shell1) & (sleep 5 && echo fin shell2) &

&eFales: trap 'echo capturada seal' 2 3 kill -2 PID kill -3 PID

Ce erencias

B3&, 2rogramming < 7ntroduction ,%c<T%: http:44888.tldp.org4,%cT%4Bash<2rog<7ntro<,%cT%.html 3dvanced Bash<&cripting Tuide: http:44888.tldp.org4MB24abs4html4 Tua de 3dministraciIn de Cedes con Minu$: http:44es.tldp.org4Danuales<MuC3&4T3CM14garl14 9:7; &ecurit#: http:44es.tldp.org4Danuales<MuC3&4&ET9:7;4uni$sec<1.0<html Uernel ,%cT%: http:44888.tldp.org4,%cT%4Uernel<,%cT%.html

Todas las imgenes son propiedad de sus respectivos dueos*( el resto del contenido est licenciado ba*o Creative Commons by-sa 3.0

* Universidad de Deusto

También podría gustarte