🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Red Hat Enterprise Linux - CentOS
  3. CentOS
Extrait - Red Hat Enterprise Linux - CentOS Puesta en marcha y gestión de servidores
Extractos del libro
Red Hat Enterprise Linux - CentOS Puesta en marcha y gestión de servidores Volver a la página de compra del libro

Scripts bash

Introducción

El scripting consiste en crear programas que automatizan un conjunto de tareas.

La gestión de sistemas requiere mucho tiempo, especialmente cuando implica tareas repetitivas en un gran número de máquinas. Ahorrar tiempo automatizando tareas en la máquina es esencial para el trabajo de cualquier buen gestor.

También es útil comprender e incluso personalizar los scripts que ya existen en la máquina.

Por último, se pueden realizar tareas complejas desde la línea de comandos con unas pocas palabras clave. ¿Por qué no crear entonces un alias para ellas si se van a utilizar con regularidad?

Por ejemplo, para pedir a un reproductor MP3 que reproduzca todas las canciones de un directorio:

alias playmp3='for i in /multimedia/mp3/*.mp3; do mplayer "$i"; done' 

Aunque existen muchos lenguajes de secuencias de comandos, como Perl y Python, en este capítulo presentamos el scripting con el shell bash. Es un shell práctico y fácil de utilizar, pero también es un potente intérprete de scripts.

Aquí presentamos las funciones más comunes, pero bash tiene una gran cantidad de opciones sumamente interesantes. Le invitamos a descubrirlas en las man page y en los sitios especializados, que están llenos de consejos y sugerencias. Además, existen otros shells y lenguajes que pueden satisfacer necesidades más específicas...

Requisitos previos

1. Transformar un archivo en script bash

Para que un archivo se convierta en un script, debe cumplir los dos siguientes requisitos:

1. El archivo debe ser ejecutable.

  • El derecho x debe estar asignado al archivo. Este derecho suele concederse a todos los usuarios:

chmod +x mon_script.sh 

Algunos gestores tienen la costumbre de dar a sus scripts la extensión indicativa .bash (o .sh, según el intérprete elegido), ya que así son más fáciles de reconocer.

2. El archivo debe comenzar con una secuencia específica de caracteres:

  • «shebang »: #!

Shebang (el tinglado) actúa como una etiqueta, indicando al sistema el shell que debe interpretar el script.

  • En la misma línea, la ruta exacta al intérprete de comandos que interpretará la secuencia de comandos (script). En nuestro caso, lo encontramos tecleando el comando which bash.

Por ejemplo, hemos aplicado estas condiciones al script miScript:

[root@cobb ~]# chmod +x miScript 
[root@cobb ~]# ls -l miScript 
-rwxr-xr-x. 1 root root 12 16 ene 21:49 miScript 
[root@cobb ~]# cat miScript  
#!/bin/bash 
mkdir /home/misScripts 

Observe que el script pertenece a root. También puede ser leído y ejecutado por cualquier usuario. Depende de usted establecer los derechos para que se adapten a sus necesidades.

El script ya contiene un comando para crear un directorio.

Dentro de un script, se escriben una serie de comandos que serán ejecutados en su totalidad, y en forma secuencial...

Tratamiento básico

1. Variables

Un script puede utilizar parámetros hard coded, es decir, parámetros almacenados tal cual en el script. Si van a cambiar con regularidad, se tiene que recorrer el script y editarse a mano con los nuevos valores. Sería más práctico preguntar al usuario por estos parámetros cuando se ejecute el script o almacenarlos en un archivo específico.

Las variables permiten diseñar scripts con esta flexibilidad.

Las variables son simples contenedores de datos con una etiqueta para facilitar su reconocimiento. Puede almacenar datos en una variable y actualizarlos.

Existen dos tipos principales de variables:

  • Variables definidas por el gestor dentro del script.

  • Parámetros especiales: son variables definidas por el sistema que se pueden manipular.

La mayoría de estos parámetros especiales están contenidos en variables de entorno, que se explican en el capítulo Gestionar usuarios y grupos - Usuarios y grupos.

Una variable se define de la siguiente manera:

nombre_director='Fischer' 

Aquí la variable se llama nombre_director y el dato que contiene es Fischer.

El uso de comillas se explica más adelante en la sección Escapar caracteres especiales.

El nombre de una variable puede contener números, letras y el guion bajo «_», pero no puede empezar por un número ni debe contener marcas diacríticas.

Mostrar el contenido de una variable

El comando echo imprime el texto que se le pasa como argumento:

[root@cobb ~]# echo Hola 
Hola 

Si se quiere mostrar el contenido de la variable mensaje, no se puede escribir simplemente:

[root@cobb ~]# echo mensaje 
mensaje 

Hay que indicarle al comando echo que acceda al contenido de la variable de mensaje, precediéndolo de $:

[root@cobb ~]# echo $mensaje 
Hola mundo 

