Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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
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
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
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
(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
-d -r -x -w
# # # #
es un dir? existe y legible por usuario? existe y ejecutable por usuario? escribible por el usuario?
(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
(cont.)
13
bucles while #!/bin/bash while true do sleep 1 echo -n "tic" sleep 1 echo " tac" done
(cont.)
14
#!/bin/bash a=0 while [ $a -lt 10 ] do echo $a a=$(($a+1)) done Tambi en podr a hacerse con seq
(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
(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
(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
(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...
(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
(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)
(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
(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
(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
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
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))
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
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