Enunciados y soluciones ejercicios de scripts Linux

Script1

Crea un script que muestre el valor de 6 variables de entorno, de la forma

La variable LOGNAME tiene el valor XXX

#!/bin/bash
#Crea un script que muestre el valor de 6 variables de entorno, de la forma
#La variable LOGNAME tiene el valor XXX
clear
echo "La variable LOGNAME tiene el valor" $LOGNAME 
echo "La variable HOME tiene el valor" $HOME
echo "La variable SHELL tiene el valor" $SHELL
echo "La variable PWD tiene el valor " $PWD
echo "La variable USER tiene el valor" $USER
echo "La variable SSH_TTY tiene el valor" $SSH_TTY

script2_mensaje

Pide un usuario y un mensaje y envía el mensaje a dicho usuario

#!/bin/bash
clear
echo -n "usuario: "
read usuario
echo -n mensaje:
read mensaje

# REDIRECCIONAMIENTOS
echo $mensaje>mensaje.txt
write $usuario>mensaje.txt

# FILTROS

echo $mensaje | write $usuario

script3_parametros

Muestra un mensaje indicanco

El parámetro $1 es XX

El parámetro $2 es YY

Ejemplo ejecución: ./script3_paramentros uno dos tres

El parámetro $1 es uno

#!/bin/bash
#Muestra un mensaje indicando
#El parámetro $1 es XX
#El parametro $2 es YY

echo El parámetro '$1' es $1
echo El parametro '$2' es $2
echo El parametro '$3' es $3
echo El parametro '$4' es $4
echo El parametro '$5' es $5
echo El parametro '$6' es $6
echo El parametro '$7' es $7
echo El parametro '$8' es $8
echo El parametro '$9' es $9
echo Numero de parametros $#
echo Todos los parametros $*
echo Nombre de archivo $0

script4_notas

Pide una nota numérica y muestra la correspondiente alfabética

#!/bin/bash
#Pide una nota numerica y muestra la correspondiente alfabética
clear
echo -n "Introduce una nota: "
read nota

if [ $nota -ge 9 ]
then
        echo "sobresaliente"
elif [ $nota -ge 7 ]
then
        echo "notable"
elif [ $nota -ge 6 ]
then
        echo "bien"
elif [ $nota -ge 5 ]
then
        echo "suficiente"
else
        echo "Insuficiente"
fi

script5_tipoarchivo

Pide un archivo y me indica el tipo de archivo que es si tiene los permisos de r,w, x

Ejemplo: ./script5_tipoarchivo

Archivo: /dev/sda

El archivo /dev/sda existe

Es un archivo especial de bloques

Tiene el permiso de escritura

Tiene el permiso de ejecución

#!/bin/bash
clear
echo -n "Archivo: "
read archivo

# EXISTE
if [ -e $archivo ]
then
	echo "El archivo" $archivo "existe"
	# TIPO DE ARCHIVO
	if [ -b $archivo ]
	then
        	echo "Es un archivo especial de bloques"
	elif [ -c $archivo ]
	then
        	echo "Es un archivo de caracteres"
	elif [ -d $archivo ]
	then
        	echo "Es un directorio"
	elif [ -f $archivo ]
	then
        	echo "Es un fichero ordinario"
	elif [ -h $archivo ]
	then    
        	echo "Es un archivo simbólico"
	fi
	# PERMISOS
	if [ -r $archivo ]
	then
        	echo "Tiene permiso de lectura"
	fi
else
	echo "El archivo no existe"
fi

script6_cadena
Pide dos cadenas, e indica
Si la cadenaX (NO) está vacía
Y compara ambas cadenas

#!/bin/bash
#pide dos cadena, e indica
#Si la cadenaX (NO) está vacia
#Y compara ambas cadenas
clear
echo -n "Indica la primera cadena: "
read cadena1
echo -n "Indica la segunda cadena: "
read cadena2