Así pues, podemos mostrar el contenido de la variable o redefinirla:

[root@cobb ~]# echo $mensaje 
Hola mundo 
[root@cobb ~]# mensaje='¡Hasta la vista!' 
[root@cobb ~]# echo $mensaje 
Hasta la vista 

Por supuesto, se puede manipular una variable de otras formas. Por ejemplo, el siguiente comando busca el contenido de la variable en el archivo de usuario del sistema, con el comando grep:

[root@Ariadna ~]# grep $nombre_director /etc/passwd 
rfischer:x:1000:1000:Roberto Fischer:/home/rfischer:/bin/bash 
[root@Ariadna ~]# 

2. Pasar...

Procesamiento avanzado

1. Pruebas y comparaciones

Se pueden realizar varias pruebas sobre valores numéricos, cadenas de caracteres y archivos. Estas pruebas se pueden utilizar, por ejemplo, para comprobar la presencia de un archivo o directorio (tendrá que crearlos si es necesario) o el tipo de archivo; comparar PIDs, realizar un procesamiento basado en argumentos, etc. Se utilizan con las instrucciones condicionales y los bucles que aparecen a continuación, junto con el comando [ (o test).

Para más información, utilice el comando man test.

Comparaciones aritméticas

Los números, o las variables que contienen números, pueden cotejarse utilizando los siguientes símbolos de comparación:

  • -lt (less than): menor que.

  • -gt (greater than): mayor que.

  • -le (less or equal): menor o igual que.

  • -ge (greater or equal): mayor o igual que.

  • -eq (equal): igual a.

  • -ne (not equal): diferente de.

El siguiente ejemplo toma un número como argumento y lo compara, para evaluar una nota:

script note : 
#!/bin/bash 
note=$1 
if [ $note -ge 9 ]; then 
        echo '¡Bravo! ¡Buena nota!' 
else 
        echo 'Se puede mejorar' 
fi 

Resultado:

[root@cobb ~]# ./nota 9 
¡Bravo! ¡Buena nota! 
[root@cobb ~]# ./nota 7 
Se puede mejorar 

Las instrucciones condicionales if ... then ... else ... se explican más adelante en este capítulo.

Pruebas y comparación de textos

También podemos comparar cadenas de caracteres o variables que contengan cadenas de caracteres:

  • texto1 = texto2: igual.

  • texto1!= texto2: diferente (no igual).

  • texto1 < texto2: menor que (comparación por orden alfabético).

  • texto1 > texto2: mayor que (comparación por orden alfabético).

  • -n texto: texto no está vacío.

  • No se trata de una comparación, sino de una prueba, por lo que solo hay que indicar una cadena de caracteres inmediatamente después.

  • -z texto: texto está vacío.

  • Una vez más, se trata de una prueba, no de una comparación.

El siguiente ejemplo compara un nombre introducido como argumento con una cadena de caracteres:

script nombre: 
#!/bin/bash 
nombre =$1 
if [ $ nombre = Timoteo ]; then 
        echo Bonito...

Herramientas

1. Sed: editor de flujos

Sed (Stream Editor, editor de flujos) es una herramienta que permite modificar datos en la línea de comandos. Sed lee los datos línea por línea desde la entrada estándar o desde un archivo y escribe el resultado en la salida estándar, que se puede redireccionar a un archivo.

Uno de los principales usos de Sed es sustituir datos dentro del archivo que se va a procesar, pero este comando tiene muchas otras posibilidades, que llevaría muchas páginas de desarrollo. De hecho, Sed es una poderosa herramienta que merece ser estudiada.

Sed funciona de la siguiente manera:

  • lectura de una línea en la entrada;

  • procesamiento de la línea;

  • visualización de la línea procesada en la salida;

  • lectura de la siguiente línea.

En su comportamiento estándar, Sed no modifica el archivo que está procesando. Para que se produzca la modificación, la salida de Sed debe redireccionarse a un archivo o debe utilizarse una opción de Sed.

La sintaxis general de sed es:

sed -e '<comando>' <archivo> 

Es una buena práctica encerrar el comando entre comillas simples para aislarlo del shell y evitar que interprete ciertas expresiones regulares que se encuentren en él.

Opciones sed habituales

  • -e <comando>: esta opción define que un comando siga inmediatamente después. No es necesaria cuando solo hay un comando, pero las cosas se complican cuando se quiere multiplicar el número de procesos. En este caso, necesitará tantas opciones -e como <comandos> le sigan.

  • -n: este comando solo imprime las líneas afectadas por el proceso. Si no lo especifica, se imprimirán todas las líneas. Advertencia: la opción -n no debe situarse entre las opciones -e y <comando> (que están vinculadas).

Seleccionar las líneas

El comando se puede aplicar a determinadas líneas, que contengan un término de búsqueda, por ejemplo, o especificando los números de línea.

Para aplicar el proceso a una línea concreta, basta con especificar el número de línea antes del comando:

'<número_línea><comando>'...