You are on page 1of 10

EJERCICIOS DE SHELL-SCRIPTS RESUELTOS LA MAYORÍA.

1.- Escribir un Shell-script llamado tabla que pida un número


por teclado (del 1 al 10) y muestre su tabla de multiplicar de
ese número, según el siguiente formato:
Tabla a repasar: 4
4x1=4
4x2=8
4x3=12, etc
#!/bin/bash
echo “Introduzca un nº(entre 1 y 10):
read num
i=1
while [ $i –le 10 ]
do
echo “$num x $i = ”`expr $num “*” $i`
done
2.- Escribir un shell-script denominado fileodir que
compruebe que el parámetro que se le ha pasado es un fichero
y en caso afirmativo muestre su contenido. Si el
parámetro es un directorio deberá mostrar los ficheros
que contiene. También, debe aceptar más de un
parámetro.
#!/bin/bash
for i in $*
do
if [ -f $i ]
then
cat $i
elif [ -d $i ]
then
cd $i
ls –al
fi

1
done
3.- Escribir un shell-script llamado sesion que se ejecute
en segundo plano y finalice su ejecución cuando exista más
de dos sesiones abiertas en el sistema por el usuario que
se pase como parámetro. Al finalizar el script, éste deberá
mandar un mensaje a todas las consolas y terminales donde
root inició una sesión con el siguiente mensaje:
“El usuario <user> acaba de iniciar una sesión
en el sistema”
donde <user> es el usuario pasado como parámetro
#!/bin/bash
if [ ps -e
4.- Escribir un shell-script llamado datos, al que se le pase un
archivo de texto desde la línea de comandos y una opción. Si
el archivo no existe lo crea conteniendo la fecha actual y el
login (nombre de inicio de sesión) del usuario que ejecuta el
script con los siguientes permisos rw- r-rw. Si el archivo
existe, mostrará un mensaje según una de las siguientes
opciones:
./datos [opción] archivo.txt
-n: el número de lineas del archivo
Ej: archivo.txt (24 líneas)
-p: los permisos del archivo
Ej: archivo.txt permiso: -rwx r- r-
-t: el contenido del archivo ordenado

Si el archivo no existe, deberá mostrar un mensaje por Ej:


El archivo < archivo.txt> no existe
donde archivo.txt es el archivo pasado como parámetro
Nota: Se supone que el archivo debe estar en el directorio
home del usuario

5.- Dado el siguiente archivo personas.txt


Ana;Perrrrrrrales;1000
Pedro;Soria;1600

2
Jacinto;Manzano;500
Claudia;Pastor;600
Xavier;Granados;1000
Soraya;Annnnnnnneja;3000
Xavier;Guerra;4500
Sara;Siria;675
Pablo;Serrano;1000
Sonia;Mono;1600
a.- Guarda en el fichero personas2.txt las personas cuyo
nombre empiece por J y S.
grep "^J" personas.txt > personas2.txt
grep "^S" personas.txt >> personas2.txt
b.- Quita aquellas personas cuyos nombres no empiezan por S
y cópialas en un archivo denominado personas3.txt
grep -v "^S" personas.txt > personas3.txt
grep ^[^S] personas.txt > personas3.txt
c.- Ordena las personas por su sueldo
sort -n -t\; -k3 personas.txt
d.- Ordena las personas por el tercer carácter de su apellido
sort -t\; -k2.3 personas.txt
e.- Muestra ordenada las personas que cobran 1000 euros.
grep 1000 personas.txt | sort
f.- Indica cuántas personas comienza su apellido por S.
cut -d\; -f2 personas.txt | grep "^S" | wc -l
g.- Borra las letras que sean repetidas
tr -s [A-Z] < personas.txt | tr -s [a-z]
h.- Sustituye los nombres llamados Xavier por Javier.
sed 's/Xavier/Javier/' personas.txt
i.- Guarda en un archivo llamado personas4.txt desde la 4ª
hasta la 8ª persona.
head -n8 personas.txt | tail –n5>personas4.txt #
4,5,6,7,8. 5 en total
j.- Los sueldos de 1000 euros han aumentado a 1200.
Cámbialos.

3
sed 's/1000/1200/g' personas.txt
k- Buscar todos los archivos que hay en el directorio actual y
en sus subdirectorios con extensión .txt y tienen permisos de
lectura y escritura.
find . -name "*.txt" -perm /u+rw,g+rw,o+rw
find . -name "*.txt" -perm 666
l.- -Cuenta el número de ficheros y directorios que existen en
el home (directorio personal) del usuario.
find $HOME -type d | wc -l
find $HOME -type f | wc -l
find $HOME -maxdepth 1 -type d | wc -l
find $HOME -maxdepth 1 -type f | wc -l
m.- Borra los ficheros que comiencen con p en el directorio
actual y en todos sus subdirectorios
find -name "p*" -exec rm {} \;
n.- Mueve los ficheros que contienen en su nombre el texto
mp3 al home del usuario.
find -name "*mp3*" -exec mv {} $HOME \;
o.- Quita los blancos de los nombres de los ficheros del
directorio home. dado un directorio como parámetro
find $HOME -name "*.txt" | tr -d " "
find $HOME -name "*.txt" | sed 's/ //'
6.- Escribir un Shell-script llamado copia que reciba un
directorio como primer parámetro, y a continuación una lista
de ficheros. El script debe validar que los parámetros recibidos
sean realmente ficheros y luego copiarlos al directorio
recibido. Además debe comprobar que exista el fichero
original y no la copia.
#!/bin/bash
if [ -d $1 ] # si es directorio
then
for i in $*
do
if [ -f $i ]
then
cp $i $1

4
else
echo “$i no es un fichero”
fi
done
else #si el primer parám. no es directorio, error
echo “$1 no es un directorio”
fi
7.- Escribir un Shell-Script llamado lectura que genera un
fichero llamado listaficheros que contenga los ficheros
con permiso de lectura que haya en un directorio pasado como
parámetro. El nombre del fichero debe incluir en su nombre la
fecha y la hora, es decir listaficheros09-11-2010-18:00
#!/bin/bash
if [ -d $1 ]
then
echo “lista de ficheros del directorio $1”>listaficheros$
(date +%d-%m-%Y-%H:%M)
for i in $1/*
do
ls –al $i>>listaficheros$(date +%d-%m-%Y-%H:%M)
done
else
echo “$1 no es un directorio”
fi
8.- Escribir un Shell-Script llamado busca que, partiendo del
fichero generado en el ejercicio anterior, muestre todos los
ficheros que contengan una palabra pasada como parámetro.
#!/bin/bash
cat listaficheros*|grep $1 ]

5
9.- Escribir un Shell-script llamado cuenta que cuente cuántos
ficheros y cuántos directorios hay en el directorio pasado
como argumento
#!/bin/bash
if [ -d $1 ]
then
directorios=0
ficheros=0
for i in $1/*
do
if [ -d $i ]
then
directorios=`expr $directorios “+” 1`
else
ficheros=`expr $ficheros “+” 1`
fi
done
echo “ficheros= $ficheros”
echo “directories= $directorios”
else
echo “$1 no es ningún directorio”
fi

10.- Escribir un Shell-Script llamado lineas que muestre el


fichero del directorio pasado como parámetro con más líneas.
#!/bin/bash
if [ -d $1 ]
then
linMuestra=0
linActual=$linMuestra
fichero=””
for i in $1/*
do

6
if [ -f $i -a -r $i ]
then
linActual=`wc -l $i |awk '{print
$1}'`
if [ $linActual -gt $linMuestra ]
then
linMuestra=$linActual
fichero=$i
fi
fi
done
echo "el fichero con más líneas es $fichero y
tiene $linMuestra líneas"
else
echo "$1 no es ningún directorio”
fi
11.- Escribir un Shell-Script llamado compara que compare
dos archivos (que se reciben como parámetro) y diga por
pantalla cuál de ellos tiene mayor cantidad de líneas.
#!/bin/bash
if [ $# -eq 2 -a -f $1 -a -f $2 ]
then
echo $1
echo $2
primero=`wc -l $1 |tr -s " " |cut -d" " -f1`
segundo=`wc -l $2 |tr -s " " |cut -d" " -f1`
echo $primero
echo $segundo
if [ $primero -gt $segundo ]
then
echo “$1 tiene más líneas que $2”
else
echo “$2 tiene más líneas que $1”

7
fi
else
echo "./compara.sh archivo1 archivo2”
fi
12.- Crea un shell script que calcule la media de todos los números
recibidos como parámetro.
Nota: Comprobar que los parámetros son números.
#!/bin/bash
total=0
for i in $*
do
variable=`echo $i |grep –e [:alpha:]`
if [ “$variable” = “” ]
then
total=`expr $total “+” $i`
else
echo “$i no es numérico”
fi
done
media=`expr Stotal \/ $#`
echo “La media es $media”
13.- Crea un script que reciba un directorio como primer parámetro, y a
continuación una lista de archivos. El script debe validar que los
parámetros recibidos sean realmente archivos (y que existen) y luego
copiarlos al directorio recibido.

14.- Desarrolla un script que reciba como parámetro un directorio.


Verificar que el mismo existe y devolver la suma de los tamaños de todos
los archivos (en kilobytes) que se encuentran en ese directorio.
#!/bin/bash
if [-d $1 ]
then
tamanos=`ls -l $1 | tr -s " " | cut -d" " -f5`
//tamanos: lista tamaño archivos
total=0 //total: suma tamaños

8
for i in $tamanos
do
total=`expr total + $i`
done
totalkb=`expr total / 1024`
echo $totalkb
fi

15.- Realizar un script que espere hasta que un determinado proceso se


ejecute, y cuando este proceso se ejecuta, matarlo. Cuando ocurra tal
evento, deberá mandar un mensaje a root informando de tal evento.
Nota: No se puede usar el comando killall.
#!/bin/bash
if [ $# -eq 1 ]
then
while [ 1 ]
do
proceso=`ps -e | grep $1 | tr -s " " | cut
-d" " -f2` //busca proceso
if [ $? -eq 0 ]
then
kill -9 $proceso
nombre_proceso=`ps -e | grep $1 | tr
-s " " | cut -d" " -f5`
echo "$nombre_proceso:$proceso:`date
+%D`:`date +%R`" >> /var/log/mata.log
fi
done
fi

16.- Realizar un Shell-script que realice una copia de seguridad de los


directorios /etc, y /var. La copia de seguridad se denominará backup-mes-
día-año.tar.gz y se almacenará en un dispositivo removible (por ejemplo
un pendrive o memorystick)

9
Este script se deberá ejecutar todos los días a partir de las 12 de la noche
(la mejor hora para realizar las copias).
Por ejemplo, si realizaras la copia de seguridad el 7 de diciembre, se
denominaría backup-07-12-10.tar.gz
Nota: Para montar y desmontar dispositivos removibles deberás ejecutar
el siguiente comando:
mount -t vfat /dev/sdb1 /media/disk
umount /media/disk

17.- Realizar un Shell-script que muestre la información sobre las cuentas


de usuario que contiene un fichero pasado como argumento. Las filas del
fichero contendrán un nombre en cada fila. En el caso de que una cuenta
de usuario no exista, deberá mostrar un mensaje de error y su directorio
personal. La información se almacenará en un archivo con el siguiente
formato:
login:nombre_grupo:directorio_personal:shell

Por Ejemplo: Si el usuario fuera JRGonzalez, está incluido en el grupo de


los contables, su directorio personal es /home/JRGonzalez y su shell
/bin/bash, deberá mostrar el siguiente mensaje.
JRGonzalez:contables:/home/JRGonzalez:/bin/bash
Nota: Los ficheros con los que tienes que trabajar para desarrollar este
script son /etc/passwd (usuarios del sistema) y /etc/group (grupos del
sistema).

10

You might also like