if [ -z $cadena1 ]
then
        echo "La cadena1 esta vacia"
else
        echo "La cadena1 NO esta vacia"
fi
if [ -z $cadena2 ]
then
        echo "La cadena2 esta vacia"
else
        echo "La cadena2 NO esta vacia" 
fi
if [ "$cadena1" == "$cadena2" ]
then
       echo "Las cadenas son iguales"
else
        echo "Las cadenas NO son iguales"
fi

script7_notas
Igual que ejercicio4 pero utilizando el case

script8_numeros

Pide números hasta que se pulse el 999, y finalmente me indica si quiero ver los números introducidos. (hacer con while y con until)

  • Si indico que sí, me pregunta (O)rden establecido, (A)scendente, (D)escendente
#!/bin/bash
# Pide números hasta que se pulse el 999, y finalmente
# me indica si quiero ver los números introducidos.
# Si indico que si, me pregunta (O)rden establecido,
# (A)scendente, (D)escendente
clear
num=0
until [ $num -eq 999 ]
do
        echo -n "Número: "
        read num
	if [ $num -ne 999 ]
        then
                echo $num >> numeros.txt
        fi
done

echo -n "¿Quieres ver los números introducidos?(s/n) "
read res
if [ $res == "s" -o $res == "S" ]
then
	echo -n "¿Orden estalbecido, ascendente o descentente?(o/a/d) "
	read orden
	case $orden
	in
		o|O)
        	cat numeros.txt;;
		a|A)
		cat numeros.txt | sort -n;;
		d|D)
		cat numeros.txt | sort -n -r;;
		*)
		echo Opción no válida;;
	esac
fi
rm numeros.txt
echo "Gracias por utilizarnos"

script9_ficheros
Pide una extensión de fichero y muestra :
Nombre fichero
contenido fichero
Muestra separador ======

#!/bin/bash
clear
echo -n "Extension del fichero: "
read extension
for fichero in *.$extension
do
        echo "Nombre de fichero: " $fichero
        cat $fichero
        echo ==================================
done

script10_operaciones

Necesita dos parámetros que son dos números

– comprobar que se han puesto dos y solo dos, en caso contrario, indicar mensaje correspondiente:

– ningún parámetro -> Quiere introducirlos ahora s/n

– 1 parámetro->quiere introducir el otro s/n

– >2 parámetros–> demasiados parámetros, utilizaremos los 2 primeros

2 -> CORRECTO

Realiza las 4 operaciones básicas

#!/bin/bash
clear

case $#
in
	0) 
	echo No ha introducido ninguno
	echo -n "Quiere ahora s/n?"
	read resp
	if [ $resp == "s" ]
	then
		echo -n Num1:  
		read num1
		echo -n Num2: 
		read num2
		echo HAGO OPERACIONES
	else
		exit 1 # no pongo nada
	fi;;
	1)
		echo Ha introducido uno
	        echo -n "Quiere ahora s/n?"
        read resp
        if [ $resp == "s" ]
        then
                echo -n Num2: 
                read num2
		num1=$1
                echo HAGO OPERACIONES
        else
                exit 2 # pongo solo 1
        fi;;
	2)
		num1=$1
		num2=$2
		echo HAGO OPERACIONES;;
	*)
		num1=$1
		num2=$2
		echo Demasiados parametros, cojo 2 primeros
		echo HAGO OPERACIONES;;
esac
echo $num1 + $num2 = $(($num1 + $num2))
# y así el resto de operaciones

script11_concurso
Realiza la pregunta 2+2? tres veces e indica Correcto, si acierta, o te quedan X intentos si no acierta.

#! /bin/bash
clear
intentos=1
quedan=3
while [ $quedan -gt 0 ]
do
	echo -n 2+2?:
	read result
	if  [ $result -eq 4 ]
	then
		echo CORRECTO, acertado en intento $intentos
		exit
	else
		quedan=$(($quedan - 1))
		if [ $quedan -ne 0 ]
		then
			echo Te quedan $quedan intentos
		fi
	intentos=$(($intentos + 1))
	fi
