Sunteți pe pagina 1din 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. man: manual. pwd: directorio actual. cd: cambia de directorio. echo: escribe texto. cat: muestra fichero. more: paginador. file: muestra tipo de fichero.

touch: crea fichero. rm: borra fichero. mkdir: crea directorio. rmdir: borra directorio. cp: copia ficheros. mv: mueve ficheros. ln: crea enlaces. 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

ls>listado.txt ls>>listados.txt ls2>errores.txt ls2>>errores.txt

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

2> : redirigir STDERR a un fichero

2>> : redirigir STDERR al final de un fichero

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\}

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

expresion_regular\{exact\}

expresion_regular\{min,\}

(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 namenombre type(d|f|l|s|...) maxdepthn mindepthn mtimen execcomando\;({}indicaelfichero)

Opcionestpicas:

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. 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.

mbito de una variable:


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. $1 ahora vale lo que vala $2, $2 lo que vala $3, etc. $0 no cambia.

shift: rota los argumentos hacia la izquierda


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` LISTADO=$(ls) LISTADO=$(ls$(catdirectorios.txt))

Con $(): anidable


Shell Scripts

expr: Permite realizar operaciones aritmticas.

Sintaxis: exprARG1OPARG2

$SUMA=`expr7+5` $echo$SUMA 12

(ojoespacios!)

$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 $?

(==, !=, >, <, >=, <=) (-eq, -ne, -gt, -lt, -ge, (-f, -d, -L, -r, -w, -x)

cero = verdadero no cero = falso

(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|greppatron greppatron<fichero echo$PATH|cutd:f1 cutd:f1<<<$PATH : >> es lo mismo que touch. Ej: :>>fichero while:;doechosiempre;done

catfichero|comandocomando<fichero

echo$VAR|comandocomando<<<$VAR

: es como una NOP


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

S-ar putea să vă placă și