Resueltos Software Pract
Resueltos Software Pract
Resueltos Software Pract
patatabrava.com
SOLUCIONARIO SOFTWARE
Implantacin de @ries
r
Portafolios Prcticas Jess Garca Godoy Fundamentos del Software
24-1-2012 Documento v1.0 Pgina 1 de 64
Indice
Sesion 2 ...................................................................................................................................................................................... 5
Ejercicio 1 .............................................................................................................................................................................. 5
Ejercicio 2 .............................................................................................................................................................................. 5
Ejercicio 3 .............................................................................................................................................................................. 5
Ejercicio 4 .............................................................................................................................................................................. 6
Ejercicio 5 .............................................................................................................................................................................. 6
Ejercicio 6 .............................................................................................................................................................................. 7
Ejercicio 7 .............................................................................................................................................................................. 7
Ejercicio 8 .............................................................................................................................................................................. 8
Ejercicio 9 .............................................................................................................................................................................. 8
Sesion 3 ...................................................................................................................................................................................... 9
Ejercicio 1 .............................................................................................................................................................................. 9
Ejercicio 2 .............................................................................................................................................................................. 9
Ejercicio 3 ............................................................................................................................................................................ 10
Ejercicio 4 ............................................................................................................................................................................ 10
Sesion 4 .................................................................................................................................................................................... 11
Ejercicio 1 ............................................................................................................................................................................ 11
Ejercicio 2 ............................................................................................................................................................................ 11
Ejercicio 3 ............................................................................................................................................................................ 11
Ejercicio 4 ............................................................................................................................................................................ 12
Ejercicio 5 ............................................................................................................................................................................ 12
Ejercicio 6 ............................................................................................................................................................................ 12
Ejercicio 7 ............................................................................................................................................................................ 12
Ejercicio 8 ............................................................................................................................................................................ 13
Ejercicio 9 ............................................................................................................................................................................ 13
Ejercicio 10 .......................................................................................................................................................................... 13
Ejercicio 11 .......................................................................................................................................................................... 14
Ejercicio 12 .......................................................................................................................................................................... 22
Ejercicio 13 .......................................................................................................................................................................... 23
Ejercicio 14 .......................................................................................................................................................................... 23
Sesion 5 .................................................................................................................................................................................... 24
Ejercicio 1 ............................................................................................................................................................................ 24
Ejercicio 2 ............................................................................................................................................................................ 24
Ejercicio 3 ............................................................................................................................................................................ 25
Ejercicio 4 ............................................................................................................................................................................ 25
EJERCICIO 1
Crea el siguiente rbol de directorios a partir de tu directorio de usuario (donde usuario representa tu nombre
de usuario o login en el sistema operativo). Crea tambin los ficheros vacos pg1 y ma51ik en los directorios
que se indican en la ilustracin:
mkdir ug1
touch pg1
cd ug1
mkdir ee51vn
touch ma51ik
cd ee51vn
mkdir docs pics
EJERCICIO 2
Mueve el directorio pics dentro del directorio ug1. Renombra finalmente dicho directorio a imagenes.
Copia el directorio docs dentro de ug1.
cd $HOME
mv ./ug1/ee51vn/pics ./ug1/imagenes
cp -r ./ug1/ee51vn/docs ./ug1
EJERCICIO 3
Liste los archivos que estn en su directorio actual y fjese en alguno que no disponga de la fecha actualizada,
es decir, el da de hoy. Ejecute la orden touch sobre dicho archivo y observe qu sucede sobre la fecha del
citado archivo cuando se vuelva a listar.
ls -lF
touch ejemplo.txt
EJERCICIO 4
La organizacin del espacio en directorios es fundamental para poder localizar fcilmente aquello
que estemos buscando. En ese sentido, realice las siguientes acciones dentro de su directorio home
(es el directorio por defecto sobre el que trabajamos al entrar en el sistema):
c) Dentro del directorio de la asignatura fundamentos del software (llamado FS) y dentro del
directorio creado para esta sesin, copiar los archivos host y passwd que se encuentran
dentro del directorio /etc.
cp /etc/hosts $HOME/FS
cp /etc/passwd $HOME/FS
cat FS/hosts
cat FS/passwd
EJERCICIO 5
Desplacmonos hasta el directorio /bin, genere los siguientes listados de archivos (siempre de la forma ms
compacta y utilizando los metacaracteres apropiados):
cd /bin
a)
Todos los archivos que contengan slo cuatro caracteres en su nombre.
b)
Todos los archivos que comiencen por los caracteres d, f.
ls -l [df]*
c)
Todos los archivos que comiencen por las parejas de caracteres sa, se, ad.
ls -l {sa,se,ad}*
d)
Todos los archivos que comiencen por t y acaben en r.
ls -l t*r
EJERCICIO 6
Liste todos los archivos que comiencen por tem y terminen por .gz o .zip :
a)
de tu directorio home
ls -l ~/tem*.{gz,zip}
b)
del directorio actual
ls -l ./tem*.{gz,zip}
c)
hay alguna diferencia en el resultado de su ejecucin? Explique el por qu si o el por qu no.
EJERCICIO 7
Muestre del contenido de un archivo regular que contenga texto:
a)
las 10 primeras lneas.
head -n 5 jamon.txt
tail -n 10 jamon.txt
EJERCICIO 8
Ordene el contenido de un archivo de texto segn diversos criterios de ordenacin.
sort jamon.txt
sort -n jamon.txt
Al reves:
sort -r jamon.txt
Aleatoriamente:
sort -R jamon.txt
EJERCICIO 9
Cmo puedes ver el contenido de todos los archivos del directorio actual que terminen en .txt o .c?
ls -l ./*.{txt,c}
- Dar permiso de ejecucin al grupo de todos los archivos cuyo nombre comience con la letra e.
Nota: Si no hay ms de dos archivos que cumplan esa condicin, se debern crear archivos que
empiecen con e y/o modificar el nombre de archivos ya existentes para que cumplan esa
condicin.
chmod g+x e*
EJERCICIO 2
Utilizando solamente las rdenes de la sesin anterior y los metacaracteres de redireccin de salida:
* Crear un archivo llamado ej31 , que contendr el nombre de los archivos del directorio padre del
directorio de trabajo.
ls $HOME/.. > ej31
* Crear un archivo llamado ej32 , que contendr las dos ltimas lneas del archivo creado en el
ejercicio anterior.
tail -n 2 ej31 > ej32
wc -m $HOME/[ef]*
EJERCICIO 4
Resuelva cada uno de los siguientes apartados.
a) Crear un archivo llamado ejercicio1, que contenga las 17 ltimas lneas del texto que proporciona
la orden man para la orden chmod (se debe hacer en una nica lnea de rdenes y sin utilizar el
metacarcter ; ).
b) Al final del archivo ejercicio1, aadir la ruta completa del directorio de trabajo actual.
c) Usando la combinacin de rdenes mediante parntesis, crear un archivo llamado ejercicio3 que
contendr el listado de usuarios conectados al sistema (orden who) y la lista de archivos del
directorio actual.
d) Aadir, al final del archivo ejercicio3, el nmero de lneas, palabras y caracteres del archivo
ejercicio1. Asegrese de que, por ejemplo, si no existiera ejercicio1, los mensajes de error tambin se
aadieran al final de ejercicio3.
e) Con una sola orden chmod, cambiar los permisos de los archivos ejercicio1 y ejercicio3, de forma
que se quite el permiso de lectura al grupo y se d permiso de ejecucin a las tres categoras de
usuarios.
Escriba, al menos, cinco variables de entorno junto con el valor que tienen.
HOME=/home/superjes
USERNAME=superjes
LANGUAGE=es_ES:en
LOGNAME=superjes
DESKTOP_SESSION=gnome
EJERCICIO 2
Ejecute las rdenes del cuadro e indique qu ocurre y cmo puede resolver la situacin para que la
variable NOMBRE se reconozca en el shell hijo.
$ export NOMBRE=FS
$ echo $NOMBRE
$ FS
$ bash
$ echo $NOMBRE
$ FS
EJERCICIO 3
Compruebe qu ocurre en las expresiones del ejemplo anterior si se quitan las comillas dobles del
final y se ponen despus de los dos puntos. Qu sucede si se sustituyen las comillas dobles por
comillas simples?
-Si se ponen las dobles comillas despus de los 2 puntos pasa que todo sale a continuacin de lo
anterior sin saltos de lnea , con lo que no queda muy visual:
Los archivos que hay en el directorio son: total 60 drwxr-xr-x 2 superjes superjes
4096 2011-10-11 08:50 Descargas drwxr-xr-x 2 superjes superjes 4096 2011-09-28
01:07 Documentos -rw-r--r-- 1 superjes superjes 9 2011-10-11 09:15 ej31 -rw-r--r--
1 [...]
-Si se sustituyen las comillas dobles por comillas simples pasa que se muestra literalmente lo que hay
dentro de ellas, sin ejecutar ningn comando que contenga.
EJERCICIO 4
Pruebe la siguiente asignacin. Qu ha ocurrido?
Ha ocurrido que como no hemos usado la orden "expr", no se reconoce el smbolo de la suma.
EJERCICIO 5
Construya un guion que acepte como argumento una cadena de texto (por ejemplo, su nombre) y
que visualice en pantalla la frase Hola y el nombre dado como argumento.
#!/bin/bash
echo "Hola $1"
EJERCICIO 6
Vare el guion anterior para que admita una lista de nombres.
#!/bin/bash
echo "Hola $@"
EJERCICIO 7
Cree tres variables llamadas VAR1, VAR2 y VAR3 con los siguientes valores respectivamente hola,
adios y 14.
VAR1=hola
VAR2=adios
VAR3=14
a) Imprima los valores de las tres variables en tres columnas con 15 caracteres de ancho.
- Son locales
unset VAR2
d) Abra otra ventana de tipo terminal, puede visualizar las dos variables restantes?
- No, porque eran variables locales, slo se podan ver en el terminal anterior.
echo ${vector[1]}
EJERCICIO 8
Cree un alias que se llame ne (nombrado as para indicar el nmero de elementos) y que devuelva el
nmero de archivos que existen en el directorio actual. Qu cambiara si queremos que haga lo
mismo pero en el directorio home correspondiente al usuario que lo ejecuta?
Para que sea del directorio home del usuario que lo ejecuta:
EJERCICIO 9
Indique la lnea de orden necesaria para buscar todos los archivos a partir del directorio home que
tengan un tamao menor de un bloque. Cmo la modificara para que adems imprima el resultado
en un archivo que se cree dentro del directorio donde nos encontremos y que se llame archivosP?
EJERCICIO 10
Indique cmo buscara todos aquellos archivos del directorio actual que contengan la palabra
ejemplo.
find ./*ejemplo*
man find:
-D debugoptions
Print diagnostic information; this can be helpful to diagnose
problems with why find is not doing what you want. The list of
debug options should be comma separated. Compatibility of the
debug options is not guaranteed between releases of findutils.
For a complete list of valid debug options, see the output of
find -D help. Valid debug options include
stat Print messages as files are examined with the stat and
-Olevel
Enables query optimisation. The find program reorders tests to
speed up execution while preserving the overall effect; that is,
predicates with side effects are not reordered relative to each
other. The optimisations performed at each optimisation level
are as follows.
-daystart
Measure times (for -amin, -atime, -cmin, -ctime, -mmin, and
-mtime) from the beginning of today rather than from 24 hours
ago. This option only affects tests which appear later on the
command line.
-follow
-help, --help
Print a summary of the command-line usage of find and exit.
-ignore_readdir_race
Normally, find will emit an error message when it fails to stat
a file. If you give this option and a file is deleted between
the time find reads the name of the file from the directory and
the time it tries to stat the file, no error message will be
issued. This also applies to files or directories whose names
are given on the command line. This option takes effect at the
time the command line is read, which means that you cannot
search one part of the filesystem with this option on and part
of it with this option off (if you need to do that, you will
need to issue two find commands instead, one with the option and
one without it).
-maxdepth levels
Descend at most levels (a non-negative integer) levels of direc
tories below the command line arguments. -maxdepth 0
means only apply the tests and actions to the command line
arguments.
-mindepth levels
Do not apply any tests or actions at levels less than levels (a
non-negative integer). -mindepth 1 means process all files
except the command line arguments.
-noignore_readdir_race
Turns off the effect of -ignore_readdir_race.
-noleaf
Do not optimize by assuming that directories contain 2 fewer
subdirectories than their hard link count. This option is
-regextype type
Changes the regular expression syntax understood by -regex and
-iregex tests which occur later on the command line. Currently-
implemented types are emacs (this is the default), posix-awk,
posix-basic, posix-egrep and posix-extended.
-version, --version
Print the find version number and exit.
-warn, -nowarn
Turn warning messages on or off. These warnings apply only to
the command line usage, not to any conditions that find might
encounter when it searches directories. The default behaviour
corresponds to -warn if standard input is a tty, and to -nowarn
otherwise.
man grep:
OPTIONS
Generic Program Information
--help Print a usage message briefly summarizing these command-line
options and the bug-reporting address, then exit.
-V, --version
Print the version number of grep to the standard output stream.
This version number should be included in all bug reports (see
below).
Matcher Selection
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below). (-E is specified by POSIX.)
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see
below). This is the default.
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly
experimental and grep -P may warn of unimplemented features.
Matching Control
-e PATTERN, --regexp=PATTERN
Use PATTERN as the pattern. This can be used to specify
multiple search patterns, or to protect a pattern beginning with
a hyphen (-). (-e is specified by POSIX.)
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input
files. (-i is specified by POSIX.)
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v
is specified by POSIX.)
-w, --word-regexp
Select only those lines containing matches that form whole
words. The test is that the matching substring must either be
at the beginning of the line, or preceded by a non-word
constituent character. Similarly, it must be either at the end
of the line or followed by a non-word constituent character.
Word-constituent characters are letters, digits, and the
underscore.
-x, --line-regexp
Select only those matches that exactly match the whole line.
(-x is specified by POSIX.)
--color[=WHEN], --colour[=WHEN]
Surround the matched (non-empty) strings, matching lines,
-L, --files-without-match
Suppress normal output; instead print the name of each input
file from which no output would normally have been printed. The
scanning will stop on the first match.
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines. If the input is
standard input from a regular file, and NUM matching lines are
output, grep ensures that the standard input is positioned to
just after the last matching line before exiting, regardless of
the presence of trailing context lines. This enables a calling
process to resume a search. When grep stops after NUM matching
lines, it outputs any trailing context lines. When the -c or
--count option is also used, grep does not output a count
greater than NUM. When the -v or --invert-match option is also
used, grep stops after outputting NUM non-matching lines.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-s, --no-messages
Suppress error messages about nonexistent or unreadable files.
Portability note: unlike GNU grep, 7th Edition Unix grep did not
conform to POSIX, because it lacked -q and its -s option behaved
like GNU grep's -q option. USG-style grep also lacked -q but
its -s option behaved like GNU grep. Portable shell scripts
should avoid both -q and -s and should redirect standard and
error output to /dev/null instead. (-s is specified by POSIX.)
-h, --no-filename
Suppress the prefixing of file names on output. This is the
default when there is only one file (or only standard input) to
search.
--label=LABEL
Display input actually coming from standard input as input
coming from file LABEL. This is especially useful when
implementing tools like zgrep, e.g., gzip -cd foo.gz | grep
--label=foo -H something. See also the -H option.
-n, --line-number
Prefix each line of output with the 1-based line number within
its input file. (-n is specified by POSIX.)
-T, --initial-tab
Make sure that the first character of actual line content lies
on a tab stop, so that the alignment of tabs looks normal. This
is useful with options that prefix their output to the actual
content: -H,-n, and -b. In order to improve the probability
that lines from a single file will all start at the same column,
this also causes the line number and byte offset (if present) to
be printed in a minimum size field width.
-u, --unix-byte-offsets
Report Unix-style byte offsets. This switch causes grep to
report byte offsets as if the file were a Unix-style text file,
i.e., with CR characters stripped off. This will produce
results identical to running grep on a Unix machine. This
option has no effect unless -b option is also used; it has no
effect on platforms other than MS-DOS and MS-Windows.
-Z, --null
Output a zero byte (the ASCII NUL character) instead of the
character that normally follows a file name. For example, grep
-lZ outputs a zero byte after each file name instead of the
usual newline. This option makes the output unambiguous, even
in the presence of file names containing unusual characters like
newlines. This option can be used with commands like find
-print0, perl -0, sort -z, and xargs -0 to process arbitrary
file names, even those that contain newline characters.
-B NUM, --before-context=NUM
Print NUM lines of leading context before matching lines.
Places a line containing a group separator (--) between
--binary-files=TYPE
If the first few bytes of a file indicate that the file contains
binary data, assume that the file is of type TYPE. By default,
TYPE is binary, and grep normally outputs either a one-line
message saying that a binary file matches, or no message if
there is no match. If TYPE is without-match, grep assumes that
a binary file does not match; this is equivalent to the -I
option. If TYPE is text, grep processes a binary file as if it
were text; this is equivalent to the -a option. Warning: grep
--binary-files=text might output binary garbage, which can have
nasty side effects if the output is a terminal and if the
terminal driver interprets some of it as commands.
-D ACTION, --devices=ACTION
If an input file is a device, FIFO or socket, use ACTION to
process it. By default, ACTION is read, which means that
devices are read just as if they were ordinary files. If ACTION
is skip, devices are silently skipped.
-d ACTION, --directories=ACTION
If an input file is a directory, use ACTION to process it. By
default, ACTION is read, which means that directories are read
just as if they were ordinary files. If ACTION is skip,
directories are silently skipped. If ACTION is recurse, grep
reads all files under each directory, recursively; this is
equivalent to the -r option.
--exclude=GLOB
Skip files whose base name matches GLOB (using wildcard
matching). A file-name glob can use *, ?, and [...] as
wildcards, and \ to quote a wildcard or backslash character
literally.
--exclude-from=FILE
Skip files whose base name matches any of the file-name globs
read from FILE (using wildcard matching as described under
--exclude).
--exclude-dir=DIR
Exclude directories matching the pattern DIR from recursive
searches.
--include=GLOB
Search only files whose base name matches GLOB (using wildcard
matching as described under --exclude).
Other Options
--line-buffered
Use line buffering on output. This can cause a performance
penalty.
--mmap If possible, use the mmap(2) system call to read input, instead
of the default read(2) system call. In some situations, --mmap
yields better performance. However, --mmap can cause undefined
behavior (including core dumps) if an input file shrinks while
grep is operating, or if an I/O error occurs.
-U, --binary
Treat the file(s) as binary. By default, under MS-DOS and MS-
Windows, grep guesses the file type by looking at the contents
of the first 32KB read from the file. If grep decides the file
is a text file, it strips the CR characters from the original
file contents (to make regular expressions with ^ and $ work
correctly). Specifying -U overrules this guesswork, causing all
files to be read and passed to the matching mechanism verbatim;
if the file is a text file with CR/LF pairs at the end of each
line, this will cause some regular expressions to fail. This
option has no effect on platforms other than MS-DOS and MS-
Windows.
-z, --null-data
Treat the input as a set of lines, each terminated by a zero
byte (the ASCII NUL character) instead of a newline. Like the
-Z or --null option, this option can be used with commands like
sort -z to process arbitrary file names.
EJERCICIO 12
Indique cmo buscara si un usuario dispone de una cuenta en el sistema.
#!/bin/bash
else
echo "El usuario $1 NO tiene cuenta en el sistema"
fi
#!/bin/bash
num_archivos=`ls -lR $HOME|cut -d " " -f 1|grep -e '-[-w][-x]$'|wc -l`
echo "Hay $num_archivos archivos que no tienen permiso de lectura para el resto de
usuarios en todo tu arbol de directorios"
EJERCICIO 14
Modifique el ejercicio 8 de forma que, en vez de un alias, sea un guion llamado numE el que devuelva
el nmero de archivos que existen en el directorio que se le pase como argumento.
#!bin/bash
ls $1|wc -l
Primera forma:
$ anio=365
$ dia=`date +%j`
$ var=`expr $anio - $dia`
$ echo "Faltan `expr $var / 7` semanas hasta el fin de ao"
Segunda forma:
Tercera forma:
Combinacin de ellas:
EJERCICIO 2
Realice las siguientes operaciones para conocer el funcionamiento del operador de incremento como
sufijo y como prefijo. Razone el resultado obtenido en cada una de ellas:
$ v=1
$ echo $v //vale 1
$ echo $((v++)) //vale 2 , pero aparece 1 en pantalla
$ echo $v //vale 2
$ echo $((++v)) //vale 3, y aparece 3 en pantalla
$ echo $v //vale 3
$ x=25
$ y=5
$ echo $[x /= $y]
$ echo $x //valdr 5
EJERCICIO 4
Compruebe qu ocurre si en el ejemplo anterior utiliza comillas dobles o simples para acotar todo lo
que sigue a la orden echo. Qu sucede si se acota entre comillas dobles solamente la expresin
aritmtica que se quiere calcular?, y si se usan comillas simples?
EJERCICIO 5
Calcule con decimales el resultado de la expresin aritmtica (3-2)/5. Escriba todas las expresiones
que haya probado hasta dar con una respuesta vlida. Utilizando una solucin vlida, compruebe qu
sucede cuando la expresin aritmtica se acota entre comillas dobles; qu ocurre si se usan comillas
simples?, y si se ponen apstrofos inversos?
EJERCICIO 6
Consulte la sintaxis completa de la orden let utilizando la orden de ayuda para las rdenes
empotradas (help let) y tome nota de su sintaxis general.
$ help let
let: let arg [arg ...]
Evaluate arithmetic expressions.
Exit Status:
If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
EJERCICIO 7
Al realizar el ejercicio anterior habr observado que la orden let admite asignaciones mltiples y
operadores que nosotros no hemos mencionado anteriormente. Ponga un ejemplo de asignacin
mltiple y, por otra parte, copie en un archivo el orden en el que se evalan los operadores que
admite.
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "La primera expresion es cierta: $1"
else
echo "La primera expresion es falsa: $1"
fi
if [ $2 -eq 1 ]
then
echo "La segunda expresion es cierta: $2"
else
echo "La segunda expresion es falsa: $2"
fi
if [ $1 -lt $2 ]
then
echo "El primer parametro es mas pequeo que el segundo"
elif [ $1 -gt $2 ]
then
echo "El primer parametro es mas grande que el segundo"
else
echo "Son iguales"
fi
#!/bin/bash
if [ $es_plano == "true" ]
then
#Dado el enunciado aqui no contemplamos el caso de que solo sea
#verdad una de estas condiciones
echo "Es un archivo plano y con permiso de ejecucion"
else
if [ $es_enlace == "true" ]
then
echo "Es un enlace simbolico"
else
echo "No es un enlace simbolico"
fi
EJERCICIO 10
Ejecute help test y anote qu otros operadores se pueden utilizar con la orden test y para qu sirven.
Ponga un ejemplo de uso de la orden test comparando dos expresiones aritmticas y otro
comparando dos cadenas de caracteres.
File operators:
All file operators except -h and -L are acting on the target of a symbolic
link, not on the symlink itself, if FILE is a symbolic link.
String operators:
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
Other operators:
See the bash manual page bash(1) for the handling of parameters (i.e.
missing parameters).
Exit Status:
Returns success if EXPR evaluates to true; fails if EXPR evaluates to
false or an invalid argument is given.
EJERCICIO 11
Responda a los siguientes apartados:
- Verifica si el archivo "sesion5.pdf" del directorio actual es un archivo plano, si es as imprime que el
archivo existe.
b) Aada los cambios necesarios en la orden anterior para que tambin muestre un mensaje de aviso
en caso de no existir el archivo. (Recuerde que, para escribir de forma legible una orden que ocupe
ms de una lnea, puede utilizar el carcter \ como final de cada lnea que no sea la ltima.)
if test -f ./sesion5.pdf && test -d /bin ; then printf "El archivo ./sesion5.pdf
existe y /bin es un directorio"; elif test -f ./sesion5.pdf && ! test -d /bin ;
then printf "El archivo ./sesion5.pdf existe y /bin no es un directorio"; elif !
test -f ./sesion5.pdf && test -d /bin ; then printf "No existe el archivo
./sesion5.pdf y /bin es un directorio"; else printf "Ni existe ./sesion5.pdf ni
/bin es un directorio"; fi
d) Usando como base la solucin del apartado anterior, construya un guion que sea capaz de hacer lo
mismo pero admitiendo como parmetros la ruta relativa del primer archivo a buscar y la ruta
absoluta del segundo. Prubelo con los dos archivos del apartado anterior.
#!/bin/bash
if test -f $1 && test -d $2
then printf "El archivo $1 existe y $2 es un directorio\n"
elif test -f $1 && ! test -d $2
then printf "El archivo $1 existe y $2 no es un directorio\n"
elif ! test -f $1 && test -d $2
then printf "No existe el archivo $1 y $2 es un directorio\n"
else
printf "Ni existe $1 ni $2 es un directorio\n"
fi
EJERCICIO 12
Construya un guion que admita como argumento el nombre de un usuario del sistema y que permita
saber si ese usuario es el propietario del archivo /bin/ls y si tiene permiso de lectura sobre l.
#!/bin/bash
if [ $lectura -eq 1 ]
then
printf "El usuario tiene permiso de lectura\n"
else
printf "El usuario NO tiene permiso de lectura\n"
fi
if [ $1 == $propietario ]
then
printf "El usuario es propietario de /bin/ls\n"
else
printf "El usuario NO es propietario de /bin/ls\n"
fi
#!/bin/bash
if [[ $1 == "-h" ]]
then
printf "Este es el manual\n"
else
anio=365
dia=`date +%j`
restantes=`expr $anio - $dia`
printf "Faltan $restantes dias hasta el fin de ao\n"
if [ `expr $restantes % 5` == 0 ]
then
printf "Ademas, ese numero es multiplo de 5\n"
else
printf "Pero ese numero no es multiplo de 5\n"
fi
fi
EJERCICIO 14
Qu pasa en el ejemplo anterior si eliminamos la redireccin de la orden if?
- Si se borra la redireccin pasa que el mensaje de error que emite el sistema operativo , por
ejemplo si el archivo no existe, se muestra en pantalla adems de nuestro mensaje. Si no lo
eliminamos no se muestra, ya que se enva a /dev/null.
#!/bin/bash
if [[ $1 =~ [A-Z] ]]
then
echo "Y es una letra mayuscula"
elif [[ $1 =~ [a-z] ]]
then
echo "Y es una letra minuscula"
else
echo "No es una letra, es otro caracter"
fi
else
echo "No es un unico caracter"
fi
EJERCICIO 16
Haciendo uso de expresiones regulares, escriba una orden que permita buscar en el rbol de
directorios los nombres de los archivos que contengan al menos un dgito y la letra e. Cmo sera la
orden si quisiramos obtener los nombres de los archivos que tengan la letra e y no contengan ni el 0
ni el 1?
EJERCICIO 17
Utilizando la orden grep, exprese una forma alternativa de realizar lo mismo que con wc -l.
grep c
grep -E 'e$ | s$' s5_datos #Si hay espacios no hace nada porque buscas
espacios literalmente.
7.- Palabras que incluyen una o varias letras a entre dos letras p.
11.- Palabras que incluyen de dos a cinco letras a entre dos letras p.
16.- Palabras de cinco letras que comiencen con la letra b y terminen con la letra o.
17.- Palabras de cualquier longitud que comiencen con la letra p y terminen con la letra a.
EJERCICIO 1
Escriba un guion que acepte dos argumentos. El primero ser el nombre de un directorio y el
segundo ser un valor entero. El funcionamiento del guion es el siguiente: debern anotarse en un
archivo denominado archivosSizN.txt aquellos archivos del directorio dado como argumento y que
cumplan la condicin de tener un tamao menor al valor aportado en el segundo argumento. Se
deben tener en cuenta las comprobaciones sobre los argumentos, es decir, debe haber dos
argumentos, el primero deber ser un directorio existente y el segundo un valor entero.
#!/bin/bash
if [ $# -eq 2 ]
then
if [ $es_directorio == "true" ] && [ $es_entero == "true" ]
then
find $1 -size -$2 > archivosSizN.txt
echo "Fichero archivosSizN.txt creado correctamente"
else
echo "El directorio no existe o el parametro segundo no es un entero"
fi
else
echo "Numero incorrecto de parametros"
fi
EJERCICIO 2
Escriba un guion que acepte el nombre de un directorio como argumento y muestre como resultado
el nombre de todos y cada uno de los archivos del mismo y una leyenda que diga "Directorio",
"Enlace" o "Archivo regular", segn corresponda. Incluya la comprobacin necesaria sobre el
argumento, es decir, determine si el nombre aportado se trata de un directorio existente.
#!/bin/bash
if [ $# -eq 1 ]
then
if [ $es_directorio == "true" ]
then
for i in `ls $1`
do
es_archivo=`test -f $i && echo true || echo false`
if [ $es_enlace == "true" ]
then
echo "Enlace : $i"
elif [ $es_archivo == "true" ]
then
echo "Archivo regular : $i"
elif [ $es_subdirectorio == "true" ]
then
echo "Directorio : $i"
fi
done
else
echo "El directorio no existe"
fi
else
echo "Numero incorrecto de parametros"
fi
EJERCICIO 3
Escriba un guion en el que, a partir de la pulsacin de una tecla, detecte la zona del teclado donde se
encuentre. Las zonas vendrn determinadas por las filas. La fila de los nmeros 1, 2, 3, 4, ... ser la
fila 1, las teclas donde se encuentra la Q, W, E, R, T, Y,... sern de la fila 2, las teclas de la A, S, D, F, ...
sern de la fila 3 y las teclas de la Z, X, C, V, ... sern de la fila 4. La captura de la tecla se realizar
mediante la orden read. (vea seccin 6 en pgina 6).
#!/bin/bash
printf "Pulsa una tecla\n"
read tecla
case $tecla in
[0-9\']) echo "Primera fila" ;;
[qwertyuiop\`+]) echo "Segunda fila" ;;
[asdfghjkl]) echo "Tercera fila" ;;
[\<zxcvbnm,.-]) echo "Cuarta fila" ;;
*) echo "Otra linea" ;;
esac
EJERCICIO 4
Escriba un guion que acepte como argumento un parmetro en el que el usuario indica el mes que
quiere ver, ya sea en formato numrico o usando las tres primeras letras del nombre del mes y
muestre el nombre completo del mes introducido. Si el nmero no est comprendido entre 1 y 12 o
las letras no son significativas del nombre de un mes, el guion deber mostrar el correspondiente
mensaje de error.
#!/bin/bash
printf "Elige un mes del 1 al 12\n"
read mes
EJERCICIO 5
Escriba un guion que solicite un nmero hasta que su valor est comprendido entre 1 y 10. Deber
usar la orden while y, para la captura del nmero, la orden read (ver pgina 6).
#!/bin/bash
num=0
EJERCICIO 6
Copie este ejercicio y prubelo en su sistema para ver su funcionamiento. Qu podemos modificar
para que el giro se vea ms rpido o ms lento? Qu hace la opcin -e de las rdenes echo del
guion?
-Para que el giro sea ms rpido solo hay que cambiar el valor de la variable INTERVAL, que vale 1, y
poner un valor ms pequeo.
-La orden -e de los echo es para poder interpretar las barras invertidas como caracteres.
EJERCICIO 7
Escriba un guion que admita como argumento el nombre de un tipo de shell (por ejemplo, csh, sh,
bash, tcsh, etc.) y nos d un listado ordenado alfabticamente de los usuarios que tienen dicho tipo
de shell por defecto cuando abren un terminal. Dicha informacin del tipo de shell asignado a un
usuario se puede encontrar en el archivo /etc/passwd y para poder filtrar la informacin que nos
interesa nos ser til la orden siguiente:
#!/bin/bash
fi
done
cat temp.txt|sort
rm temp.txt
EJERCICIO 8
Dos rdenes frecuentes de Unix son tar y gzip. La orden tar permite almacenar/extraer varios
archivos de otro archivo. Por ejemplo, podemos almacenar el contenido de un directorio en un
archivo con
#!/bin/bash
#Nombre del script: cpback.sh
destino="CopiasSeguridad"
if [ $# -ge 1 ]
then
#Declaro una variable suma para saber si ha habido algun error, si uno
#de los parametros no existe..suma ya no valdra 0.
suma=0
for i in $@
do
if [ `test -e $i && echo 0 || echo 1` == 1 ]
then
suma=$[$suma + 1]
fi
done
EJERCICIO 9
Hacer un script en Bash denominado newdirfiles con los siguientes tres argumentos:
<dirname> Nombre del directorio que, en caso de no existir, se debe crear para alojar en el los
archivos que se han de crear.
<num_files> Nmero de archivos que se han de crear.
<basefilename> Ser una cadena de caracteres que represente el nombre base de los archivos.
* Dentro del directorio dado en el primer argumento, crear archivos cuyos contenidos estarn vacos y
cuyos nombres lo formarn el nombre dado como tercer argumento y un nmero que ir desde 01
hasta el nmero dado en el segundo argumento.
#!/bin/bash
#Nombre del fichero: newdirfiles
if [ $# -eq 3 ]
then
#Comprueba que el numero,parametro 2, sea del 1 al 99
num_files=$2
if [ `echo $num_files|grep "^[1-9][0-9]\?$"` ]
then
basefilename=$3
cd $dirname
else
echo "El numero ha de ser del 1 al 99"
fi
else
echo "Numero incorrecto de parametros"
fi
EJERCICIO 1
Indique cul ha sido el error introducido en el guion anterior y cmo se corregira.
#!/bin/bash
# Uso: pathmas directorio [after]
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)"
then
if [[ $2 == "after" ]] #<<<<<<<<<<<<< Faltaban dobles corchetes
then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
else
echo "$1 ya est en el path"
fi
___________________________
Para ejecutar este guin , el cual modifica la variable PATH, se ha de usar el comando "source", ya
que si no se pone la variable PATH cambiar en el shell hijo, no en el padre, y no notaremos cambio
alguno.
Ej:
EJERCICIO 2
Aplicar las herramientas de depuracin vistas en la seccin 2 para la deteccin de errores durante el
desarrollo de los guiones propuestos como ejercicios en la sesin 6.
Los guiones de la sesin 6 estn correctos, no ha hecho falta usar mtodos de depuracin,
en ciertos puntos donde he tenido dudas he puesto "echo" de determinadas variables para saber su
valor en ese punto del script y me ha bastado.
#!/bin/bash
#Cuento las lineas del fichero anterior y creo otra variable que sea ese numero
restandole 8, que son las 8 primeras lineas inutiles
numero_lineas=`cat monoloco|wc -l`
lineas_validas=$[ $numero_lineas - 8 ]
#Hago un tail de esas n lineas y ordeno por el campo 10(que indica el consumo de
memoria) y lo meto todo a otro archivo temporal
cat temporal|tail -n $lineas_validas|sort -k 10 > archivo
#Cojo la ultima linea de este nuevo fichero, que como est ordenado contendr el
proceso que ms memoria ocupa...y corto el campo que contiene el nombre, no sin
antes indicar con 'tr -s " " " "' que ignore los espacios que hay entre los campos
y los convierta en uno slo.
cat archivo|tail -n 1|tr -s " " " "|cut -d " " -f 13
EJERCICIO 4
Escribir un guion que escriba nmeros desde el 1 en adelante en intervalos de un segundo Cmo se
podra, desde otro terminal, detener la ejecucin de dicho proceso, reanudarlo y terminar
definitivamente su ejecucin?
#!/bin/bash
i=1
while true
do
printf "$i "
sleep 1
i=$[$i+1]
done
-Para parar este proceso desde otro terminal, se mira con "ps -aux" la lista de procesos completa,
buscamos el PID del que queremos parar y ponemos:
Ej:
Para reanudarlo:
Ej:
$ kill -CONT ps -A -o pid,cmd | grep nombre_guion | head -n 1 | cut -d " " -f 1
Para matarlo:
Ej:
$ kill -TERM ps -A -o pid,cmd | grep nombre_guion | head -n 1 | cut -d " " -f 1
EJERCICIO 5
Se puede matar un proceso que se encuentra suspendido? En su caso, cmo?
S, usando la orden "jobs" vemos un listado de los procesos en segundo plano y su estado.
Tambin se podra hacer desde otro terminal buscando el PID del proceso y haciendo "kill -9
PID_proceso".
EJERCICIO 6
Qu debemos hacer a la orden top para que nos muestre slo los procesos nuestros?
top -u nombre_usuario
EJERCICIO 1
Construir un guion para que borre las lneas en blanco de un archivo de texto. El guion deber
comprobar:
#!/bin/bash
if [ $# -eq 1 ]
then
es_archivo=`test -f $1 && echo true|| echo false`;
if [ $es_archivo == "true" ]
then
EJERCICIO 2
Construir un guion que inserte una lnea en blanco despus de un prrafo (lnea que finaliza en un
.. Hacer las comprobaciones pertinenes.
#!/bin/bash
if [ $# -eq 1 ]
then
es_archivo=`test -f $1 && echo true || echo false`;
if [ $es_archivo == "true" ]
then
while read linea
do
echo $linea >> temporal
if [[ `echo $linea | grep '\.$'` ]]
mv temporal $1
else
echo "No es un archivo regular"
fi
else
echo "Numero incorrecto de paramentros"
fi
EJERCICIO 3
Construir un guion del shell que realice la funcin bsica de la orden cat: muestre el contenido de
uno o varios archivos que se pasan como argumento(s). Si no se pasa ningn argumento, muestra lo
que se escriba en la entrada estndar.
#!/bin/bash
if [ $# -ge 1 ]
then
for i in $@
do
es_archivo=`test -f $i && echo true || echo false`;
if [ $es_archivo == "true" ]
then
printf "********************\n"
printf "Archivo $i\n"
printf "********************\n"
#!/bin/bash
if [ $# -eq 1 ]
then
es_archivo=`test -f $1 && echo true || echo false`;
if [ $es_archivo == "true" ]
then
columnas=`tput cols`
while read linea
do
ancho_linea=`echo $linea|wc -c`
espacios=$[ $[ $columnas - $ancho_linea ] / 2 ]
printf "%${espacios}s %s\n" "" "$linea"
done < $1
else
echo "No es un archivo regular"
fi
else
while read linea
do
echo $linea >> temporal
done
rm temporal
rm temporal2
fi
EJERCICIO 1
Pruebe a comentar en el archivo fuente main.cpp la directiva de procesamiento #include
funciones.h. La lnea quedara as: //#include funciones.h. Pruebe a generar ahora el mdulo
objeto con la orden de compilacin mostrada anterioremente. Qu ha ocurrido?
Indica que no sabe qe hacen esas funciones dado que no se ha incluido ninguna librera que las
contenga, porque hemos comentado la lnea.
EJERCICIO 2
Explique por qu el enlazador no ha podido generar el programa archivo ejecutable programa2 del
ejemplo anterior y, sin embargo, por qu s hemos podido generar el mdulo main2.o?
Porque no hemos incluido los objetos .o de las funciones del seno, coseno y tangente, los cuales
tambin se pueden incluir mediante una biblioteca, pero no la hemos incluido.
Hemos podido generar sin problemas el main.o porque tan slo llama a las dems funciones.
EJERCICIO 3
Explique por qu la orden g++ previa ha fallado. Explique los tipos de errores que ha encontrado.
Ha fallado porque hemos movido las libreras a otra carpeta, y la opcin -L./ especifica que debe
buscar las bibliotecas en la carpeta actual, y como ah no estn no encuentra la definicin de ninguna
funcin.
EJERCICIO 4
Escribir un guion que escriba nmeros desde el 1 en adelante en intervalos de un segundo Cmo se
podra, desde otro terminal, detener la ejecucin de dicho proceso, reanudarlo y terminar
definitivamente su ejecucin?
Se debe a que la orden make comprueba previamente si los archivos han sufrido modificaciones, o
sea comprueba dependencias.
EJERCICIO 5
Usando el ejemplo anterior de archivo makefile, sustituya la lnea de orden de la regla cuyo objetivo
es programa2 por una lnea en la que se use alguna de las variables especiales y que proporcione un
resultado equivalente.
EJERCICIO 7
Explique las dependencias que existen y cada una de las lneas del siguiente archivo makefile.
Enumere las rdenes que se van a ejecutar como consecuencia de ejecutar la utilidad make sobre l.
#Aqu definimos una regla que hace referencia a todos los objetos
all: $(OBJECT_MODULES) $(EXECUTABLE)
# Regla para obtener los archivos objeto .o que dependern de los archivos .cpp
# Aqu, $< y $@ tomarn valores respectivamente main.cpp y main.o y as
sucesivamente
.o: .cpp
$(CC) $(CPPFLAGS) $< -o $@
EJERCICIO 8
Con la siguiente especificacin de mdulos escriba un archivo makefile que automatice el proceso de
compilacin del programa final.
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECT_MODULES)
$(CC) $(CPPFLAGS) $^ -o programa #Si hubiera libreras iran aqu
ordenacion.o: ordenacion.cpp array.o
$(CC) $(CPPFLAGS) -c $^
array.o: array.cpp
$(CC) $(CPPFLAGS) -c $^
impresion.o: impresion.cpp
$(CC) -I$(INCLUDE_DIR) $(CPPFLAGS) -c $^
Clean:
rm *.o $(EXECUTABLE)
EJERCICIO 1
Compile los archivos main.cpp factorial.cpp hello.cpp y genere un ejecutable con el nombre
ejemplo1. Lance gdb con dicho ejemplo y ejectelo dentro del depurador. Describa la informacin
que ofrece.
EJERCICIO 2
Usando la orden list muestre el cdigo del programa principal y el de la funcin factorial (para ello
utilice la orden help list).
EJERCICIO 3
Ponga varios puntos de ruptura en las zonas marcadas en el cdigo fuente con /* break */. Muestre
informacin de todas las variables que se estn usando en cada detencin. Muestre la informacin
del contador de programa y el de la pila (para ello utilice el valor del registro $sp en lugar del $cp).
(gdb) break 47
Punto de interrupcin 2 at 0x804862b: file main.cpp, line 47.
(gdb) continue
Continuando.
EJERCICIO 4
Imprima el valor de las variables final1 y final2 del programa anterior en los puntos de ruptura
correspondientes. Copie el contenido del ensamblador de la zona depurada.
(gdb) continue
Continuando.
EJERCICIO 6
Realice las acciones del ejercicio 3 y las del ejercicio 5 en un guion y ejectelas de nuevo mediante la
opcin -x de gdb. Sabra decir qu hace este programa con la variable final2?
/*guion.mdb*/
break 14
run
info locals
p/x $pc
p/x $ps
break 30
n
info locals
p/x $pc
p/x $ps
break 43
n
info locals
p/x $pc
p/x $ps
break 47
n
info locals
p/x $pc
p/x $ps
delete breakpoint 2 3 4
La variable final2 vale 100 veces la funcin cuenta(), la cual en cada iteracin suma 2 a la variable.
EJERCICIO 7
Realice la depuracin del programa ejecutable obtenido a partir del archivo fuente ej1.cpp. Averige
qu sucede y por qu no funciona. Intente arreglar el programa.
#include <stdlib.h>
/*
*/
float suma (float x, float y) //Han de ser float para que no se pierda la
precisin
float tmp;
tmp = x + y;
return tmp;
int i;
tmp = 0;
return tmp;
float final;
final = sumatoria(vector, 15); //El segundo parametro debe ser como mximo
el tamao del vector
return 0;
EJERCICIO 1
Compile el programa main.cpp y genere un ejecutable con el nombre ejemplo1. Ejecute gdb con
dicho ejemplo y realice una ejecucin depurada mediante la orden run. Aada un punto de ruptura
(breakpoint) en la funcin cuenta (tal y como se muestra en el ejemplo anterior). Realice 10 pasos de
ejecucin con step y otros 10 con next. Comente las diferencias.
(gdb) run
Starting program: /home/superjes/ejemplo1
6
Ejecuta la siguiente lnea de programa. Si es una funcin, ejecuta la funcin entera (no entra en ella).
EJERCICIO 2
Depure el programa del ejercicio 1. Introduzca un punto de ruptura (breakpoint) dentro de la funcin
cuenta. Muestre la informacin del marco actual y del marco superior, vuelva al marco inicial y
compruebe si ha cambiado algo.
EJERCICIO 3
Ponga un punto de ruptura en la lnea 30 del programa (funcin multiplica) de tal forma que el
programa se detenga cuando la variable final llegue a 8. Compruebe si se detiene o no y explique por
qu.
EJERCICIO 4
Pruebe el ejemplo y ejectelo despus un continue, imprima el valor de la variable tmp. Explique por
qu el valor no es 12.
La variable "tmp" es variable interna de la funcin cuenta(int y) y su valor es la asignacin del valor
de la varible "y" ms dos, por lo que aunque cambiemos el valor de "tmp", en la siguiente llamada a
la funcin se le asignar otro valor independiente al anterior.
EJERCICIO 5
Compile el programa ej2.cpp como ej2 aadiendo el flag de depuracin. Ejectelo en una shell.
Mientras, en otra shell ejecute el depurador con el programa ej2 que se est ejecutando en estos
momentos en la shell anterior. Utilice las rdenes de gdb para hacer que el programa que se est
ejecutando se detenga. Escriba todo los pasos que haya realizado.
EJERCICIO 6
Utilizando las herramientas de depuracin de GDB, corrija todos los errores del programa anterior.
Escriba todos los pasos que haya realizado.