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