Está en la página 1de 28

Programaci on en Shell Bash

Dise no y Administraci on de Sistemas y Redes Miguel Ortu no <miguel.ortuno@urjc.es>

Curso 20082009

Introducci on

Introducci on
comandos, programas de usuario, procesamiento de l neas, etc. #!/bin/bash a="hola mundo" echo $a Un chero de texto con permiso ejecuci on, empieza por #!, es ejecutado por /bin/bash

(cc) 2008 GSyC

Introducci on (cont.)

En la mayoria de los lenguajes modernos Las cadenas se entrecomillan Un identicador de variable es secuencia de letras y digitos Las cadenas se concatenan con algun operador print "hola, soy " + nombre put_line("hola, soy " & nombre); # python --ada

(cc) 2008 GSyC

Introducci on (cont.)

bash es diferente Las variables empiezan por $ cuando son referenciadas No llevan $ en la asignaci on No puede haber espacios antes y despues del igual Los $ se interpretan en el interior de comillas dobles nombre="Juan P erez" echo hola, soy $nombre echo "hola, soy $nombre" No hace falta operador para concatenar cadenas (todo son cadenas) cp $nombre_fichero $nombre_fichero.bak

(cc) 2008 GSyC

Comillas dobles

Comillas dobles
La shell interpreta los $ y considera 1 argumento lo que va entre comillas dobles. En algunos casos resulta equivalente ponerlas u omitirlas Ej: echo saca por stdout todos sus argumentos echo me llamo $nombre el comando echo recibe 3 argumentos echo "me llamo $nombre" el comando echo recibe 1 argumentos

(cc) 2008 GSyC

Comillas dobles (cont.)

En otros, no Ej:El primer argumento de grep es el patr on, el resto, los cheros donde buscarlo grep "la mancha" quijote.txt el comando grep recibe 2 argumentos grep la mancha quijote.txt el comando grep recibe 3 argumentos Busca la cadena la en el chero mancha y en quijote.txt

(cc) 2008 GSyC

paso de par ametros

paso de par ametros


$0 Nombre del script $1 Primer argumento $2 Segundo argumento [...] $* Todos los argumentos (excluido $0) $# No de argumentos (excluido $0) $$ pid del proceso. (Uso t pico: Identificadores unicos) #!/bin/bash echo "primer parametro que recibo: $1, segundo: $2, total $#" echo "la lista completa de parametros es $*"

(cc) 2008 GSyC

paso de par ametros (cont.)

condicional Cada programa devuelve dos cosas diferentes e independientes Texto por stdout y stderr Un valor cierto o falso, seg un considere que ha tenido exito o ha fracasado Este valor lo puede ler el condicional #!/bin/bash if grep hidalgo quijote.txt then echo si else echo no fi

(cc) 2008 GSyC

paso de par ametros (cont.)

#!/bin/bash if ping -c1 then echo si else echo no fi && || !

mazinger && ping -c1 localhost

y l ogico o l ogico negaci on

(cc) 2008 GSyC

paso de par ametros (cont.)

Expresiones bash no sabe comparar, necesita test