done
echo Game Over

script12_concurso2
Realiza 3 preguntas e indica al final el número de aciertos
2+2?, 3+3?, 4+4?
Inicialmente, pide nombre de jugador
y al final inserta jugador y aciertos en un fichero (va añadiendo jugadas cada vez que juega un jugador).
Al final pregunta si quiero ver el fichero s/n?
– si contesta que sí, ordenado por nombre o puntuación?
– no, termina el programa

script13_concurso3

Dado el siguiente fichero pregyresp.txt, comprobar el número de aciertos correspondientes

2+2?;4

3+3?;6

4×4?;16

3-1?;2

#!/bin/bash
clear
totlin=`cat pregyresp.txt | wc -l`
linea=1
aciertos=0
while [ $linea -le $totlin ]
do
	echo -n `head -n$linea pregyresp.txt | tail -n1 | cut -d";" -f 1`
	read respuesta
	rfichero=`head -n$linea pregyresp.txt | tail -n1 | cut -d";" -f 2`
        if [ $respuesta -eq $rfichero ]
	then
		aciertos=$(($aciertos + 1))
	fi
	linea=$(($linea + 1))
done
echo "Tienes $aciertos aciertos"

script14_concurso4

Dado los siguientes ficheros preg.txt y resp.txt, comprobar el número de aciertos correspondientes

preg.txt

2+2?

3+3?

4+4?

resp.txt

4

6

8

#!/bin/bash
clear
totlin=`cat preg.txt | wc -l`
linea=1
aciertos=0
while [ $linea -le $totlin ]
do
	echo -n `head -n$linea preg.txt | tail -n1`
	read respuesta
	rfichero=`head -n$linea resp.txt | tail -n1`
        if [ $respuesta -eq $rfichero ]
	then
		aciertos=$(($aciertos + 1))
	fi
	linea=$(($linea + 1))
done
echo "Tienes $aciertos aciertos"

script15_concurso5

Dado el siguiente fichero pregyresp2.txt, comprobar el número de aciertos correspondientes

2+2?
4
3+3?
6
4×4?
16
3-1?
2

#!/bin/bash
#Dado el siguiente fichero pregyresp2.txt comprobar el numero de aciertos
clear
tot=`cat pregyresp2.txt | wc -l`
linea=1
lineap=2
aciertos=0
while [ $linea -le $tot ]
do
        echo -n `head -n$linea  pregyresp2.txt | tail -n1`
        read respuesta
        rfichero=`head -n$lineap pregyresp2.txt | tail -n1`
        if [ $respuesta -eq $rfichero ]
        then
                aciertos=$(($aciertos + 1))
        fi
        linea=$(($linea + 2))
	lineap=$(($lineap + 2))
done
echo "Tienes $aciertos aciertos"

script16_concurso6
A partir de un fichero pregyresp3.txt, indicar el número de aciertos
pregyresp3.txt
P1.2+2?
P2.3+3?
R1.4
P3.5X5?
R3.25
R2.6

#!/bin/bash
clear
tot=`cat pregyresp3.txt | wc -l`
tot=$(($tot/2))
linea=1
aciertos=0
while [ $linea -le $tot ]
do
        grep "P$linea" pregyresp3.txt |cut -d "." -f2
        read respuesta
        rfichero=`grep "R$linea" pregyresp3.txt | cut -d "." -f2`
        if [ $respuesta -eq $rfichero ]
        then
                aciertos=$(($aciertos + 1))
        fi
        linea=$(($linea + 1))
done
echo "Tienes $aciertos aciertos"

script17_union
A partir de 2 ficheroS de la forma
f1.txt
BETIS,VILLAMARIN
SEVILLA,SANCHEZ PIZJUAN

