Linux-Scripts (Incompleto)
Linux-Scripts (Incompleto)
CONTENIDO
NUESTRO PRIMER SCRIPT........................................................................................................... 2
USO DE VARIABLES EN LOS SCRIPTS. EXPANSIONES. ................................................................... 3
$(ORDEN) ............................................................................................................................... 4
$((OPERACIÓN ARITMÉTICA)) o $[OPERACIÓN ARITMÉTICA] .................................................. 5
ORDEN LET ............................................................................................................................. 5
ORDEN BC .............................................................................................................................. 6
ESTRUCTURAS CONDICIONALES. ................................................................................................ 7
IF............................................................................................................................................ 7
IF..ELSE................................................................................................................................. 10
IF..ELIF..ELSE ........................................................................................................................ 11
CASE .................................................................................................................................... 14
ESTRUCTURAS ITERATIVAS. (BUCLES). ...................................................................................... 16
FOR ...................................................................................................................................... 16
WHILE Y UNTIL ..................................................................................................................... 20
Shell Scripts Linux
Vamos a crear nuestro primer script: para ello, crea un fichero de texto de
nombre primero.sh, con el siguiente contenido: Comentado [JR1]:
#!/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.
Y 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).
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 que, si las quitáis, 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.
Página 2
Shell Scripts Linux
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.
También podemos hacer lo contrario, escribir una sola línea en varias. Para ello
usamos el carácter contrabarra (\) cuando queramos que nuestra línea se
“rompa” y continúe en la línea de abajo.
echo esto \ es una sola línea \ aunque ocupe 3 en pantalla. # esto es una
línea escrita en tres.
Las variables de los shell scripts son muy simples, ya que no tienen tipo definido
ni necesitan ser declaradas antes de poder ser usadas.
#!/bin/bash
MENSAJE=”Hola Mundo”
echo $MENSAJE
Este script realiza exactamente la misma función que el anterior, pero usando una
variable.
Se llama expansión al proceso que lleva a cabo el shell antes de ejecutar una
orden.
Página 3
Shell Scripts Linux
Hay varios tipos de expansiones, que iremos viendo a lo largo de este tema.
$(ORDEN)
La sintaxis es:
$ (comando) o `comando`
NOMBRE_FICHERO=”red”$(date +%d%m%y)”.conf”
cp /etc/network/interfaces $NOMBRE_FICHERO
El comando date nos da la fecha del sistema en el formato indicado con “+”,
siendo %d% el día, %m el mes y %y el año, todos con dos caracteres.
Página 4
Shell Scripts Linux
Por tanto, cuando queremos realizar operaciones aritméticas, podemos usar otra
expansión, que en este caso es $((operación aritmética)).
Esta expansión trata como una expresión aritmética lo que esté incluido entre los
paréntesis, la evalúa y devuelve su valor.
NUMERO=4
echo $[$NUMERO+3] # sería lo mismo poner echo $(($NUMERO+3))
Ejercicio: crea un script llamado suma.sh que sume el valor de dos variables y
muestre el resultado. Ejemplo de salida: 2 + 3 = 5
ORDEN LET
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 Módulo o Resto (%).
Página 5
Shell Scripts Linux
Ejercicio: crea un script llamado cuentas.sh que use las variables PRECIO (por
ejemplo 100) y COMENSALES (por ejemplo 5) y muestre por pantalla la siguiente
información:
ORDEN BC
Para explicar este comando, vamos a hacer una prueba: crear con nano un
fichero con nombre media.sh con el siguiente contenido:
La línea
MEDIA=$[ $SUMA / 3 ]
let MEDIA=SUMA/3
Podemos obligar a que bash trabaje con decimales utilizando un comando que
sirve como calculadora en Linux, este comando es bc, que admite un gran número
de parámetros, pero en este tema vamos a usarlo simplemente para indicar que
queremos obtener decimales en las operaciones.
Página 6
Shell Scripts Linux
Lo sustituiremos por
Vemos cómo debemos generar una salida con echo, donde 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, dobles paréntesis o usar let. El resultado de este
echo lo enviamos al comando bc –l mediante una tubería.
ESTRUCTURAS CONDICIONALES.
IF
if [ expresión ]; then
órdenes
fi
Página 7
Shell Scripts Linux
Hay que tener muchísimo cuidado con los espacios en blanco, como en los
corchetes, que llevan espacios en blanco tanto a izquierda como derecha. El
punto y coma sin embargo va pegado al corchete cerrado, y SIEMPRE hay
que poner espacios en blanco en las expresiones.
Ejemplo:
OPCION=”Fin”
OPCION_MAYUSCULAS=${OPCION^^}
if [ $OPCION_MAYUSCULAS=”FIN”]; then
echo “Terminado”
fi
Página 8
Shell Scripts Linux
OPCION=”Fin”
OPCION_MINUSCULAS=${OPCION,,}
if [ $OPCION_MINUSCULAS=”fin”]; then
echo “Terminado”
fi
Los anteriores operadores sólo son válidos para comparar cadenas, si queremos
comparar valores numéricos, hemos de usar los siguientes operadores:
Ejemplo:
Página 9
Shell Scripts Linux
IF..ELSE
if [ expresión 1 ]; then
órdenes
else
órdenes
fi
Ejemplo:
Ejercicio: crea un script llamado ordena.sh que, dados dos nombres de personas,
metidos en dos variables, los ordene alfabéticamente y los muestre por pantalla.
Página 10
Shell Scripts Linux
IF..ELIF..ELSE
if [ expresión1 ]; then
Realizar si expresión1 es verdadera
else
realizar si todas las expresiones anteriores son falsas
fi
Ejercicio: crea un script llamado hijos.sh que, dado un número de hijos, indique
por pantalla: “Tiene 1 hijo”, “Tiene 2 hijos” o “Tiene 3 o más hijos”.
Por ejemplo, podemos usar la función test del bash, que funciona de la
siguiente forma:
Página 11
Shell Scripts Linux
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
Para hacer algunos ejercicios, vamos a explicar cómo le podemos pedir datos al
usuario.
El comando read también puede ser usado 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).
Ejercicio: crea un script llamado nota.sh que pida una nota por pantalla e
indique si el alumno está suspenso, aprobado, tiene un bien, un notable o un
sobresaliente.
Ejercicio: crea un script llamado impar.sh que pida un número por pantalla, e
indique si el número introducido es par o impar.
Página 12
Shell Scripts Linux
Ejercicio: crea un script llamado multiplo10.sh que pida un número por pantalla
e indique si es un múltiplo de 10 o no.
Ejercicio: crea un script llamado nombreJ.sh que nos pida un nombre por
pantalla y nos diga si dicho nombre comienza por la letra jota mayúscula.
Cuando hacemos un script de varias líneas, 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
Ejercicios:
1. Script que nos diga si en el directorio actual hay más de 10 ficheros o no.
2. Script que nos pida la altura de 3 personas en centímetros, y nos diga por
pantalla la mayor de esas alturas.
3. Script que nos pida 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 13
Shell Scripts Linux
CASE
Esta estructura nos permite ejecutar varias acciones, dependiendo del valor de
una variable o expresión.
Sintaxis:
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
Ejemplo:
Script que, dado un código postal, nos dice qué ciudad es.
#!/bin/bash
En el case, no solo podemos preguntar por valores directos, sino que también
podemos utilizar comodines.
Página 14
Shell Scripts Linux
#!/bin/bash
*)
echo "Código postal desconocido" ;;
esac
Otro ejemplo:
Ejercicio: hacer un script llamado 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 15
Shell Scripts Linux
Las principales estructuras iterativas que podemos usar en shell scripts son for,
while, until y select.
FOR
La variable va tomando los valores del conjunto, uno por uno, y por cada uno de
esos elementos, se repiten las órdenes dadas.
Los valores del conjunto se separan por espacios en blanco o retornos de línea.
En el siguiente ejemplo vamos a usar como conjunto, los nombres de los ficheros
con extensión sh del directorio actual:
Página 16
Shell Scripts Linux
Una orden muy utilizada con for es la orden seq, que produce una secuencia de
números, con las siguientes posibilidades.
seq último-número
seq primer-número último-número
seq primer-número incremento último-número
Página 17
Shell Scripts Linux
Ejercicio: crea un script llamado suma100.sh que sume todos los números del 1
al 100, es decir, 1+2+3+4+5…+100, y muestre por pantalla el siguiente mensaje:
“Los números del 1 al 100 suman … “
Ejercicio: Modificad el anterior ejercicio para que el script sume todos los
números, pero no entre 1 y 100, sino entre dos números que pida el script por
pantalla.
Desde la versión de bash 3.0 se introdujo un cambio en el for que permite utilizar
directamente rangos sin tener que usar la orden seq:
Desde la versión de bash 4.0 se introdujo otro cambio, que permite utilizar
también incrementos en los rangos, de la siguiente manera:
{INICIO..FINAL}
{INICIO..FINAL..INCREMENTO}
Página 18
Shell Scripts Linux
Veamos como ejemplo un script que nos muestra los números pares entre 2 y 40.
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.
#!/bin/bash
for programa in $( find ~ -iname “*sh” 2> /dev/null ); do
echo “copiando el script :” $programa
cp $programa /media/usbdisk
done
Página 19
Shell Scripts Linux
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
WHILE Y UNTIL
while [ expresión ]; do
órdenes # se repetirán MIENTRAS la expresión sea verdadera
done
until [ expresión ]; do
órdenes # se repetirán HASTA que la expresión sea verdadera
done
Página 20
Shell Scripts Linux
#!/bin/bash
Ejercicio: modifica el script doble.sh para que realice lo mismo, pero usando la
estructura until, en lugar de while.
Ejercicio: realiza un script que muestre por pantalla los números del 1 al 20,
usando una estructura while o until.
Página 21