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:
- Comandos Básicos y Avanzados
- 100 ejercicios linux: gnuutils, redirección de procesos y varios comandos en uno
- 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\" .")
- AND && : Sólo se ejecuta un comando si la salida del anterior es sin error, la lista de comandos para cuando hay un error
- 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
- La fundamental: if ... then ...else ...fi
- Expresiones y Comparación
- 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
- Reglas de Expansión:
- Revisar un Ejemplo Completo
- Funciones
- 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
- Repaso Consola e Introducción
- Introducción y Repaso
- Uso del manual en línea (páginas man e info)
- 100 ejercicios linux
- Uso de grep: buscar texto, expresión regular, contar líneas
- Scripts Básicos (I)
- ejercicio1.sh. Que muestre en pantalla la cadena Hola
- ejercicio2.sh. Qué muestre Hola soy el usuario tal y estoy en el sistema tal
- Scripts Básicos (II)
- ejercicio3.sh. Que muestre el número de usuarios del sistema y el número de procesos
- ejercicio4.sh. Que muestree el nombre del usuario que se pasa como argumento
- ejercicio5.sh. Que muestre los usuarios conectados y las últimas cinco líneas del registro de incidencias (archivo /var/log/messages u otro similar)
- Introducción y Repaso
- Repetición y control de flujo
- Scripts Básicos (III)
- 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.
- ejercicio7.sh. Que tome un número desde la consola y vaya escribiendo números de forma decreciente hasta llegar a 1.
- 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.
- ejercicio9.sh. Que pruebe al menos 4 comparaciones del comando test
- Scripts Básicos (III)
- 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
- Revisar Scripts Ejemplo ( /etc/init.d/networking y /etc/init.d/halt)
- Revisar Configuración del Terminal y hacer alguna modificación
- Aprender a manejar librerías
- 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.
- Scripts de Utilidad para administrar el sistema
- 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
- Información sobre Bash, en inglés:
- Repasar comandos GNUtils. Manual Gnu Text Utilities
- Manual Bash y Tutorial
- Programación Bash Avanzada
- Manual Grep (revisar info grep)
- Información sobre Bash, en español:
- Introducción a Bash
- Curso StarLinux 1, 2 y 3