Ejercicios Shell Scripts Resueltos (Relación 2 Ejercicios)

Previamente deberías leer el artículo Introducción a Ejercicios Shell Scripts resueltos para realizar estos ejercicios.

Antes de meternos de lleno en realizar los ejercicios acerca de bucles conviene explicar los argumentos o parámetros en los programas shell de UNIX y GNU/Linux.

$# Número de argumentos que se le pasan.
$1,$2,$3 Hacen referencia al primero, segundo, tercer parámetro y así sucesivamente.
$o Nombre del programa de shell.
$* o $@ Hacen referencia a todos los argumentos en la línea de órdenes.
$# Número de parámetros.
$? Valor devuelto por la última orden ejecutada.
$! PID del último proceso ejecutado en background.
$$ PID del shell actual.
$UID UID del usuario.
$USER Nombre del usuario.
$HOME Directorio HOME del usuario.

 

Comprobaciones de enteros shell

n1 -eq n2 Verdadero si los enteros n1 y n2 son iguales.
n1 -ne n2 Verdadero si los enteros n1 y n2 no son iguales.
n1 -gt n2 Verdadero si el entero n1 es mayor que el entero n2.
n1 -ge n2 Verdadero si el entero n1 es mayor o igual que el entero n2.
n1 -lt n2 Verdadero si el entero n1 es menor que n2.
n1 -le n2 Verdadero si el entero n1 es menor o igual a n2

 

Comprobaciones de cadenas en shell

-z cadena Verdadero si la longitud de la cadena es cero.
-n cadena Verdadero si la longitud de la cadena es mayor que cero.
cadena1=cadena2 Verdadero si cadena1 y cadena2 son idénticos.
cadena1!=cadena2 Verdadero si cadena1 y cadena2 no son idénticos.

 

Comprobaciones de archivos

-e archivo Verdadero si existe el archivo.
-r archivo Verdadero si existe el archivo y puede leerse.
-w archivo Verdadero si existe el archivo y puede escribirse.
-x archivo Verdadero si existe el archivo y es ejecutable.
-f archivo Verdadero si existe el archivo y es un archivo regular.
-d archivo Verdadero si existe el archivo y es un directorio.
-O archivo Verdadero si existe el archivo y pertenece al usuario.
-G archivo Verdadero si existe el archivo y pertenece al grupo del usuario.
-s archivo Verdadero si existe el archivo y tiene un tamaño mayor que cero.

 

expr

El comando expr sirve para resolver expresiones matemáticas de números enteros en la terminal. Por ejemplo, si queremos que nos aparezca el resultado de 7 + 2 * 7 / 3 ponemos en la terminal:

expr 7 + 2 * 7 / 3

Antes del asterisco * pongo el backslash -» … es necesario, pues expr no interpreta el asterisco como símbolo de multiplicación a no ser que se le ponga el

Parte 1 Condicionales

Ejercicio 1.

Recibe un número entero por teclado y dice si es positivo.

echo "Introduce un número"
read n
if [ $n -gt "0" ];then
echo "Este número es positivo"
fi

-- OTRA FORMA –-
clear
echo "INTRODUCE UN NUMERO"
read numero
if [ $numero -gt 0 ]
then
echo "El numero $numero es positivo"
else
echo "el numero $numero es negativo"
fi

Ejercicio 2.

Recibe un número entero por teclado y dice si es negativo.

echo "Introduce un número"
read n
if [ $n -lt "0" ];then
echo "Este número es negativo"
fi

Ejercicio 3.

Recibe un número entero por teclado y dice si es igual a cero.

echo "Introduce un número"
read n
if [ $n -eq "0" ];then
echo "Ud. ha introducido el número 0"
fi

-- OTRA FORMA –

clear
echo "INTRODUCE UN NÚMERO"
read numero
if [ $numero -eq 0 ]
then
echo "El número que has tecleado es 0"
else
echo "El número: $numero es distinto de 0"
fi

Ejercicio 4.

Recibe un numero entero por teclado y dice si es positivo, negativo o cero.

echo "Introduce un número"
read n
if [ $n -gt "0" ];then
echo "Ud. ha introducido un número positivo"
else
if [ $n -lt "0" ];then
echo "Ud. ha introducido un número negativo"
else
echo "Ud. ha introducido el número 0"
fi
fi