f2.txt
BLANCA Y ROJA;SEVILLA
VERDE Y BLANCA;BETIS

Crear automáticamente el fichero union.txt
BETIS;VERDE Y BLANCA;VILLAMARIN
SEVILLA;BLANCA Y ROJA;SANCHEZ PIZJUAN

 
!/bin/bash
clear
rm union.txt
totlin=`cat f1.txt|wc -l`
rec=1
while [ $rec -le $totlin ]
do
        equipo=`head "-n$rec" f1.txt | tail -n1| cut -d "," -f1`
        estadio=`head -n$rec  f1.txt| tail -n1| cut -d "," -f2`
        color=`grep "$equipo" f2.txt| cut -d ";" -f1`
        echo "$equipo;$color;$estadio">>union.txt
        rec=$(($rec+1))
done

 

script18_agenda
A partir del fichero agenda.txt de la forma
nombresocio,provincia,localidad,codigosocio, realizar un script que
“1.Ver socio”
“2.Gestionar”
“3.Salir”
“Elige una opción:”

y en la opción 2
“1.Insertar socio”
“2.Eliminar socio”
“3.Modificar”
“4.Salir”
“Elige una opción:”
como el visto en clase, que en cada caso compruebe que el socio a buscar,insertar,eliminar o modificar exista o no en el fichero antes de realizar cualquier opción. (Suponemos nombredelsocio como clave primaria)

 
#!/bin/bash
clear
x=0
while [ $x -ne 3 ]
do
	echo " "
	echo "1.Ver socio"
	echo "2.Gestionar"
	echo "3.Salir"
	echo -n "Elige una opción:"
	read x
	if [ $x -eq 1 ]
	then
		echo -n "Dime el socio:"
		read socio
		comprueba=`grep -i $socio agenda.txt|wc -l`
		if [ $comprueba>0 ]
		then
			grep -i $socio agenda.txt
		else
			echo "No existe ese socio"
		fi
	elif [ $x -eq 2 ]
	then
		y=0
		while [ $y -ne 4 ]
		do
			echo " "
			echo "1.Insertar socio"
			echo "2.Eliminar socio"
			echo "3.Modificar"
			echo "4.Salir"
			echo -n "Elige una opción:"
			read y
			if [ $y -eq 1 ]
			then
				echo "Dime el socio:"
				read socio
				consulta=`grep -i $socio agenda.txt|wc -l`
				if [ $consulta -eq 0 ]
				then
					echo -n "Dime el nombre de su provincia"
					read provincia
					echo -n "Dime su localidad:"
					read localidad
					echo -n "Dime su código:"
					read codigo
					echo "$socio,$provincia,$localidad,$codigo">>agenda.txt
				else
					echo "Ya existe un socio con ese código"
				fi
			elif [ $y -eq 2 ]
			then
				echo -n "Dime el socio:"
		       		read socio1
			        consulta=`grep -i $socio1 agenda.txt|wc -l`
				if [ $consulta -eq 1 ]
			        then
		      			grep -v $socio1 agenda.txt>agenda.temp
					mv agenda.temp agenda.txt
					echo "Realizado"
			        else
			                echo "No existe un socio con ese código"
		       		 fi
			elif [ $y -eq 3 ]
			then
				echo -n "Dime el socio:"
				read socio
				consulta=`grep -i $socio agenda.txt| wc -l`
				if [ $consulta -eq 1 ]
				then
					grep -v $socio agenda.txt>agenda.temp
					mv agenda.temp agenda.txt
					echo -n "Dime su provincia"
					read provincia
					echo -n "Dime su localidad:"
					read localidad
					echo -n "Dime su codigo:"
					read codigo
					echo "$socio,$provincia,$localidad,$codigo">>agenda.txt
				else
					echo "No existe ese socio"
				fi
			fi
		done
	fi
done

script19_puntos
A partir de un fichero puntuaciones.txt de la forma

