Beruflich Dokumente
Kultur Dokumente
DE MONTERREY
LABORATORIO DE SISTEMAS OPERATIVOS
Prctica 2
Programacin shell
Autor: Dr. Juan A. Nolazco Flores
Co-autores: M.C Jorge Villaseor, M.C Roberto Aceves, Ing. Raul Fuentes
Indice
Objetivo
Comandos
Grep
Ejercicio:
Chmod y control de archivos
Shell scripting
Variables
Ejercicio:
Programacin Shell
Tipo de Shell
Procesamiento de comandos
Ejercicio
Comillas del Shell
Ejercicio:
Meta caracteres:
Ejercicio:
Aritmtica del Shell:
Ejercicio:
Comandos para Control de Flujo
Comando de Repeticin
ltimas observaciones
Laboratorio:
Investigacin
Texto
Cdigos ejemplo
Despliegue de correos oficiales a partir de matrculas
Objetivo
Durante la prctica pasada el alumno aprendi a usar los comandos de forma individual y a leer sus
argumentos; solo una pregunta requera el uso del smbolo de pipeline para unir la salida de un
comando a la entrada de otro comando. En esta ocasin el alumno utilizar lo aprendido para crear los
denominamos Shell scripts que permiten la automatizacin de cualquier tipo de tareas, incluyendo
entre otros el ejecutar un comando dependiendo del xito o fracaso del anterior, realizar complejas
operaciones con archivos de entrada cuyos nombres aparecen en la lnea de comandos del nuevo Shell
script etc.
Comandos
A continuacin se muestra un breve resumen de los comandos que se utilizaron durante la prctica
pasada:
ls: Lista archivos y directorios
mkdir: Crea un directorio.
rmdir: Borra un directorio. Nota: el directorio debe de estar vaco.
cd: Cambia el directorio actual a otro.
less: Permite visualizar un documento de texto.
cat: Lee, concatena y despliega archivos de texto en stdout.
head: Despliega en stdout las primeras lneas de un archivo de texto.
tail: Despliega en stdout las ltimas lneas de un archivo de texto.
rm: Remueve archivos.
pwd: Imprime la direccin del directorio actual.
touch: Cambia el timestamp de un archivo (o lo crea).
more: Despliega las lneas de un archivo de texto.
ln: Crea enlaces entre archivos.
grep Imprime lineas que coincidan con un patrn.
chmod Cambia las propiedades de lectura, escritura y ejecuccin de un archivo.
La mayora de ellos se utuilizan para navegar por los directorios y manipular archivos o bien desplegar
sus contenidos pero existen otro par de comandos muy importantes y muy utilizados para navegacin y
resumen de resultados los cuales son GREP y AWK. El primero es muy bsico y por lo mismo se
utilizar a partir de esta prctica mientras que el segundo es ms poderoso y tendr su propia prctica
de laboratorio
Grep
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
Esta utilera de Unix es una de las mas populares. Su modo de uso ms bsico es cuando recibe como
parmetros una expresin regular y el nombre de un archivo. El comando lee la informacin del
archivo e imprime las lneas que contengan coincidencias con la expresin regular.
En su forma mas bsica, GREP nos permite buscar patrones, mediante expresiones regualares, dentro
de un archivo pero por lo general GREP es una herramienta utilizada cuando uno o ms comandos
desplegaran mucha informacin que no necesariamente nos interesa; por ejemplo. cuando slo
buscamos lneas del archivo que mencionen ciertos usuarios o programas.
NOTA: Es muy posible que el alumno an no tenga prctica con las Expresiones regulares
pero no debe de preocuparse; el uso de stas durante el laboratorio estara limitado a las mas
sencillas. Como quiera, puede utilizar esta liga de Wikipedia para leer mas acerca de ellas:
http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
Ejercicio:
La sintaxis clsica uilizando la entrada estandar es: grep <archivo> <expresin regular> y en este
caso sera:
Recordar que el primer comando ( cat <archivo1> <archivo 2> ) se encarga de desplegar (ms
propiamente, enviar a standard output) el resultado de la concatenacin de dos archivos; o el
contenido de un archivo si solo se menciona uno solo en el comando. Esto se puede cambiar por
cualquier otra sere de comandos. En este caso particular utilizar los comandos more o cat daran el
mismo resultado .
Un ejemplo de resumen de datos puede ser por ejemplo buscar todo lo que empiece con "nav" en dicho
archivo y trabajar con ellos.
En este caso lo que se hace es el conteo de palabras que contienen "nav". Son trece.
Chmod y control de archivos
Un elemento bsico de los archivos en Sistemas basados en UNIX son sus propiedades para decidir
que se puede hacer con ellos y quienes lo pueden hacer. Lo primero prcticamente se divide en 3
elementos:
En otras palabras el usuario dueo del archivo tiene sus derechos sobre el archivo (usualmente todos),
los miembros del grupo al que pertenece el usuario pueden tener algunos derechos (usualmente
lectura ) y todos los dems usuarios podran no tener ningun derecho. Por ejemplo, todo los archivos
claves del usuario Root en el folder /etc/ permiten su lectura para los demas usuarios pero no su
modificacin por los dems usuarios; es por eso que cuando en el ejercicio anterior buscamos Navajo,
pudimos realizarlo.
Una forma sencilla de verificar estos permisos es utilizando el comando ls -l , como se muestra en el
siguiente ejemplo:
usuario@Localhost:~$ ls -l /etc/shells
-rw-r--r-- 1 root root 73 Apr 25 2012 /etc/shells
Este despliega los datos del archivo /etc/shells e inicia mostrandos primeramente las propiedades del
archivo; el primer guin muestra propiedades especiales del archivo, por ejemplo si se trata de un
folder (en cuyo caso desplegara d), una liga (l) o casos mas especiales que veremos en una futura
prctica. Inmediatamente vienen los controles de UGO, justamente en ese orden y despus aparece
root root que se debe leer como usuario: Root y Grupo: Root (en ese orden. Viendo sus propiedades
vemos que todos los usuarios lo pueden leer, pero solo el usuario Root lo puede modificar pero por
default no le es posible ejecutarlo.
Tip: Cuando hablamos de usuario y su grupo en ocasiones lo escribimos de esta forma:
user:grupo, en este ejemplo sera: root:root, esto se puede hacer incluso ms completo si viene
acompaado de @<maquina-local> , en este caso si tuvisemos root:root@ServFTP
hablaramos del usuario y de su grupo en una mquina especfica
Para poder modificar estos valores el primer requisito es que sea el usuario dueo quien lo haga (o en
su defecto el usuario Root) y mediante el comando chmod cuya sintaxis es:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
Los modos tpicos son los primeros dos: mediante letras u octal (base ocho) El octal se refiere a poner
explcitamente los bits de RWX para el conjunto de archivos. Por ejemplo 777 octal (que en binario se
vera como 111111111) le dara todos los permisos a todos los usuarios , 700 solo dara todo los
permisos al usuario que cre el archivo y 744 permitira que los dems usuarios puedan leer el archivo.
El otro modo es un poco ms amigable y permite solo modificar una propiedad, por ejemplo u+r
indica que al usuario se le de el permiso de lectura mientras que u-r elimina ese permiso y en ningn
caso se alteraron los dems. Ejemplos validos:
usuario@localhost:~$ chmod u+r Archivo1
usuario@localhost:~$ chmod u-r,o+r Archivo1
usuario@localhost:~$ chmod 600 Archivo1
Shell scripting
Cuando estamos utilizando un Shell tenemos mucho ms poder de lo que uno supondra al principio,
ya que a diferencia de otras interfaces de lneas de comandos el shell tiene la capacidad de utilizar
variables y estatutos de control de flujo para la toma de decisiones y ejecucin de comandos del
sistema y/o aplicaciones.
En la prctica anterior ejecutaron todos los pasos de forma manual y tomaban decisiones sencillas
poniendo todo de forma de constantes, pero que pasara si tuviesen que repetir el proceso de crear
directorios en 4,10 200 mquinas? Sera tedioso hacerlo manualmente; en su lugar lo podran ejecutar
de forma automatizada desde una sola mquina ( por medio de sesiones remotas). O si en un servidor
al arrancar un servicio primero deban de correr toda una serie de pruebas y respecto a sus resultados
decidir que hacer para tener funcionando al servidor, eso tambien lo pueden automatizar. Esto y ms se
puede automatizar porque shell scripting permite la automatizacin de tareas administrativas.
Para la introduccin a este mecanismo iniciaremos primero hablando de las variables que existen en los
shells, luego veremos los tipos de shell (ya que la sintaxis depende mucho de ello) y por ultimo
manejaremos los controles de flujo del shell BASH, en cada caso manejaremos sencillos ejemplos (y en
el apendice hay un ejemplo completo de formato de texto).
Variables
Cuando se esta utilizando un shell como Bash o Sh se tienen adems de los comandos variables y
las hay de dos tipos, las definidas por el usuarios y las de sistema. Las variables de sistema son
variables predefinidas, por ejemplo HOME, USERNAME, SHELL, PWD. Las variables de usuario se
crean en el momento en el que el usuario las use por primera vez. Estas variables existirn en la sesin
Shell que se estn utilizando en ese momento y dejarn de existir cuando el usuario termine su sesin.
Sin importar el origen de estas variables son de un tipo universal, es decir puedne contener numeros,
letras o cualquier otro formato por lo tanto el usuario debe de saber como trabajarla de antemano. Para
desplegar su contenido se identifican con el smbolo $ ($<VARIABLE> )
Ejercicio:
(1) - Utilice el comando env para conocer las variables del sistema, indique los valores que tienen en su
sistema las variables antes mencionadas. Es ms fcil encontrar dichas variables usando env en
conjunto con grep (ej env | grep HOME).
Las variables del usuario son variables que el usuario define utilizando la siguiente sintaxis:
NOMBRE_VARIABLE=<valor>
user@localhost$ MYVAR=10
El valor de una variable se imprime utilizando el comando echo. Por ejemplo, para imprimir el valor
almacenado en la variable MYVAR: El comando env no desplegar las variables de usuario.
Recuerde que dicha variable local existir mientras la sesin del Shell este activa, si el alumno cierra la
terminal se borrara la sesin.
Programacin Shell
Un programa shell es un archivo tipo texto con comandos que son ejecutados secuencialmente.
Comnmente se les conoce con el nombre de script.
Para hacer ejecutable un archivo de comandos, se utiliza el comando chmod como sigue:
Este comando "chmod" cambia los permisos del archivo agregando el de ejecucin (+x) para el
usuario.
Ejemplo: Suponga que tenemos almacenado en un archivo llamado "renglon" el siguiente conjunto de
comandos:
Suponiendo que existe el archivo arch_datos y que tiene mas de 5 renglones, entonces para ejecutarlo
hacemos lo siguiente:
user@localhost$ ./renglon
Tipo de Shell
Durante la prctica pasada utilizamos una terminal corriendo un tipo de shell, usualmente BASH ya
que en un entorno Linux (moderno) Existen una gran variedad de Shells cuyas diferencias radican en
la sintaxis pero no es objetivo de esta prctica profundizar en ellos. Durante la prctica nos
enfocaremos exclusivamente en BASH.
Para confirmar que efectivamente tenemos el shell BASH veremos el contenido del archivo:
/etc/shells . Lo siguiente es la salida de un sistema Ubuntu 11.10 y obviamente puede variar en cada
versin del S.O. o por distribucin.
Por lo mismo que existen una gran variedad de Shells es requerido que la primera lnea de todo Shell
script sea definir el lenguaje en el que est redactado, eso se logra utilizando el conjunto de caracteres
"#!" y se trata de un caso especial que solo debe aparecer una vez. El uso de # (sin el signo de
admiracin) sirve para identificar que se trata de una lnea de comentario.
Por lo mismo, el contenido del script (en un archivo de texto) que hemos realizado hasta este punto
debe de ser lo siguiente
#!
/bin/bas
h
head -5
arch_da
tos | tail
-1
Procesamiento de comandos
La sintaxis de un comando en Unix es como sigue:
Los argumentos pueden ser opciones o archivos separados por espacios. Cada opcin va precedida del
caracter "-" y sirven para modificar de diversas maneras la ejecucin del comando.
Si el comando es un script del Shell, cada uno los elementos de la lnea de comando se almacena en
una variable, como se presenta a continuacin:
El programa shell puede tomar estas variables para procesarlas. Entonces, en el ejemplo anterior. Si
queremos generalizar para ver cualquier rengln podemos crear un archivo renglon2 con la siguiente
informacin:
#! /bin/bash
head -$1 arch_datos| tail -1
Suponiendo que existe el archivo arch_datos y que tiene mas de 15 renglones, entonces para ver el
contenido del rengln 15 hacemos lo siguiente:
user@localhost$ ./rengln2 15
Ejercicio
Usa el archivo de texto con 15 renglones que creaste anteriormente para comprobar el funcionamiento
de este script.
El siguiente cdigo muestra el manejo de los argumentos de un script (args.sh) en dos formas distintas:
#!/bin/bash
# la primera lnea con un '!' como primer caracter
# del comentario indica qu intrprete se utilizar
# en este caso, bash ubicado en /bin/bash
# Este programa muestra como procesar, uno por uno, los
# argumentos que se dan como entrada a un script.
Los caracteres delimitados por la comilla doble pierden su significado del carcter, excepto los
caracteres $ y \
Los caracteres limitados por comilla simple pierden su significado para el shell.
Los caracteres en comilla inversa forman un comando para ejecutar.
Ejemplos:
user@localhost$ a=5
user@localhost$ echo $a
5
user@localhost$> echo $a
$a
user@localhost$ echo `expr $a + 3`
8
Ejercicio:
Explique con sus propias palabras que accin se realiza al ejecutar cada uno de los siguientes
comandos:
(5) - fecha=date
(6) - echo hoy es: $fecha
(7) - echo hoy es: $fecha
(8) - echo hoy es: `$fecha `
Meta caracteres:
Los meta caracteres son una especie de comodines que se pueden utilizar al momento de referirse a
algn nombre o dato y permiten elegir variaciones de cierto patrn, estos pueden ser: *, ?, [abc]* y se
manejan como si fuesen expresiones regulares.
Ejercicio:
Indica con tus propias palabras que hace cada uno de los siguientes comandos:
(10) - ls m*
(11) - ls me?t
(12) - ls [sm]eat
expr es un comando que evala las expresiones que recibe como argumentos.
Ejemplo:
Suma:
user@localhost home $ expr 1 + 3
Resta:
user@localhost home $ expr 2 - 1
Divisin:
user@localhost home $ expr 10 / 2
Mdulo:
user@localhost home $ expr 20 % 3
Para hacer operaciones con numeros flotantes, tenemos que utilizar el comando bc que es el intrprete
de un lenguaje de aritmtica con precisin arbitraria.
Ejercicio:
Si intentas utilizar la multiplicacin directamente en consola notaras que marca un error.
ccna_admin@ccnalab12:~$ expr 7 * 3
expr: syntax error
if condition; then
comando1_then
...
else
comando1_else
...
fi
Podemos ver un ejemplo del uso de este estatuo en un archivo que denominaremos signo.sh el scual
contiene lo siguiente
#!/bin/bash
#
# Script que dado un numero como argumento
Habra notado que utilizamos -lt en vez de > y esto se debe a que el primero es un comparador
artimetico y el segundo lxico. Como quiera la siguiente tabla da un indicador de los tipos de condiciones
que podemos usar:
Comparaciones ( $VAR1 OP $VAR2 ) :
-eq equal to
-ne not equal to
-lt less than
-le less than or equal to
-gt greater than
-ge greater than or equal to
y la sintaxis del for que repite los commandos hasta que la expr2 es verdadera:
#!/bin/bash
#
#Script que imprime el doble de los valores de la lista.
#
for (( i = 0 ; i <= 5; i++ ))
do
echo "Welcome $((2 * $i)) times"
done
while [ condicion ]
do
commando
....
done
Ejemplo (test_while.sh):
#!/bin/sh
#
#Script to test while statement
#
#
n=$1
i=1
while [ $i -le 10 ]
do
echo "v= `expr $((2 * $i))`"
i=`expr $i + 1`
done
ltimas observaciones
Es importante dejar algo claro, shell scripting no es un lenguaje de programacin convencional
como Javascript, C/C++, JAVA, C#, Phyton entre otros pero no se compila ni puede desplegar
grficos. Shell scripting corresponde mas al termino Lenguaje de dominio-especifico y tiene el
poder de ejecutar no solo los comandos del S.O. sino tambien las aplicaciones de cualquier otro
lenguaje de programacin.
Tomemos por ejemplo un caso de resultados de control de clima, tomamos la automatizacin de
alimentar los datos del clima a un programa de Matlab, este arrojara pronsticos y estos los podemos
introducir a un programa en Java que despliega estos formatos en servidores Web (mediante Servlets)
todo utilizando un simple shell scripting automatizado para ejecutarse cada cierto tiempo, e incluso
si se presenta un problema el script podra tener lneas preparadas para enviar un correo (mediante los
comandos propios del S.O. o desde cualquier programa hecho con cualquier lenguaje de programacin
que lo permita).
Laboratorio:
El laboratorio se realizara en la siguiente liga: Enlace al laboratorio. Para su correcta realizacin
utilizara la informacin de esta prctica as como los elementos que vienen a continuacin.
Investigacin
Investigar para qu sirven los siguientes comandos ya que sern utilizados para elaboracin de la
prctica. No olvide revisar los argumentos que pueden manejar ya que algunos comandos con ciertos
argumentos pueden realizar las funciones bases de otros.
1. join
2. paste
3. cut
4. tr
5. sed
6. uniq
7. sort
Texto
Primer ejercicio de texto
Archivo1.txt
El miedo es
el lado
oscuro
a la ira,
al odio, el
sufrimiento.
Percibo
mucho
Archivo2.txt
el
camin
o
hacia.
El
miedo
lleva
la ira
lleva
odio
lleva al
miedo
en ti.
DETENTE SOMBRA
IoN
REDONDILLAS
Combats su resistencia
y luego, con gravedad,
decs que fue liviandad
lo que hizo la diligencia.
O cul es de ms culpar,
aunque cualquiera mal haga;
la que peca por la paga
o el que paga por pecar?
Dejad de solicitar,
y despus, con ms razn,
acusaris la aficin
de la que os fuere a rogar.
IoN
Srvame el entendimiento
alguna vez de descanso,
y no siempre est el ingenio
con el provecho encontrado.
Todo el mundo es opiniones
de pareceres tan varios,
que lo que el uno que es negro
el otro prueba que es blanco.
Clebre su oposicin
ha sido por siglos tantos,
sin que cul acert, est
hasta agora averiguado.
Si es mo mi entendimiento,
por qu siempre he de encontrarlo
tan torpe para el alivio,
tan agudo para el dao?
El discurso es un acero
que sirve para ambos cabos:
de dar muerte, por la punta,
por el pomo, de resguardo.
Qu feliz es la ignorancia
del que, indoctamente sabio,
halla de lo que padece,
en lo que ignora, sagrado!
En amenidad intil,
qu importa al florido campo,
si no halla fruto el otoo,
que ostente flores el mayo?
De qu sirve al ingenio
el producir muchos partos,
si a la multitud se sigue
el malogro de abortarlos?
Es de su propio Seor
tan rebelado vasallo,
que convierte en sus ofensas
las armas de su resguardo.
Qu felizmente viviera
el que, flojamente cauto,
burlara las amenazas
del influjo de los astros!
Aprendamos a ignorar,
pensamiento, pues hallamos
que cuanto aado al discurso,
tanto le usurpo a los aos.
IoN
IoN
IoN
No agradecido te busco:
pues no debes, bien mirado,
estimar lo que yo nunca
juzgu que fuera a tus manos.
En tu libertad te pongo,
si quisieres censurarlos;
pues de que, al cabo, te ests
en ella, estoy muy al cabo.
No hay cosa ms libre que
el entendimiento humano;
pues lo que Dios no violenta,
por qu yo he de violentarlo?
IoN
En lgrimas y suspiros
alma y corazn a un tiempo,
aqul se convierte en agua,
y sta se resuelve en viento.
Ya no me sirve de vida
esta vida que poseo,
sino de condicin sola
necesaria al sentimiento.
Y si mi amor no es bastante,
el tuyo mismo te acuerdo,
que no es poco empeo haber
empezado ya en empeo.
Y perdona si en temer
mi agravio, mi bien, te ofendo,
que no es dolor, el dolor
que se contiene atento.
IoN
IoN
A Casandra su fiereza
busc, y con modos tiranos,
at a la Razn las manos,
que era del Alma princesa.
En prisiones su belleza
de soldados atrevidos,
lamenta los no credos
desastres que adivin,
pues por ms voces que dio
no la oyeron los sentidos.
IoN
IoN
VERDE EMBELESO
LeerORIGEN(){
#echo "" > "$DESTINO" #Un archivo temporal es creado para ir guardando lo exitoso
#El for avanzara en cada Palabra hallada en lo que regrese cat $ORIGEN
for WORD in `cat $ORIGEN`
do
#Aqui es donde buscaremos WORD, en teoria puede ser Alfa numerico o solo numerico
#Iremos descartando, primero A0#######
Match=`echo "$WORD" | grep -xwi "$EXPREG1"`
if [ "$Match" = "" ]
then
#echo "No es el primer formato "
#Puede estar ya bien en el formato definitivo
Match=`echo "$WORD" | grep -xwi "$EXPREG3"`
if [ "$Match" != "" ]
then
#La longitud es necesaria de checar
if [ "${#Match}" -eq 18 ]
then
#Un correo en el formato y longitud debido
#echo "Un correo hallado" "$EXPREG3" ": " $Match
echo "$Match" #>> "$DESTINO"
fi
else #Puede ser meramente numero (Sin A0)
Match=`echo "$WORD" | grep -xwi "$EXPREG2"`
if [ "$Match" != "" ]
then
#LA longitud es un problema... A-00787620, A0-1787620 y A00-787620 son
# validas, por lo tanto ifelse
if [ "${#Match}" -eq 8 ]
then
#echo "Una matricula escrita informalmente""$EXPREG2" ": " $Match
echo "A""$Match""@itesm.mx" #>> "$DESTINO"
elif [ "${#Match}" -eq 7 ]
then
#echo "Una matricula escrita informalmente""$EXPREG2" ": " $Match
echo "A0""$Match""@itesm.mx" #>> "$DESTINO"
elif [ "${#Match}" -eq 6 ]
then
#echo "Una matricula escrita informalmente" "$EXPREG2" ": " $Match
echo "A00""$Match""@itesm.mx" #>> "$DESTINO"
fi
fi
fi
else
#OJO: Espacios en blanco todavia pasan y longigutdes largas tambien
# Debemos garantizar que solo se registren longitud de 9 caracteres
# ${#Match} es uno de las tantas opciones para obtener longitud de strings
if [ "${#Match}" -eq 9 ]
then
#echo "Una matricula hallada" "$EXPREG1" ": " $Match
echo "$Match""@itesm.mx" #>> "$DESTINO"
fi
fi
done
}
###########################################################
####### Equivalente a un MAIN ######################
###########################################################
#echo $#
#echo $@
#echo $1
#echo "BASH para convertir matriculas a cuentas de @itesm.mx"
exit 0
Dr. Juan A. Nolazco Flores, Sistemas Operativos, Ene-May 2009