ejercicios de shellresueltos

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 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 1

Upload: josemi123456

Post on 27-Jun-2015

3.935 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: EJERCICIOS DE SHELLResueltos

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: 44x1=44x2=84x3=12, etc

#!/bin/bashecho “Introduzca un nº(entre 1 y 10):read numi=1while [ $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/bashfor i in $*do

if [ -f $i ]then

cat $ielif [ -d $i ]then

cd $ils –al

fidone

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

1

Page 2: EJERCICIOS DE SHELLResueltos

if [ ps -e4.- 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 archivoEj: archivo.txt (24 líneas)

-p: los permisos del archivoEj: 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ámetroNota: Se supone que el archivo debe estar en el directorio home del usuario

5.- Dado el siguiente archivo personas.txt Ana;Perrrrrrrales;1000Pedro;Soria;1600Jacinto;Manzano;500Claudia;Pastor;600Xavier;Granados;1000Soraya;Annnnnnnneja;3000Xavier;Guerra;4500Sara;Siria;675Pablo;Serrano;1000Sonia;Mono;1600

a.- Guarda en el fichero personas2.txt las personas cuyo nombre empiece por J y S.grep "^J" personas.txt > personas2.txtgrep "^S" personas.txt >> personas2.txtb.- Quita aquellas personas cuyos nombres no empiezan por S y cópialas en un archivo denominado personas3.txtgrep -v "^S" personas.txt > personas3.txtgrep ^[^S] personas.txt > personas3.txtc.- Ordena las personas por su sueldosort -n -t\; -k3 personas.txtd.- Ordena las personas por el tercer carácter de su apellidosort -t\; -k2.3 personas.txte.- Muestra ordenada las personas que cobran 1000 euros.

2

Page 3: EJERCICIOS DE SHELLResueltos

grep 1000 personas.txt | sortf.- Indica cuántas personas comienza su apellido por S.cut -d\; -f2 personas.txt | grep "^S" | wc -lg.- Borra las letras que sean repetidastr -s [A-Z] < personas.txt | tr -s [a-z]h.- Sustituye los nombres llamados Xavier por Javier.sed 's/Xavier/Javier/' personas.txti.- 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 totalj.- Los sueldos de 1000 euros han aumentado a 1200. Cámbialos.sed 's/1000/1200/g' personas.txtk- 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+rwfind . -name "*.txt" -perm 666l.- -Cuenta el número de ficheros y directorios que existen en el home (directorio personal) del usuario.find $HOME -type d | wc -lfind $HOME -type f | wc -lfind $HOME -maxdepth 1 -type d | wc -lfind $HOME -maxdepth 1 -type f | wc -lm.- 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ámetrofind $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/bashif [ -d $1 ] # si es directorio then

for i in $*do

3

Page 4: EJERCICIOS DE SHELLResueltos

if [ -f $i ]then

cp $i $1else

echo “$i no es un fichero”fi

doneelse #si el primer parám. no es directorio, error

echo “$1 no es un directorio”fi7.- 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/bashif [ -d $1 ]then

echo “lista de ficheros del directorio $1”>listaficheros$(date +%d-%m-%Y-%H:%M) for i in $1/*

dols –al $i>>listaficheros$(date +%d-%m-%Y-%H:%M)

doneelse

echo “$1 no es un directorio”fi8.- 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/bashcat listaficheros*|grep $1 ]

4

Page 5: EJERCICIOS DE SHELLResueltos

9.- Escribir un Shell-script llamado cuenta que cuente cuántos ficheros y cuántos directorios hay en el directorio pasado como argumento#!/bin/bashif [ -d $1 ]then

directorios=0ficheros=0for i in $1/*do

if [ -d $i ]then

directorios=`expr $directorios “+” 1`else

ficheros=`expr $ficheros “+” 1`fi

doneecho “ficheros= $ficheros”echo “directories= $directorios”

elseecho “$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/bashif [ -d $1 ]then

linMuestra=0linActual=$linMuestrafichero=””for i in $1/*do

if [ -f $i -a -r $i ]then

linActual=`wc -l $i |awk '{print $1}'`

if [ $linActual -gt $linMuestra ]then

linMuestra=$linActualfichero=$i

fifi

done

5

Page 6: EJERCICIOS DE SHELLResueltos

echo "el fichero con más líneas es $fichero y tiene $linMuestra líneas" else

echo "$1 no es ningún directorio”fi11.- 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/bashif [ $# -eq 2 -a -f $1 -a -f $2 ]then

echo $1echo $2primero=`wc -l $1 |tr -s " " |cut -d" " -f1`segundo=`wc -l $2 |tr -s " " |cut -d" " -f1`echo $primeroecho $segundoif [ $primero -gt $segundo ]then

echo “$1 tiene más líneas que $2”else

echo “$2 tiene más líneas que $1”fi

elseecho "./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/bashtotal=0for i in $*do

variable=`echo $i |grep –e [:alpha:]` if [ “$variable” = “” ]

then total=`expr $total “+” $i`

elseecho “$i no es numérico”

fidonemedia=`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

6

Page 7: EJERCICIOS DE SHELLResueltos

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/bashif [-d $1 ]then

tamanos=`ls -l $1 | tr -s " " | cut -d" " -f5` //tamanos: lista tamaño archivos

total=0 //total: suma tamañosfor i in $tamanosdo

total=`expr total + $i`donetotalkb=`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/bashif [ $# -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.logfi

donefi

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)

7

Page 8: EJERCICIOS DE SHELLResueltos

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/diskumount /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/bashNota: Los ficheros con los que tienes que trabajar para desarrollar este script son /etc/passwd (usuarios del sistema) y /etc/group (grupos del sistema).

8