Redes de Area Local Miguel Ortuño <miguel.ortuno@urjc.es> Curso 2007 2008 Introducción 1 Introducción comans, programas de usuario, procesamiento de ĺıneas, etc. a="hola mun" echo $a Un fichero de texto con permiso ejecución, empieza por #!, es ejecuta por /bin/bash
Introducción (cont.) 2 En la mayoria de los lenguajes modernos Las cadenas se entrecomillan Un identificar de variable es secuencia de letras y digitos Las cadenas se concatenan con algun operar print "hola, soy " + nombre put_line("hola, soy " & nombre); # python --ada Introducción (cont.) 3 bash es diferente Las variables empiezan por $ cuan son referenciadas No llevan $ en la asignación No puede haber espacios antes y despues del igual Los $ se interpretan en el interior de comillas bles nombre="juan Pérez" echo hola, soy $nombre echo "hola, soy $nombre"
Introducción (cont.) 4 bash es diferente No hace falta operar para concatenar cadenas (to son cadenas) cp $nombre_fichero $nombre_fichero.bak Para evitar algunas ambigüedades, puede ser necesario poner el nombre de la variable entre llaves singular=perro plural=${singular}s echo $singular, $plural Comillas bles 5 Comillas bles La shell interpreta los $ y considera 1 argumento lo que va entre comillas bles. En algunos casos resulta equivalente ponerlas u omitirlas Ej: echo saca por stut tos sus argumentos echo me llamo $nombre el coman echo recibe 3 argumentos echo "me llamo $nombre" el coman echo recibe 1 argumentos
Comillas bles (cont.) 6 En otros, no Ej:El primer argumento de grep es el patrón, el resto, los ficheros nde buscarlo grep "la mancha" quijote.txt el coman grep recibe 2 argumentos grep la mancha quijote.txt el coman grep recibe 3 argumentos Busca la cadena la en el fichero mancha y en quijote.txt Comillas bles (cont.) 7 fichero="mi fichero" touch $fichero #crea o cambia la fecha a s ficheros: mi y fichero fichero= mi fichero touch "$fichero" #crea o cambia la fecha el fichero mi fichero
paso de parámetros 8 paso de parámetros $0 Nombre del script $1 Primer argumento $2 Segun argumento [...] $* Tos los argumentos (exclui $0) $# N o de argumentos (exclui $0) $$ pid del proceso. (Uso típico: Identificares únicos) echo "primer parametro que recibo: $1, segun: $2, total $#" echo "la lista completa de parametros es $*" paso de parámetros (cont.) 9 condicional Cada programa devuelve s cosas diferentes e independientes Texto por stut y stderr El exit status: Un valor cierto o falso, según considere que ha teni éxito o ha fracasa. Este valor lo puede ler el condicional if grep hidalgo quijote.txt then echo si else echo no fi
paso de parámetros (cont.) 10 if ping -c1 mazinger && ping -c1 localhost then echo si else echo no fi && y lógico o lógico! negación paso de parámetros (cont.) 11 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ón: Debe haber espacios antes y después del corchete
(cont.) 12 test -z cadena # cadena vacia? test -n cadena # cadena no vacia? test cadena1 = cadena2 test cadena1!= cadena2 test cadena1 \< cadena2 test cadena1 \> cadena2 test a -eq b # el entero a es igual a b? test a -ne b # no igual? test a -lt b # menor que? test a -le b # menor o igual? test a -gt b # mayor que? test a -ge b # mayor o igual? test -e fichero # Existe el fichero? test -f fichero # Es normal? (Ni dir ni dev) 13 test -d fichero test -r fichero test -x fichero test -w fichero # es un dir? # existe y legible por usuario? # existe y ejecutable por usuario? # escribible por el usuario? if test -z $mi_variable then echo "cadena nula" >&2 #mensaje a stderr else echo "cadena no nula" fi
(cont.) 14 bash no sabe operar expr 5 \* 3 echo "2 * 2" bc echo $((2+2)) (cont.) 15 read read variable Lee una ĺınea de stdin y la asigna a una variable. Devuelve cierto si hay texto en stdin Devuelve falso cuan llega fin de fichero en stdin echo Dime tu nombre read nombre echo hola $nombre
(cont.) 16 bucles while while true sleep 1 echo -n "tic" sleep 1 echo " tac" ne (cont.) 17 a=0 while [ $a -lt 10 ] echo $a a=$(($a+1)) ne
(cont.) 18 while read linea echo $linea ne while read linea echo $linea ne < quijote.txt (cont.) 19 Cuida con los bucles despues de un pipe. Es preferible evitarlos: el bucle se ejecuta en una segunda shell, con su propio espacio de nombres mi_variable=0 echo hola while read auxiliar #DESACONSEJADO echo $auxiliar mi_variable=1 ne echo "mi_variable vale $mi_variable" El resulta es: mi_variable vale 0
(cont.) 20 seq Los bucles que en la mayoría de los lenguajes se harían con for, en bash pueden hacerse con seq seq 0 9 seq 9-1 0 #bucle de 0 a 9, ambos incluis #bucle de 9 a 0, ambos incluis (cont.) 21 bucles for Muy distinto a otros lenguajes Recorre los parámetros recibis de ĺınea de comans for i echo "recibo el parametro $i" ne
(cont.) 22 Recorre las palabras de una cadena for i in "perro zapato tomate" echo "el $i" ne Atención: for itera sobre todas las palabras de una cadena. Para procesar ĺınea a ĺınea, debe usarse while read... (cont.) 23 Es típico usar metacaracteres. Entonces la shell los expande, con los nombres de los ficheros en el directorio actual que encajen en el patrón for i in * echo $i ne for i in *.bak rm $i ne
(cont.) 24 source Equivale a coman punto. Importa código dentro del script actual. Las variables usadas en el script importa serán por tanto variables del script actual. Tras ejecutarse el script importa, el script actual continúa.. ~/.bashrc # Ejecuta el código de.bashrc # en el entorno actual source ~/.bashrc # Forma equivalente (cont.) 25 exec Invoca a otro programa. El proceso actual desaparece, es reemplaza por el otro exec mi_script echo Esta linea nunca se muestra, no se vuelve de un exec
(cont.) 26 exit Concluye el script actual Se le puede pasar como argumento un valor entre 0 y 255: el exit status 0: Cierto. To ha i bien 1-255: Falso. Algún error Algunos valores están reservas, por convenio (exit codes with special meanings) El programar puede usar libremente los valores 3-125, 166-254 exit true exit 14 (cont.) 27 Comillas Comilla invertida (comilla grave, comilla de ejecución)... Se ejecuta... y el resulta reemplaza... Los retornos de carro se reemplazan por espacios Comilla recta...... se toma literalmente Comilla ble...... se toma literalmente, tras interpretar $ $() equivale a comilla invertida
(cont.) 28 Atención a la tipografía: El aspecto de la comilla normal (recta) y de la invertida puede cambiar con el tipo de letra El significa de ambas es completamente distinto comilla invertida (La que abre comillas, a la dcha. de la p en el tecla) comilla recta (a la dcha. del cero en el tecla) (cont.) 29 Ejemplo 1: a=ls echo $a echo "$a" echo $a #Comilla recta #Comilla ble #Comilla invertida Ejemplo 2: ls a=ls a= ls ls #Llama al coman ls, genera un lista #ls a la dcha de =, la vble contiene una l y una s #la vble contiene un lista, sin retornos de carro #Intenta ejecutar el primer fichero del lista, #pasanle el resto como argumento
(cont.) 30 Funciones mi_suma(){ rval=$(($1+$2)) } mi_suma 3 2 echo $rval La función debe declararse antes de ser usada Los parámetros se pasan por valor (cont.) 31 La forma menos mala de que una función 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 stut y capturarlo. Pero entonces dentro de la función no podemos usar stut para ninguna otra cosa Usar otros ficheros
(cont.) 32 Depuración La opción -x muestra una traza de cada orden y de su resulta Traza de to el script -x echo hola mun Resulta de la ejecución: + echo hola mun hola mun Forma alternativa: bash -x holamun.sh (cont.) 33 Traza de parte del script: set -x #activamos la depuración echo codigo que falla set +x #desactivamos la depuración echo codigo que funciona
Ejercicio 34 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 fichero con las notas 2. Cuente n o de presentas y n o aprobas 3. Envie a cada estudiante correo con su nota, n o de presentas, el n o de aprobas 35 if test $# -ne 1 then echo Uso: >&2 echo $0 fichero_de_notas>&2 exit fi suspensos=$(cat $1 grep "no apto" wc -l) presentas=$(cat $1 wc -l) aprobas=$(($presentas - $suspensos))
36 logins=$(cat $1 cut -d -f1 ) for login in $logins su_nota=$(grep $login $1) estadisticas="presentas: $presentas, Aprobas:$aprobas" echo $su_nota. $estadisticas mail $login@pantuflo.es ne Enlaces 37 Enlaces Sobre este tema hay muchísima cumentación. Entre la disponible en el web recomendamos Luis Cearra. Sistemas Abiertos Mark Burgess. The Unix Programming Environment