--  OTRA FORMA --
clear
echo "INTRODUCE UN MÚMERO"
read numero
if [ $numero -gt 0 ];then
echo "EL NÚMERO $numero ES POSITIVO"
elif [ $numero -lt 0 ];then
echo "EL NÚMERO $numero ES NEGATIVO"
else 
echo "EL NUMERO ES O"
fi


--  OTRA FORMA --
clear
echo "INTRODUCE UN MÚMERO"
read numero
if [ $numero -gt 0 ];then
echo "EL NÚMERO $numero ES POSITIVO"
else
        if [ $numero -lt 0 ];then
        echo "EL NÚMERO $numero ES NEGATIVO"
        else 
        echo "EL NUMERO ES O"
        fi
fi

Ejercicio 5.

Comprueba si el número de parámetros introducido es igual a 3, en el caso de que sea otro número mostrara un mensaje de error por pantalla.

if [ $# -eq "3" ];then
echo "El número de parámetros introducidos es: " $#
else
echo "EL número de parámetros es incorrecto"
fi

--  OTRA FORMA --
clear
if [ $# -eq 3 ]
then
echo "El número de parámetros que has introducido es igual a $#"
else
echo "El número de parámetros que has introducido no es 3 sino $#"
fi

--  OTRA FORMA --
clear
if [ $# -eq 3 ];then
echo "El número de parámetros que has introducido es igual a $#"
else
echo "El número de parámetros que has introducido no es 3 sino $#"
fi

--  OTRA FORMA --
clear
if test $# -eq 3 
then
echo "El número de parámetros que has introducido es igual a $#"
else
echo "El número de parámetros que has introducido no es 3 sino $#"
fi

--  OTRA FORMA --
clear
if [ $# -eq 3 ];then echo "El número de parámetros que has introducido es igual a $#"
else
echo "El número de parámetros que has introducido no es 3 sino $#"
fi

Ejercicio 6.

Recibe dos números por parámetros y lo suma. En caso de que el número de parámetros sea incorrecto muestra un mensaje de error.

clear
if [ $# -eq 2 ]
then
expr $1 + $2
else "El número de parámetros introducidos no es dos"
fi

--  OTRA FORMA --
clear
if [ $# -eq 2 ]
then
suma=`expr $1 + $2`
echo "La suma de los parámetros es: $suma"
else "El número de parámetros introducidos no es 2 sino $#"
fi

--  OTRA FORMA --
if [ $# -eq "2" ]; then
suma=$(($1 + $2))
echo $suma
else 
echo "Número de parámetros introducidos incorrecto"
fi

Ejercicio 7.

Recibe 3 parámetros. En el caso de que reciba un número diferente muestra un mensaje de error. Los dos primeros serán dos números y el tercero será uno de los siguientes símbolos “+” “-“ “x” “/”, dependiendo del tercer parámetro introducido realizara la correspondiente operación. El en caso de que se introduzca un símbolo diferente, presentara un mensaje indicando cuales son las opciones correctas.

if [ $# -eq "3" ]; then
	if [ $3 = "+" ]; then
	echo "la suma es:" $(($1 + $2))
	else
		if [ $3 = "-" ];then
		echo "la resta es:" $(($1 - $2))
		else
			if [ $3 = "x" ];then
			echo "la multiplicación es:" $(($1 * $2))
			else
				if [ $3 = "/" ];then
				echo "la división es:" $(($1 / $2))
				else
				echo "El tercer parámetro no es +, -, x o /"
				fi
			fi

		fi
	fi
else
echo "Número de parámetros introducidos incorrecto"
fi

-- OTRA FORMA --
clear
if [ $# -eq 3 ]
then
    if [ $3 = + ];then
    expr $1 + $2
    fi
    if [ $3 = - ];then
    expr $1 - $2
    fi
    if [ $3 = / ];then
    expr $1 / $2
    fi
    if [ $3 = x ];then
    expr $1 "*" $2
    fi
else
echo el numero de parámetros introducidos no es 3, sino $#
fi

-- OTRA FORMA –
clear
if [ $# -eq 3 ]
then
    cadena="+-/x"
    echo $cadena > aux
    grep $3 aux  #para que no se muestre el grep
    if [ $? = 0 ];then
       case $3 in
       +)
       expr $1 + $2
       ;;
       -)
       expr $1 - $2
       ;;
       /)
       expr $1 / $2
       ;;
       x)
       expr $1 "*" $2
       ;;
       esac
       else
       echo "DEBES INGRESAR +,-,/,x"
    fi
else
echo el numero de parámetros introducidos no es 3, sino $#
fi

Ejercicio 8.

Recibe la ruta de un fichero e indica si existe.

Para abordar el ejercicio repasar tabla Comprobaciones de archivos del inicio.

echo "Introduce la ruta de un fichero"
read n
if [ -e $n ];then
echo "El fichero existe"
else
echo "El fichero no existe"
fi

-- OTRA FORMA –

clear
echo INTRODUCE EL NOMBRE DEL FICHERO Y SU RUTA
read "fichero"
if test -e "$fichero"
then
cat "$fichero"
else
echo el fichero no existe
fi

Ejercicio 9.

Recibe la ruta de un fichero e indica si es un directorio o un fichero.

echo "Introduce la ruta a examinar"
read n
if [ -d $n ];then
echo "La ruta pertenece a un directorio"
fi
if [ -f $n ];then
echo "La ruta pertenece a un fichero"
fi

-- OTRA FORMA --     
clear
if [ -d $1 ];then
echo "$1 es un directorio"
elif [ -f $1 ];then
echo "$1 es un fichero"
else
echo "No existe"
fi

-- OTRA FORMA –

clear
if [ -d $1 ];then
echo "$1 es un directorio"
else
    if [ -f $1 ];then
    echo "$1 es un fichero"
    fi
else
echo "No existe"
fi

Ejercicio 10.

Recibe la ruta de un fichero e indica los permisos que tiene (escritura, lectura, ejecución)

echo "Introduce una ruta"
read n
if [ -e $n ];then
	if [ -r $n ];then
	echo "El archivo tiene permisos de lectura"
	fi
	if [ -w $n ];then
	echo "El archivo tiene permisos de escritura"
	fi
	if [ -x $n ];then
	echo "El archivo tiene permisos de ejecución"
	fi
else
echo "La ruta no existe"
fi


-- OTRA FORMA –

clear
if [ -e $1 ]
then
    if [ -d $1 ]
    then
        echo EL DIRECTORIO $1 TIENE PERMISOS DE:
        if [ -r $1 ];then echo lectura
        fi
        if [ -w $1 ];then echo escritura
        fi
        if [ -x $1 ];then echo ejecución
        fi
     else
           if [ -f $1 ]
           then
               echo EL FICHERO $1 TIENE PERMISOS DE:
               if [ -r $1 ];then echo  lectura
               fi
               if [ -w $1 ];then echo  escritura
               fi
               if [ -x $1 ];then echo  ejecución
               fi
           fi
    fi
else
echo TRONK HAS INTRODUCIDO UN ARCHIVO/DIRECTORIO NO EXISTENTE EN LA RUTA
fi

-- OTRA FORMA –

clear
if [ -e $1 ]
then
    if [ -f $1 ]
    then
    tipo="archivo"
    else
       if [ -d $1 ]
       then
       tipo="directorio"
       fi
    fi

    echo El "$tipo" tiene permisos de:
    if [ -r $1 ];then echo lectura
    fi
    if [ -w $1 ];then echo escritura
    fi
    if [ -x $1 ];then echo ejecucion
    fi
else echo el fichero/archivo no existe en la ruta
fi

 

Parte 2 Bucles

Ejercicio 11.

Que imprima por pantalla 50 veces la palabra hola.

clear

for ((i=0;i<=50;i++))
do
echo $i hola

done

-- OTRA FORMA –-

a=hola
for i in $(seq 1 50);
do
echo $a
done

-- OTRA FORMA –-
i=0
while ( $i –lt 50)
do
  echo hola
  i = `expr $i + 1`
done

Ejercicio 12.

Que lea una palabra por teclado y la muestre por consola. Deberá realizar esta operación 10 veces.

clear
echo Dame una palabra
read palabra
echo ¿Cuantas veces quieres que te la muestre?
read veces
for ((i=1;i<=$veces;i++))
do
echo $i $palabra
done

-- OTRA FORMA --

for i in $(seq 1 10)
do
echo $1
done

Ejercicio 13.

Reciba un número por parámetro. El programa imprimirá la palabra “hola” el número de veces indicado por parámetro.

clear
for ((i=1;i<=$1;i++))
do
echo $i HOLA

done

-- OTRA FORMA --

for i in $(seq 1 $1);do
echo "hola"
done

Ejercicio 14.

Un número n por parámetro. El programa imprimirá los números del 0 al n por pantalla.

clear
for ((i=0;i<=$1;i++))
do
echo $i
done

-- OTRA FORMA --
a=0
echo $a
for i in $(seq 1 $1)
do
echo $i
done

Ejercicio 15.

Reciba un número n por parámetro. El programa tendrá que sumar todos los números entre 1 y n. Posteriormente mostrara el resultado de la suma por pantalla.

clear
suma=0
for ((i=1;i<=$1;i++))
do

suma=`expr $suma + $i`
echo $i $suma
done
echo el resultado de la suma es:$suma


-- OTRA FORMA --

clear
suma=0
for ((i=1;i<=$1;i=i+1))
do
suma=$(($i+$suma))
done
echo $suma

Ejercicio 16.

Reciba dos números por parámetro. El programa deberá hacer que el primer parámetro tome el valor del segundo parámetro y el segundo parámetro tome el valor del primero. Por ejemplo si introduce el 2 y el 9, en un principio $1 es 1 y $2 es 9. Tras la ejecución del programa $1 valdrá 9 y $2 1. (este es sin bucles)

clear
echo El valor del primer parámetro es: $1
echo El valor del segundo parámetro es: $2
echo Ahora
sleep 2
set $2 $1
echo El valor del primer parámetro es: $1
echo El valor del segundo parámetro es: $2

-- OTRA FORMA --

NUM1=$1
NUM2=$2
echo "Valor del parámetro 1: $NUM1"
echo "Valor del parámetro 2: $NUM2"
N=$NUM1
NUM1=$NUM2
NUM2=$N
echo "Cambio del parámetro 1: $NUM1"
echo "Cambio del parámetro 2: $NUM2"

Ejercicio 17.

Programa que lea palabras hasta que se escriba “:q”

echo "Escribe una palabra: "
read n
while [ $n != :q ]
do
echo "Escriba otra palabra: "
read n
done

Ejercicio 18.

Programa que lea palabras y las guarde en un fichero, hasta que se escriba “:q”

echo "Escribe una palabra: "
read n
while [ $n != :q ]
do
echo $n >> fichero
echo "Escriba otra palabra: "
read n
done

Ejercicio 19.

Programa que lea palabras y las guarde en un fichero de forma ordenada, hasta que se escriba “:q”

clear
echo >fichero
echo Escribe una palabra
read palabra
while [ $palabra != :q ]
do
 echo $palabra >> fichero
 sort -o fichero fichero
 echo Escribe otra palabra:
read palabra

done

-- OTRA FORMA --

echo "Escribe una palabra: "
read n
while [ $n != ":q" ]
do
touch fichero
echo $n >> fichero
sort -d fichero > tmp
mv tmp fichero
echo "Escriba otra palabra: "
read n
done

 

Ejercicio 20.

Realiza un programa que solicite un número y compruebe si se encuentre en un archivo llamado numeros.

read numero
for i in `cat numeros`
do
  if [ $i -eq $numero ]
  then
        echo "El número $numero existe en el fichero"
        exit 0
  fi
done
echo "El número $numero no se encuentra en el fichero"

 

Parte 3 Case

Ejercicio 21.

Un trayecto en tren cuesta 30€. Realiza un programa que pregunte si se desea un billete de ida y vuelta, en ese caso efectúe un descuento del 20% sobre el precio de doble trayecto. En pantalla debe aparecer el importe final.

echo ¿Vas a viajar ida y vuelta? Responde SI o NO
read n
case $n in

SI|Si|si|s)
resultado=`expr ( 30 + 30 ) * 80 / 100`
echo $resultado
;;
NO|No|no|n)
echo Tienes que pagar 30€
;;
*)
echo Opción no válida
;;
esac

-- OTRA FORMA --


echo ¿Vas a viajar ida y vuelta? Responde SI o NO
read n
case $n in

SI|Si|si|s)
expr ( 30 + 30 ) * 80 / 100

;;
NO|No|no|n)
echo Tienes que pagar 30€
;;
*)
echo Opción no válida
;;
esac


-- OTRA FORMA --

echo "¿Ida y vuelta?, Responde SI o NO"
read n
if [ $n = SI ] || [ $n = si ] || [ $n = s ]
then
suma=$((30+30))
descuento=`expr $suma * 80 / 100`
echo Tiene que pagar: $descuento
else
echo Tiene que pagar 30€

fi

 

 

Deja un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies ACEPTAR

Aviso de cookies