ALONSO,12
VETTEL,10
HAMILTON,3

Me lee dicho fichero y me indica que introduzca su puntuación en esta carrera.

Por ejemplo
Puntos de ALONSO:__
Puntos de VETTEL:__
Puntos de HAMILTON:__

 
#!/bin/bash
clear

tot=`cat puntuaciones.txt | wc -l`
linea=1

while [ $linea -le $tot ]
do
	jugador=`head -n$linea puntuaciones.txt | tail -n1 | cut -d "," -f1`
	echo -n "Puntos de $jugador: "
	read puntos
	puntosantiguos=`head -n$linea puntuaciones.txt | tail -n1 | cut -d "," -f2`
	puntosnuevos=$(($puntosantiguos+$puntos))
	echo "$jugador,$puntosnuevos" >> puntuaciones.temp
	linea=$(($linea+1))
done

mv puntuaciones.temp puntuaciones.txt
sort -nr -t "," -k2 puntuaciones.txt

Y Me actualiza el fichero puntuaciones.txt
(HACER LOS MISMO CON FUNCIONES)

script20_usuarios
Crear el siguiente menú
USUARIOS
1.Información de usuario (pide usuario)
2.Gestión de usuarios
3.Salir

script20_gestion
Gestión de usuarios
(antes comprobar que somos root)
A.Añadir (comprobar)
E.Eliminar (comprobar)
V.Volver

#! /bin/bash
#Crear el siguiente menu
#Usuarios
#1.Informacion de usuario (pide un usuario)
#2.Gestion de usuario
#3.Salir
x=0
while [ $x -ne 3 ]
do 
	clear
	echo "Usuarios"
	echo "1.Informacion de usuario"
	echo "2.Gestion de usuario"
	echo "3.Salir"
	echo -n "ELige una opcion:"
	read x
	
	if [ $x -eq 1 ]
	then
		echo -n "Introduzca un usuario:"
		read usuario
		finger $usuario
	elif [ $x -eq 2 ]
	then	
		./script20_gestion
	fi
	echo -n "presione para continuar..."
	read pausa
done
 
#! /bin/bash
#Crear el siguiente menu
#Gestion de usuarios
#A.Añadir (comprobar)
#E.Eliminar (comprobar)
#V.Volver
clear
x=0
while [ $x != "V" ]
do 
	echo "Gestion de usuarios"
	echo "A.Añadir"
	echo "E.Eliminar"
	echo "V.Volver"
	echo -n "ELige una opcion:"
	read x

	if [ $x == "A" ]
	then
		if [ $USER == "root" ]
		then	
			echo -n "Nombre del usuario:"
                        read $usuario
			useexi=`grep -i $usuario /etc/passwd |wc -l`
			if [ $useexi -eq 0 ]
			then
			 	adduser $usuario
			else
				echo  "El usuario ya existe"
			fi
		else
			echo "NO tiene permiso de administrador"
			echo -n "presione para continuar..."
			read pausa
		fi
	elif [ $x == "E" ]
	then
 		if [ $USER == "root" ]
                then 
                        echo -n "Nombre del usuario:"
                        read $usuario
			useexi=`grep -i $usuario /etc/passwd |wc -l`
                        if [ $useexi -gt 0 ]
                        then
				 deluser $usuario
			else 
				echo "El usuario que quiere eliminar no existe"
			fi
                else 
                        echo "NO tiene permiso de administrador"
			echo -n "presione para continuar..."
                        read pausa

                fi


	fi
done

Para instalar finger: sudo apt-get install finger

script21_creausu
Pide usuario, comprueba que no exista
y pide contraseña

 
#!/bin/bash
clear
echo -n Usuario: 
read usu
useradd $usu 
echo -n Contrasenya:
read contra
echo $contra>contra.txt
echo $contra>>contra.txt
passwd $usu

Sé el primero en comentar

Deja un comentario