if test 2 -eq 2 then echo iguales else echo distintos fi if [ garcia \< fernandez then echo mayor else echo no mayor fi

Atenci on: Debe haber espacios antes y despu es del corchete


(cc) 2008 GSyC

(cont.)

10

test test test test test test test test test test test test test test
(cc) 2008 GSyC

-z cadena # cadena vacia? -n cadena # cadena no vacia? cadena1 = cadena2 cadena1 != cadena2 cadena1 \< cadena2 cadena1 \> cadena2 a -eq b # el entero a es igual a b? a -ne b # no igual? a -lt b # menor que? a -le b # menor o igual? a -gt b # mayor que? a -ge b # mayor o igual? -e fichero # Existe el fichero? -f fichero # Es normal? (Ni dir ni dev)

11

test test test test

-d -r -x -w

fichero fichero fichero fichero

# # # #

es un dir? existe y legible por usuario? existe y ejecutable por usuario? escribible por el usuario?

(cc) 2008 GSyC

(cont.)

12

read read variable Lee una l nea de stdin y la asigna a una variable. Devuelve cierto si hay texto en stdin Devuelve falso cuando llega n de chero en stdin #!/bin/bash echo Dime tu nombre read nombre echo hola $nombre

(cc) 2008 GSyC

(cont.)

13

bucles while #!/bin/bash while true do sleep 1 echo -n "tic" sleep 1 echo " tac" done

(cc) 2008 GSyC

(cont.)

14

#!/bin/bash a=0 while [ $a -lt 10 ] do echo $a a=$(($a+1)) done Tambi en podr a hacerse con seq

(cc) 2008 GSyC

(cont.)

15

#!/bin/bash while read linea do echo $linea done #!/bin/bash cat quijote.txt | while read linea do echo $linea # hacemos cualquier operaci on a $linea done #!/bin/bash while read linea do echo $linea done < quijote.txt

(cc) 2008 GSyC

(cont.)

16

bucles for Muy distinto a otros lenguajes Recorre los par ametros recibidos de l nea de comandos #!/bin/bash for i do echo "recibo el parametro $i" done

(cc) 2008 GSyC

(cont.)

17

Recorre los cheros que encajen en el comod n for i in * do echo $i done for i in *.bak do rm $i done

(cc) 2008 GSyC

(cont.)

18

Recorre las palabras de una cadena lista=perro zapato tomate for i in $lista do echo "el $i" done Atenci on: for itera sobre todas las palabras de una cadena. Para procesar l nea a l nea, debe usarse while read...

(cc) 2008 GSyC

(cont.)

19

Comillas Comilla invertida (comilla grave, comilla de ejecuci on) ... Se ejecuta ... y el resultado reemplaza ... Los retornos de carro se reemplazan por espacios Comilla recta ... ... se toma literalmente Comilla doble ... ... se toma literalmente, tras interpretar $ $() equivale a comilla invertida

(cc) 2008 GSyC

(cont.)

20

Atenci on a la tipograf a: El aspecto de la comilla normal (recta) y de la invertida puede cambiar con el tipo de letra El signicado de ambas es completamente distinto comilla invertida (La que abre comillas, a la dcha. de la p en el teclado) comilla recta (a la dcha. del cero en el teclado)

(cc) 2008 GSyC

(cont.)

21

Ejemplo 1: #!/bin/bash a=ls echo $a echo "$a" echo $a Ejemplo 2: #!/bin/bash ls a=ls a=ls ls #Llama al comando ls, genera un listado #ls a la dcha de =, la vble contiene una l y una s #la vble contiene un listado, sin retornos de carro #Intenta ejecutar los ficheros del listado

#Comilla recta #Comilla doble #Comilla invertida

(cc) 2008 GSyC

(cont.)

22

Funciones #!/bin/bash mi_suma(){ rval=$(($1+$2)) } mi_suma 3 2 echo $rval La funci on debe declararse antes de ser usada Los par ametros se pasan por valor

(cc) 2008 GSyC

(cont.)

23

La forma menos mala de que una funci on bash devuelva un valor es con una variable global Recomendaciones: Usar siempre la misma variable global para todas las funciones del script (p.e. rval) No usar esta variable global para ninguna otra cosa Formas alternativas de devolver un valor Usar return. Pero solo sirve para enteros entre 0 y 255 Usar stdout y capturarlo. Pero entonces no podemos usar stdout para ninguna otra cosa Usar otros cheros

(cc) 2008 GSyC

Ejercicio

24

Ejercicio
Fichero con notas
fgarcia amartin jcano apto no apto no apto

Realizar un script bash que: 1. Reciba como primer argumento el nombre del chero con las notas 2. Cuente no de presentados y no aprobados 3. Envie a cada estudiante correo con su nota, no de presentados, el no de aprobados

(cc) 2008 GSyC

25

#!/bin/bash if test $# -ne 1 then echo Uso: >&2 echo $0 fichero_de_notas>&2 exit fi suspensos=$(cat $1 | grep "no apto" | wc -l) presentados=$(cat $1 | wc -l) aprobados=$(($presentados - $suspensos))

(cc) 2008 GSyC

26

logins=$(cat $1 | cut -d -f1 ) for login in $logins do su_nota=$(grep $login $1) estadisticas="Presentados: $presentados, Aprobados:$aprobado echo $su_nota. $estadisticas |mail $login@pantuflo.es done

(cc) 2008 GSyC

Enlaces

27

Enlaces
Sobre este tema hay much sima documentaci on. Entre la disponible en el web recomendamos Luis Cearra. Sistemas Abiertos Mark Burgess. The Unix Programming Environment

(cc) 2008 GSyC

También podría gustarte