Scripts en Linux
Scripts en Linux
CONTENIDO
Página. 1
.S.O.Lnux. Shell Scripts.
NUESTRO PRIMER SCRIPT.
Los scripts no son más que ficheros de texto ASCII puro, que pueden ser creados con cualquier
editor del que dispongamos (vi, nano, gedit, emacs, etc.). Cread un fichero de texto de nombre
primero.sh, con el siguiente contenido:
#!/bin/bash
echo “Hola Mundo”
La primera línea sirve para indicar que shell utilizamos (en nuestro caso bash) y donde puede ser
encontrado en nuestro sistema (para saberlo, podemos hacer locate bash). Esta línea debe ser
la primera de todos los scripts que realicemos.
La segunda línea de nuestro script, simplemente utiliza el comando para escribir en pantalla
(echo) y escribe la línea Hola Mundo.
Una vez creado el fichero, debemos darle permisos de ejecución, mediante el comando
Posteriormente para ejecutarlo debemos llamarlo como ./permiso.sh (el punto barra es para
indicarle que lo busque en el directorio actual, ya que dicho directorio no estará seguramente
incluido en el PATH del sistema).
Si queremos ejecutar un script para comprobar cómo funciona sin hacerlo ejecutable, podemos
hacerlo mediante el comando source primero.sh que permite lanzar un script no ejecutable.
La orden source también puede ejecutarse simplemente escribiendo un punto como hemos
visto en el tema anterior.
Sin embargo, la orden source solo debe usarse para comprobar el script, una vez que tengamos
el script completo y depurado debemos darle sus permisos de ejecución correspondientes.
Las comillas dobles que hemos usado para escribir Hola Mundo no son necesarias, y podéis
comprobar como quitándolas el proceso se ejecuta exactamente igual. Sin embargo, es una
buena práctica encerrar siempre los textos entre comillas dobles, y en caso de que contengan
caracteres especiales (como el *, el $, etc.), es mejor usar comillas simples, que son más potentes
que las comillas dobles. Probad lo siguiente:
Si tenemos que ejecutar varias líneas y queremos escribirlas en una sola, podemos hacerlo
usando el símbolo punto y coma para indicar que lo siguiente es otra línea, aunque este en la
misma:
echo Hola ; pwd ; echo Adios # esto son tres líneas en una sola.
echo esto \
es una sola línea \
aunque ocupe 3 en pantalla. # esto es una linea escrita en tres.
En estos últimos ejemplos he aprovechado para mostraros como se pueden usar comentarios
en los scripts. Basta con usar el símbolo almohadilla (#) donde queramos, todo lo que quede a
la derecha de dicho símbolo es un comentario. Si usamos # como primer carácter de una línea,
toda la línea es de comentario.
Página 3 .
USO DE VARIABLES EN LOS SCRIPTS. EXPANSIONES.
Las variables de los shell scripts son muy simples, ya que no tienen tipo definido ni necesitan ser
declaradas antes de poder ser usadas. Para introducir valor en una variable simplemente se usa
su nombre, y para obtener el valor de una variable se le antepone un símbolo dólar.
#!/bin/bash
DECIR=”Hola Mundo”
echo $DECIR
Este script realiza exactamente la misma función que el anterior, pero usando una variable.
Cualquier valor introducido en una variable se considera alfanumérico, así que si realizamos lo
siguiente:
$(ORDEN)
En Linux podemos usar varias expansiones en las líneas de comandos, que son especialmente
útiles en los scripts. La primera expansión consiste en usar $( ). Esta expansión permite ejecutar
lo que se encuentre entre los paréntesis, y devuelve su salida.
NOMBRE_FICHERO=”red”$(date +%d%m%y)”.conf”
cp /etc/network/interfaces $NOMBRE_FICHERO
Como es lógico, es perfectamente posible no usar variables en el ejemplo anterior y hacerlo todo
en una línea, pero es una buena práctica no complicar excesivamente cada una de las líneas del
script.
Esto nos permitirá una modificación mucho más simple y la depuración en caso de que existan
errores suele ser bastante más rápida, al menos mientras nuestro nivel de programación no sea
bastante alto.
Página 4
El efecto conseguido con $( orden ) se puede conseguir también usando la tilde invertida
`orden`.
$((OPERACIÓN ARITMÉTICA))
Otra expansión que podemos usar es $(( )) (símbolo dólar pero con dos paréntesis). Los dobles
paréntesis podemos sustituirlos si queremos por corchetes. $[ ].
Esta expansión va a tratar como una expresión aritmética lo que esté incluido entre los
paréntesis, va a evaluarla y devolvernos su valor.
NUMERO=4
echo $(($NUMERO+3)) # sería lo mismo poner echo $[$NUMERO+3]
Aprovecho para explicar el comando let, que nos permite realizar operaciones aritméticas como
la anterior, pero sin tener que usar expansiones ni dólares para las variables.
NUMERO=4
let SUMA=NUMERO+3
echo $SUMA
Los operadores aritméticos que podemos usar para realizar operaciones son: Resta (-), Suma (+),
División (/), Multiplicación (*) y Modulo o Resto (%).
Página 5
LET. BC.
Cread con nano un fichero con nombre media.sh con el siguiente contenido:
Haced ejecutable media.sh y ejecutadlo. Si lo habéis escrito bien veréis como realmente os da
la media aritmética de las tres notas introducidas.
La línea
MEDIA=$[ $SUMA / 3 ]
Podría haberse escrito también como
let MEDIA=SUMA/3
Si ejecutamos el script, veremos que hay un problema, podéis comprobar como bash no trabaja
con decimales, de modo que si introducimos por ejemplo 10, 10 y 6 nos dirá que la media es 8,
mientras que la media realmente es 8,66.
Podemos obligar a que bash trabaje con decimales utilizando un comando que sirve como
calculadora en Linux, este comando es bc. Este comando admite un gran número de parámetros,
pero en estos apuntes vamos a usarlo simplemente para indicar que queremos obtener
decimales en las operaciones. Para ello simplemente haremos el siguiente cambio..
Vemos cómo debemos generar una salida con echo, el primer campo scale indica cuantos
decimales queremos obtener (4 en este caso), luego y separado por un punto y coma ponemos
la operación aritmética que deseamos realizar, sin necesidad de poner corchetes, dobes
paréntesis o usar let. El resultado de este echo lo enviamos al comando bc –l mediante una
tubería.
Página 6
Página 7
Página 8
ESTRUCTURAS CONDICIONALES.
IF.
if [ expresión ]; then
Realizar si expresión es verdadera
fi
Los anteriores operadores sólo son válidos para comparar cadenas, si queremos comparar
valores numéricos, hemos de usar los siguientes operadores:
Página 9
Operadores de comparación de valores numéricos.
Si usamos operadores de comparación numéricos con valores de cadena, el sistema nos dará un
error como el siguiente:
Página 10
IF..ELSE
La estructura if podemos ampliarla usando la construcción else (en caso contrario) y elif (en caso
contrario si…).
if [ expresión 1 ]; then
Realizar si expresión 1 es verdadera
else
Realizar si expresión 1 es falsa
fi
Página 11
IF..ELIF..ELSE
if [ expresión1 ]; then
Realizar si expresión1 es verdadera
else
realizar si todas las expresiones anteriores son falsas
fi
Hay que tener muchísimo cuidado con los espacios en blanco, y seguramente durante nuestros
primeros scripts casi todos los errores vendrán por haberlos usado mal en las estructuras if.
Hay que recordar que los corchetes llevan espacios en blanco tanto a izquierda como derecha,
que el punto y coma sin embargo va pegado al corchete cerrado, y que SIEMPRE hay que poner
espacios en blanco en las expresiones.
Veamos algunos errores muy comunes, para que no los cometáis.
#!/bin/bash
PROFESOR=”Juana”
if [ $PROFSOR = “Juana” ]; then
echo “Hola Juana”
fi
Que traducido resulta, me he encontrado un [ (corchete abierto) y luego un operador (el =) sin
nada en medio, y eso no funciona.
Revisando el programa anterior, vemos como nos hemos equivocado en el nombre de la variable,
por lo cual $PROFSOR no tiene ningún valor (es nula) y por lo tanto al no valer nada, el programa
lo que ve es lo siguiente: if [ = “Juana” ].
Hemos visto operadores aritméticos y operadores para cadena, pero en las expresiones
podemos utilizar cualquier operación que nos devuelva un valor lógico (0 para verdadero). Por
ejemplo, podemos usar la función test del bash, que funciona de la siguiente forma:
Si lo necesitamos, podemos anidar expresiones usando tanto and (y, &&) como or (o, ||).
También podemos usar el operador not (!) para indicar una negación.
if ! [ expresión1 ]; then
se ejecuta si expresión1 NO es verdadera
fi
Página 13
Para hacer algunos ejercicios, vamos a aprovechar para explicar mejor cómo le podemos pedir
datos al usuario. Se hace con la orden read y es muy simple de usar:
La ejecución del script se parará, mostrará por pantalla el texto de la pregunta, y dejará que el
usuario escriba la respuesta, cuando pulse INTRO la respuesta dada se introducirá como valor
de variable.
read también puede ser usada sin el parámetro -p, de la forma read variable. También podemos
hacer que lea un determinado número de caracteres, sin obligar a que el usuario pulse intro,
con el parámetro -n número_de_caracteres. El parámetro -s silencia el eco (no se ve por pantalla
lo que el usuario escribe).
Ahora que sabemos usar el read, hagamos por ejemplo un programa que nos permita indicar si
un número introducido es par o impar.
#!/bin/bash
# parimpar.sh - script que nos pide un número e indica si es par o impar.
clear
read -p “Introduzca un número : “ NUMERO
let RESTO=NUMERO%2
if [ $RESTO -eq 0 ]; then
echo “El número $NUMERO es par”
else
echo “El número $NUMERO es impar”
fi
Haced vosotros un script que pida un número por pantalla, e indique si es un múltiplo de 10 o
no. Haced otro script que nos pida un nombre por pantalla y nos diga si dicho nombre comienza
por la letra jota mayúscula.
Hagamos un script un poco más complicado… vamos a pedir al usuario un número de 3 cifras y
vamos a indicar si es capicúa.
#!/bin/bash
# capicua.sh - script que nos pide un número de tres cifras e indica si es
# capicúa o no.
clear
read -n 3 -p “Número entre 100 y 999 (no pulses INTRO) : “ NUMERO
echo # este echo sirve para introducir un retorno de línea
if [ $NUMERO -lt 100 ]; then
echo “Lo siento, has introducido un número menor de 100”
else
PRIMERA_CIFRA=$(echo $NUMERO | cut -c 1)
TERCERA_CIFRA=$(echo $NUMERO | cut -c 3)
if [ $PRIMERA_CIFRA = $TERCERA_CIFRA ]; then
echo “El número $NUMERO es capicúa.”
else
echo “El número $NUMERO ni es capicúa ni ná”.
fi
fi
Página 14
Es evidente que podíamos haber hecho este último script mucho más corto, por ejemplo usando
una línea como:
Pero eso ya queda al gusto de cada programador. A mí personalmente me gustan los programas
que pueden entenderse simplemente echándole una ojeada al fuente, y lo aconsejo
fuertemente al menos hasta que tengáis un nivel de programación muy alto. (Y aun entonces,
facilita mucho la modificación posterior de los programas).
Cuando hacemos un script de varias líneas como el anterior, es posible que cometamos algún
fallo. Una opción que podemos usar para depurar los scripts y encontrar rápidamente los errores,
es añadir un -x en la llamada al bash de la primera línea. Esto hará que cada línea antes de
ejecutarse sea mostrada por pantalla tal y como la está interpretando el bash.
#!/bin/bash -x
Para que esto funcione, es necesario que hagamos el script ejecutable, no es válido si lanzamos
el script con la orden source o con el punto. Hay que ejecutar el script haciéndolo antes
ejecutable con chmod y luego ejecutándolo con ./script.
Como ejemplo del if, haced un script que nos diga si en el directorio actual hay más de 10 ficheros
o no.
Haced otro script que nos pida la altura de 3 personas en centímetros, y nos diga por pantalla la
mayor de esas alturas.
Otro más que nos pida la edad y nos diga por pantalla en que década nacimos. (La década de los
70, la de los 80, la de los 90, etc.). Suponemos que todo el mundo tiene más de 15 años y nadie
tiene más de 60.
Y el último script por el momento debe hacer lo siguiente: nos pedirá por pantalla el nombre de
un mes (enero, febrero, etc.) y nos dirá por pantalla el número de días que tiene ese mes. (Así,
si introducimos diciembre nos responderá “Diciembre tiene 31 días”). Para este script se
considera que no existen los años bisiestos, así que febrero siempre tendrá 28 días.
Página 15
CASE.
Hemos visto la principal estructura condicional que es el if, pero tenemos alguna otra a nuestra
disposición, como el case. Esta estructura nos permite ejecutar varias acciones, dependiendo
del valor de una variable o expresión.
case VARIABLE in
valor1)
se ejecuta si VARIABLE tiene el valor1
;;
valor2)
se ejecuta si VARIABLE tiene el valor2
;;
*)
Se ejecuta si VARIABLE tiene otro valor distinto
;;
esac
En el case, no solo podemos preguntar por valores directos, sino que también podemos utilizar
los comodines que vimos anteriormente. Veamos un par de ejemplos de case utilizado junto con
comodines.
Página 16
Como ejercicio, haced un script con nombre horóscopo.sh que nos pida el año en que nacimos
(4 cifras) y nos diga por pantalla que animal nos corresponde según el horóscopo chino. Para
calcularlo debemos dividir el año entre 12 y el resto nos indicará el animal según la siguiente
tabla.
Página 17
ESTRUCTURAS ITERATIVAS. (BUCLES).
Las principales estructuras iterativas que podemos usar en shell scripts son for, while, until y
select.
FOR.
Ese conjunto que aparece en la estructura del for, es normalmente un conjunto de valores
cualesquiera, separados por espacios en blanco o retornos de línea. Así, si queremos mostrar
los días de la semana por pantalla podríamos hacerlo mediante este script:
Así, por ejemplo, si queremos obtener por pantalla los números del 1 al 10 podríamos hacerlo
de la siguiente forma:
La potencia del comando for viene de la flexibilidad de valores que admite el conjunto de valores,
ya que podemos crear dicho conjunto con una orden del sistema operativo. En el siguiente
ejemplo vamos a usar como conjunto los nombres de los ficheros con extensión sh del directorio
actual:
Página 18
El conjunto puede ser cualquier salida de cualquier orden, y formara elementos utilizando el
espacio en blanco como separador de elementos. Fijaros en el siguiente ejemplo:
Vemos como utilizamos como conjunto el contenido de un fichero. Vemos también como la línea
“jose antonio” la divide en 2 elementos distintos debido al espacio en blanco.
Página 19
El for de bash también permite utilizar el formato basado en trio de expresiones común al
lenguaje C.
Página 20
Veamos un ejemplo, con un script que como salida nos muestra los números pares entre 2 y 40.
Podemos utilizar la instrucción break para salirnos inmediatamente de un bucle for. Fijaros en
el siguiente ejemplo:
Este tipo de elementos (bucles infinitos, break, etc.) se consideran como “poco elegantes” desde
el punto de vista de la programación y es mejor acostumbrarse a no usarlos, ya que existen otro
tipo de alternativas más refinadas. Sin embargo son herramientas potentes y es conveniente
conocerlas.
Imaginemos que queremos copiar a un llaverito USB (montado en /media/usbdisk por ejemplo)
todos los scripts que tengamos en nuestro directorio home, sin importar en que directorio estén,
podríamos hacerlo fácilmente con este script:
#!/bin/bash
for programa in $( find ~ -iname “*sh” 2> /dev/null ); do
echo “copiando el script :” $programa
cp $programa /media/usbdisk
done
Página 21
Ya que estamos, mejoremos el script anterior para que cree un directorio scripts en nuestro
llaverito, pero únicamente si no existe.
#!/bin/bash
if ! [ -d /media/usbdisk/scripts ]; then
mkdir /media/usbdisk/scripts
fi
for programa in $( find ~ -iname “*sh” 2> /dev/null ); do
echo “copiando el script :” $programa
cp $programa /media/usbdisk
done
Página 22
WHILE Y UNTIL
Cuando no queremos recorrer un conjunto de valores, sino repetir algo mientras se cumpla una
condición, o hasta que se cumpla una condición, podemos usar las estructuras while y until.
while [ expresión ]; do
estas líneas se repiten MIENTRAS la expresión sea verdadera
done
until [ expresión ]; do
estas líneas se repiten HASTA que la expresión sea verdadera
done
Ambas estructuras, tanto while como until realmente realizan exactamente lo mismo, al
efectuar la comprobación de la expresión en la primera línea, no como en otros lenguajes.
#!/bin/bash
#doble.sh - script que pide números y muestra el doble de dichos números.
# el script continua ejecutandose mientras que no se introduzca 0.
read -p “Dime un número (0 para salir) : “ NUMERO
while [ $NUMERO -ne 0 ]; do
echo “El doble de $NUMERO es :” $(($NUMERO*2))
read -p “Dime un número (0 para salir) : “ NUMERO
done
#!/bin/bash
#doble.sh - script que pide números y muestra el doble de dichos números.
# el script continua ejecutandose mientras que no se introduzca 0.
read -p “Dime un número (0 para salir) : “ NUMERO
until [ $NUMERO -eq 0 ]; do
echo “El doble de $NUMERO es :” $(($NUMERO*2))
read -p “Dime un número (0 para salir) : “ NUMERO
done
Página 23
Otro ejemplo, vamos a mostrar por pantalla los número del 1 al 20
#!/bin/bash
NUMERO=1
until [ $NUMERO -gt 20 ]; do
echo “Número vale :” $NUMERO
let NUMERO=NUMERO+1
done
Página 24
Página 25
Página 26
Página 27
PASO DE PARÁMETROS A UN SCRIPT.
Podemos pasar parámetros tanto a los scripts como a las funciones. Los parámetros en bash se
indican como un símbolo dólar ($) seguido de un número o carácter. Los principales parámetros
que se pueden usar son:
Parámetros
$1 Devuelve el 1º parámetro pasado al script o función al ser llamado.
$2 Devuelve el 2º parámetro.
$3 Devuelve el 3º parámetro. (Podemos usar hasta $9).
$* Devuelve todos los parámetros separados por espacio.
$# Devuelve el número de parámetros que se han pasado.
$0 Devuelve el parámetro 0, es decir, el nombre del script o de la función.
script01.sh juan 12 45
$* = juan 12 45
$0 $1 $2 $3
$# = 3
#!/bin/bash
# parámetros.sh - script sobre parámetros.
echo “El primer parámetro que se ha pasado es “ $1
echo “El tercer parámetro que se ha pasado es “ $3
echo “El conjunto de todos los parámetros : “ $*
echo “Me has pasado un total de “ $# “ parámetros”
echo “El parámetro 0 es : “ $0
Página 28
Como he indicado antes, también podemos pasarle parámetros a las funciones, usando el mismo
método y las mismas posibilidades que para los scripts completos.
#!/bin/bash
function mayor_edad {
if [ $1 -ge 18 ]; then
echo Si, es mayor de edad
else
echo No, es menor de edad
fi
}
read -p "Dime la edad del que quiere entrar : " EDAD
echo voy a comprobar si puede entrar o no.
mayor_edad $EDAD
Como práctica, intentad modificad el script que hicimos explicando los if, que tenía como misión
indicar si un numero introducido era capicúa o no. Modificadlo de tal modo que en lugar de
pedir el número al usuario mediante un read, use directamente el número pasado como
parámetro 1. Es decir, el script se ejecutará así: ./capicua.sh 767
Página 29
VALORES DEVUELTOS POR LAS ÓRDENES.
Existe un parámetro especial, el $? que nos devuelve el valor del resultado de la última orden.
Es decir, después de ejecutar cualquier orden o comando del sistema (o casi cualquier orden
mejor dicho) podemos comprobar el valor de $? que tendrá un 0 si todo ha ido bien, y otro valor
cualquiera en caso de que haya fallado. Comprobarlo es muy simple:
cd /juegos/faluyah
echo $?
Comprobareis como $? vale 1, es decir, indica que la última orden no funcionó correctamente.
cd /etc/network
echo $?
Comprobareis como vale 0, es decir, indica que la última orden funciono sin problemas.
Este parámetro puede sernos muy útil realizando scripts, ya que nos permite una forma rápida
y cómoda de ver si todo está funcionando bien o no.
Como ejemplo, realizad un script con nombre borrar.sh. Dicho script aceptará como parámetro
el nombre de un fichero. El script debe eliminar ese fichero, pero antes debe guardar una copia
de seguridad del mismo en el directorio papelera que debemos crear en nuestro home de
usuario. Una vez comprobado que funciona, pasadle como parámetro el nombre de un fichero
que el usuario no tenga permisos para borrar (recordad que además debe estar en un directorio
en el que el usuario no tenga el permiso de escritura). Como es obvio, el script nos dará un error
al intentar borrar dicho fichero, pues precisamente después de ese rm es donde podemos
colocar un if preguntando por $?, de modo que interceptemos el error y avisemos al usuario de
que dicho fichero no ha podido ser borrado.
Modificar el script anterior, de modo que si el usuario no le pasa ningún parámetro, el script se
dé cuenta y avise de ello por pantalla.
Página 30
UN SCRIPT COMPLETO DE EJEMPLO
Hagamos un script que nos permita simular el juego ese de pensar un número y que el jugador
lo adivine proponiendo varios números, a los que se responderá únicamente si se han quedado
cortos o se han pasado. Vamos a realizarlo llevando un control de cuantos intentos llevan y un
contador de record que nos permitirá mostrar las 3 personas que lo han resuelto en menos
intentos.
#!/bin/bash
# juego1.sh - script que permite jugar a adivinar un número en varios
# intentos y llevando un control de los 3 mejores.
clear
# Si pasamos como parametro x borramos fichero record
if [ $# -ne 0 ]; then # para controlar que se han pasado parámetros.
if [ $1 = x ]; then
echo "Borrando fichero de records."
rm record.txt
fi
fi
#
# Ahora vamos a leer el fichero de records para imprimirlo.
#
if [ -f record.txt ]; then
POS=0
for CAMPEON in $(cat record.txt); do
let POS=POS+1
NOMBRE=$(echo $CAMPEON | cut -d: -f2)
NUMERO=$(echo $CAMPEON | cut -d: -f1)
echo "En posición $POS esta $NOMBRE con $NUMERO intentos"
done
else
echo '**********************************************'
echo "No hay ningún record todavía. Aprovecha la oportunidad"
echo '**********************************************'
fi
#
# comenzamos el juego en sí.
#
CONTADOR=1
let MINUMERO=RANDOM # $RANDOM nos da un número aleatorio.
# MINUMERO=3 # para hacer pruebas, descomentar esta línea y comentar
# la anterior.
echo ' ' ; echo ' '
echo '*****************************************************'
read -p "Dime tu nombre : " NOMBRE
echo ' ' ; echo ' '
read -p "Llevas $CONTADOR intentos. Dime un número: " NUMERO
#
#
until [ $NUMERO -eq $MINUMERO ]; do
if [ $NUMERO -gt $MINUMERO ]; then
echo "El número que has metido es mayor"
Una cosa interesante que podéis ver en este script, es como hemos aprovechado las funciones
de las ordenes Linux para simplificar el programa. Todo el tema de ordenación de los record,
quedarnos solo con los 3 primeros, comprobar si el usuario actual ha batido algún record, etc.,
lo hemos realizado simplemente con un comando bash de Linux, en este caso un head que viene
de un sort. Si no lo hubiéramos hecho así, el script sería mucho más largo y complicado.
Página 32
EJERCICIOS SOBRE SCRIPTS.
1) Crear un script con nombre crear.sh que admita dos parámetros, el primero indicará el
nombre de un fichero, y el segundo su tamaño. El script creará en el directorio actual un
fichero con el nombre dado y el tamaño dado en Kilobytes. En caso de que no se le pase
el segundo parámetro, creará un fichero con 1.024 Kilobytes y el nombre dado. En caso
de que no se le pase ningún parámetro, creará un fichero con nombre fichero_vacio y
un tamaño de 1.024 Kilobytes.
Ejemplo:
crear.sh aguado 546 (creará el fichero aguado con 546 K de tamaño).
crear.sh panadero (creará el fichero panadero con 1.024 K de tamaño).
crear.sh (creará el fichero fichero_vacio con 1.024 K de tamaño).
2) Modificar el ejercicio anterior para que antes de crear el fichero compruebe que no
exista. En caso de que exista avisará del hecho por pantalla y creará el fichero pero
añadiéndole un 1 al final del nombre (aguado1, por ejemplo). Si también existe un
fichero con ese nombre, lo creará con un 2 al final del nombre, así seguiremos hasta
intentar el 9. Si también existe un fichero con 9 al final del nombre, avisará del hecho y
no creará nada.
3) Crear un script llamado cuenta_atras.sh que nos pida dos números cualesquiera, deberá
mostrar por pantalla todos los números entre el mayor de los dos introducidos y el
menor. (Así si introducimos 20 1 nos mostrará los números del 20 al 1, si introducimos
56 89 nos mostrará los números del 89 al 56).
5) Hacer un script que nos diga por pantalla buenos días, buenas tardes o buenas noches
según la hora del sistema. (Elegir vosotros las horas de día, tardes y noches).
6) Hacer un script que acepte como parámetro una palabra. El script debe reescribir la
palabra por la pantalla, pero cambiando la a por un 1, la e por un 2, la i por un 3, lo o
por un 4 y la u por un 5.
7) Hacer un script que acepte como parámetro un número. El script debe avisar por
pantalla si no se le pasa ningún parámetro, o si el parámetro que se le pasa no es un
número. Una vez comprobado que le ha pasado un número, dibujara por pantalla tantos
caracteres @ como indique el número. (Así, si se le pasa como parámetro al script un
12, dibujará por pantalla @@@@@@@@@@@@ (12 veces la @).
8) Script que nos diga por pantalla cuantos usuarios reales tiene nuestro sistema (usuarios
que tengan un directorio creado en /home), nos deje elegir de una lista el nombre de
uno de ellos, y le realice automáticamente una copia de seguridad de todo su directorio
home en /home/copiaseguridad/nombreusuario_fecha. Nombreusuario será el nombre
del usuario, y _fecha será un símbolo _ y la fecha actual del sistema. Nos referimos a
usuarios normales que tengan creado una carpeta en /home.
Página 33
9) Hacer un script que nos pida el número de alumnos de una clase. Posteriormente irá
pidiendo la nota de cada una de ellos para la asignatura de ISO. Al final indicará el
número de aprobados, el número de suspensos y la nota media.
10) Hacer un script que nos pida por pantalla nuestro nombre, y nos diga cuantas letras
tiene.
11) Hacer un script que admita como parámetros el nombre de dos ficheros. El script debe
avisar si los parámetros pasados no existen como ficheros, o si no se le pasan
parámetros, o si solo se pasa un parámetro. Una vez comprobados que se le han pasado
dos ficheros, el script debe mostrar por pantalla el tamaño en KB de cada uno de ellos.
12) quita_blancos.sh. Este script debe automáticamente, renombrar todos los ficheros del
directorio actual de modo que se cambien todos los espacios en blanco de los nombres
de los ficheros por subrayados bajos (el carácter _ ). Así, si en el directorio indicado como
parámetro hay un fichero como Mi carta de amor al ejecutar el script cambiará su
nombre por Mi_carta_de_amor. Esto debe hacerse automáticamente para todos los
ficheros del directorio actual que tengan espacios en blanco en el nombre.
13) lineas.sh. Script que aceptará tres parámetros, el primero será un carácter cualquiera,
el segundo un número entre 1 y 60 y el tercero un número entre 1 y 10. El script debe
dibujar por pantalla tantas líneas como indique el parámetro 3, cada línea formada por
tantos caracteres del tipo parámetro 1 como indique el número indicado en parámetro
2. El script debe controlar que no se le pase alguno de los parámetros y que los números
no estén comprendidos entre los límites indicados. Ejemplo: ./líneas.sh k 20 5 (escribirá
5 líneas, cada una de ellas formadas por 20 letras k.
14) Crear un fichero con nombre palabra.txt y escribir en el mismo una palabra en una única
línea. Modificar el script anterior, de modo que no se le pase el carácter. En su lugar se
usará la palabra leída de dicho fichero palabra.txt. Ejemplo: ./lineas2.sh 6 5 (escribirá 5
líneas, cada una de ellas formadas por repetir 6 veces la palabra que este escrita en
palabra.txt).
15) Tenemos un directorio que contiene, entre otras cosas, scripts de shell. Se desea
modificarlos, insertando entre su primera y segunda línea el copyright del autor, la fecha
y el nombre del fichero. Por ejemplo, el script hola_mundo.sh
#!/bin/bash
echo hola mundo
quedaría:
#!/bin/bash
# FILE: hola_mundo.sh
# (c) Ango. You can redistribute this program under GNU GPL.
# mié abr 11 14:30:08 CEST 2007
echo hola mundo
Página 34