Comienza Contenido

El lenguaje interpretado Bash

El interprete Bash es algo más que una simple consola. Es un lenguaje interpretado de programación que ayuda al administrador a realizar la mayor parte de las tareas necesarias, tanto en la automatización como en el arranque del sistema. Se utiliza especialmente (no exclusivamente) en sistemas Unix.

Objetivos

  • Realizar una programación básica en Bash
  • Entender un script típico de arranque y configuración

Clases

  • Introducción y Repaso
    • Qué es una shell y una consola Unix
    • Repasar:
    • El lenguaje Bash (Ver Documentación )
    • Proceso de Arranque del Sistema: inittab - nivel de arranque (scripts) - consolas (tty)- programa login - interprete del usuario
    • Entrada y Salida de Datos
      • Redirección: stdin, stdout, stderr
      • Tuberías o Pipes: |
    • Listas de Comandos
      • AND && : Sólo se ejecuta un comando si la salida del anterior es sin error, la lista de comandos para cuando hay un error
        		  # Sirve para ver dos argumentos
        		  [ ! -z "$1" ] && echo "Argumento #1 = $1" 
        		  [ ! -z "$2" ] && echo "Hay un Argumento #2 = $2"
        		
      • OR || : Se van ejecutando los comandos mientras la salida es falso o de error. El último comando en ejecutarse es el que devuelve verdadero
        		  # Borrará un archivo sólo si existe, si no existe sólo
        		  #ejecuta la primera comparación
        		  [ ! -f "$archivo" ] 
        		  || (rm -f $archivo; echo "Borré el Archivo \"$archivo\" .")
        		
    • Qué es un script
      • Primer Script Hello World! (archivo de texto con encabezado + ejecutable + exit)
      • Importancia del intérprete del shell ( /bin/bash, o /usr/bin/perl, o /usr/bin/tcl )
  • Lo básico del lenguaje
    • Comentarios: #
    • Variables
      • Variables: asignación y tipos (VAR="hola" o VAR=3.14) y ámbito (scope) de las variables)
      • Sustitución de variables ${VAR}
      • Variables Especiales: $#, $[0-9], $@, $?, $$, $!
      • Variables de Entorno: LOGNAME, HOME, IFS, PATH, PS1, PS2, TERM, etc
      • Gestión de Variables de entorno: env, set, unset y export
    • Funcionamiento de las cadenas
      • Uso de las comillas dobles ( " ) , simple ( ' ) y comilla hacia atrás (backstick)
      • Caracteres de escape y Especiales (\n,\r,\t,\v,\b,\a,\") de echo
    • Características Básicas
      • Blank. Separación por espacios y/o TAB
      • Word. Tokens, conjuntos de caracteres delimitados
      • Name. Identificadores
      • Metacharacter. Caracteres con funcionamiento especial | & ; ( ) < > space tab
      • Control operator. || && ; ;; & ( ) | <newline>
      • Palabras Reservadas (muy pocas)
    • Entrada de Datos: comando read y línea de comandos ($0, $1 ...)
  • Sentencias de Control y Repetitivas
    • Expresiones y Comparación
      • Expresiones Aritméticas: (( expresión )) y con [expresion ]
      • Expresiones Condicionales:
        • Sintaxis Test expression ó [expression] (para un operando o dos)
        • Ejemplos de Opciones:
          • evaluación de cadenas (-z, -n, cadena1 = cadena2, cadena1 != cadena2)
          • evaluación de archivos( -d, -x, -e, fichero1 -ot fichero2)
          • evaluación aritmética (-lt, -eq, -ge) y evaluación lógica (-o, -a)
    • Repetitivas : for...do...done, while...do...done
      		for valor in variable
      		do
      		comandos
      		done
        
      		#Sintaxis de la sentencia while
      		while expresion
      		do
      		comandos
      		done
      	      
    • Control de Flujo:
      • La fundamental: if ... then ...else ...fi
        		  
        		  if [...]
        		  then
        		  # if-code
        		  else
        		  # else-code
        		  fi
        		  
        		  -- También valdría --
        		  
        		  if [ ... ]; then
        		  # hacer algo
        		  fi
        		
      • Selección multiple: case
        		  case value in
        		  patron1) comando1
        		  comando2;;
        		  patron2) comando3
        		  comando4;;
        		  ....
        		  ....
        		  esac
        		
  • Funciones y Otras sentencias
    • Funciones
      • Qué son
      • Sintaxis: llamada (nombre_funcion arg1 arg2 ...) y definición (nombre_funcion() { ... })
      • Entrada y Salida de valores: argumentos de entrada ($1 ... $9) y de salida (return)
      • Archivos de Funciones: Librerías
      • Cargar una librería: . ./libreria.lib (No llevan encabezado de shell)
    • Otras Sentencias:
      • Reglas de Expansión:
        • caracteres comodín (patrones:[],*,?)
        • de variables/parámetros (', ")
        • de llaves{}
        • de comandos/orden
        • aritmética $((expresion)) ó $[expresion]
        • división de palabras (IFS)
      • Comando shift: Manejo de argumentos como una lista, va desplazando los argumentos
      • select (fabricación de menús). Muestra una secuencia de argumentos descritos en una lista
        		  # Si no se pone la lista, se toman los argumentos de 
        		  # entrada al script y/o la función, es decir #@
        		  # Si no se pone break, sigue pidiendo datos
        		  # Se recomienda modificar la variable PS3 (del entorno)
        		  
        		  select variable [in lista] 
        		  do
        		  secuencia de comandos
        		  break 
        		  done
        		
    • Revisar un Ejemplo Completo
  • Ejemplos en el uso de Scripts para administración
    • Archivos de Configuración: /etc
    • Scripts de Arranque del sistema: /etc/init.d/ y /etc/rc#.d (# es de 1 .. 6)
    • Scripts de Configuración de Terminal: .bashrc, .bash_logout, .bash_profile

Actividades

  1. Repaso Consola e Introducción
    • Introducción y Repaso
      1. Uso del manual en línea (páginas man e info)
      2. 100 ejercicios linux
      3. Uso de grep: buscar texto, expresión regular, contar líneas
    • Scripts Básicos (I)
      1. ejercicio1.sh. Que muestre en pantalla la cadena Hola
      2. ejercicio2.sh. Qué muestre Hola soy el usuario tal y estoy en el sistema tal
    • Scripts Básicos (II)
      1. ejercicio3.sh. Que muestre el número de usuarios del sistema y el número de procesos
      2. ejercicio4.sh. Que muestree el nombre del usuario que se pasa como argumento
      3. ejercicio5.sh. Que muestre los usuarios conectados y las últimas cinco líneas del registro de incidencias (archivo /var/log/messages u otro similar)
  2. Repetición y control de flujo
    • Scripts Básicos (III)
      1. ejercicio6.sh. Que cambie el nombre a los archivos de texto (termnados en txt) y le añada: .texto. Por ejemplo, el archivo file.txt se convierte en file.txt.texto. Ojo, hacedlo en un directorio de prueba.
      2. ejercicio7.sh. Que tome un número desde la consola y vaya escribiendo números de forma decreciente hasta llegar a 1.
      3. ejercicio8.sh. Que muestre los archivos de un directorio cualquiera, que indique el usuario, poniendo un número antes. Por ejemplo: El archivo número tal es el tal. Después añadirle una cadena que diga si son más de 20 archivos o menos.
      4. ejercicio9.sh. Que pruebe al menos 4 comparaciones del comando test
  3. Uso de Librerías y Ejemplos reales
    • Aprender a manejar librerías
      • Realizar las funcionalidades de los scripts anteriores con funciones y cargarla desde el script (funciones.lib)
      • Intercambiar esta librería entre alumnos y grupos y tendrá que funcionar
    • Entender Scripts
  4. Repaso y Scripts Avanzados
    • Scripts de Utilidad para administrar el sistema
      • ejercicio10.sh Realizar una librería de funciones (monitorear_sistema.lib) para revisar el uso de CPU, el uso de Memoria y el uso de los sistemas de ficheros.
      • ejercicio11.sh Controlar los errores debido a falta de privilegios y dar los mensajes correspondientes al usuario. Por ejemplo, mostrar usuarios del sistema a los que se pueda acceder a su HOME y mostrar usuarios que tengan archivos mp3 o avi en su HOME.
      • analizar_directorios.sh. Este script servirá para realizar un análisis del número y tipo de documentos en el árbol de directorios especificado como argumento. Además se pasarán por argumentos las extensiones que queramos analizar. Por ejemplo: analizar_directorios.sh /home/cesareo/www jpg gif html txt me hará un informe del directorio /home/cesareo/www y todos sus subdirectorios y me hará un informe según el tipo de archivos (cuantos son, en qué proporcion o lo que veáis oportuno). Además este informe lo enviará por correo electrónico (comando mail) a un usuario determinado (en una variable)
      • analizar_sistema.sh. Es un script un poco más elaborado que el ejercicio10 y que haga un informe del sistema en ese momento (procesos, memoria, almacenamiento, usuarios, etc) y lo envíe por mail a un usuario determinado.
  5. Realizar un programa que simule una agenda telefónica
    • Gestionar una libreta de direcciones (Agenda)
    • Funcionalidad: Añadir Registros, Buscar Registros y Borrar Registros
    • Extra: Editar/modificar Registros

Duración del Curso

El esfuerzo estimado del curso es de 1 crédito ECTS. Unas 30 horas de dedicación.

Recursos a Utilizar