1.5k likes | 1.7k Views
Programación en Shell. Rodrigo Santamaría Vicente. Dpto. Informática y Automática. Contenidos. Introducción a la shell Programación básica en bash Programación avanzada sed y awk Referencias. Introducción a la Shell. ¿Qué es una shell? Tipos de shell Usos de la shell
E N D
Programación en Shell Rodrigo Santamaría Vicente Dpto. Informática y Automática
Contenidos • Introducción a la shell • Programación básica en bash • Programación avanzada • sed y awk • Referencias
Introducción a la Shell
¿Qué es una shell? • Tipos de shell • Usos de la shell • Variables de entorno
¿Qué es una shell? • Interfaz entre el Sistema Operativo y el usuario • Dos tipos • Gráfica • Línea de Comandos • CLI (Command Line Interface) • intérprete de comandos, terminal, consola shell (ʃɛl/) – noun 1.a hard outer covering of an animal, as the hard case of a mollusk, or either half of the case of a bivalve mollusk.
Shell de Línea de Comandos Generalmente con shell nos referimos a una CLI de Unix
Tipos de shell • Bourne shell (sh) • 1977. Stephen Bourne, Bell Labs. • C Shell (csh) • 1980. Bill Joy, Berkeley • Korn Shell (ksh) • 1980. David Korn, Bell Labs. • Bourne again shell (bash) • 1987. Brian Fox, GNU Project
Bourne Shell (sh) • La más antigua • No tiene características interactivas • Historia de comandos • Autocompletar nombres de ficheros • … • No tiene estructuras complejas de programación • Funciones • Case • …
C Shell (csh) • Sintaxis como el lenguaje C • No compatible con la familia Bourne • Capacidades interactivas • Pausar/reiniciar procesos • Historia de comandos • Operaciones matemáticas
Korn Shell (ksh) • Sustituye y es compatible con Bourne • Características interactivas como C, pero mejoradas • Añade edición de líneas de la historia • Ejecución más rápida
POSIX shell • Similar a ksh y utilizada por HP-UX • 95% compatible con Bourne shell • Como ksh, integra características de la csh, mejoradas (histórico de comandos, autocompleción, operaciones aritméticas…) • Las diferencias con bourne shell son menores • Las diferencias entre POSIX y ksh son mínimas: • http://docs.hp.com/en/B2355-90046/ch15s03.html
Multiplicidad de las shells • Ante el mismo sistema operativo, podemos tener varias shells activas al mismo tiempo • Gráficas y de texto (Linux) • De texto en distintos terminales • $$ indica el PID de la shell en ejecución • ps para ver los PID de todos los procesos en ejecución • $SHELL nos indica el tipo de shell que estamos usando • /etc/shells es un fichero con todas los tipos de shell disponibles en el sistema
Usos de la sh • Intérprete de comandos: ejecutar comandos desde el intérprete • Scripts: ejecutar secuencias de comandos desde un fichero • Programas: control del flujo de ejecución de secuencias de comandos (bucles, condiciones, variables, etc.) desde un fichero
Intérprete de comandos • Sintaxis típica • comando [-]opciones parámetros • Opciones: dependen de cada comando y alteran su funcionamiento • Parámetros: variables de entrada que necesita el comando, separadas por espacios • ps –fu • ls file.txt • grep “*.txt” ../folder
Procesamiento secuencial • El sistema completa cada comando antes de ejecutar el siguiente: date ps –fu who
Procesamiento secuencial • date; “ps –fu”; who
Procesamiento no Secuencial • Cada programa se ejecuta sin esperar a que el anterior termine date & “ps -fu” & who date ps who ps date who
Redirección de E/S • > Escribe la salida estándar a fichero • < Lee la entrada estándar de fichero • >> Añade la salida estándar a un fichero existente • > y >> crean el fichero si no existe • < da error si el fichero no existe
Tuberías (pipes) • Conectan la salida de un programa a la entrada del siguiente • ls | more ls > temp; more < temp
Shell script • Simplemente, poner en un fichero órdenes que se puedan ejecutar en el intérprete de comandos • Para editar el fichero, se puede usar cualquier editor (típicamente vi) • Ejemplo: editar un fichero con la línea: • date; who; ps uf; du /home • Ejecutar con: • sh nombreScript
Trucos • Si se usa vi, lo ideal es tener dos consolas abiertas, una para edición y otra para ejecución • Para poder ejecutar un fichero como script, debemos tener permisos de ejecución • chmod +x nombreFichero • Otros modos de ejecución: • ./nombreScript • nombreScript si se encuentra en el PATH
Fichero .profile • Script(s) que se ejecuta automáticamente al hacer login • Se encuentran en el directorio raíz del usuario • Establece el “entorno” de trabajo
Variables de entorno • Para acceder al valor $VAR • Para imprimir el valor echo $VAR • Para cambiar el valor VAR=valor • Los cambios a las variables de entorno no se mantienen para otras shells a no ser que se incluyan en el .profile o se utilice export • Ejercicio • Establecer en el PATH la ruta de la carpeta donde almacenaremos los scripts
Programación básica en Bourne Shell
Introducción • Variables • Parámetros • E/S • Condiciones • Bucles • Funciones • Operaciones aritméticas • Depuración
Programación Shell • Scripts donde introducimos conceptos propios de la programación • Variables • Parámetros • Condiciones • Bucles • Funciones • Operaciones aritméticas • Los comandos disponibles de la shell actúan como nuestra biblioteca de funciones
Por qué programar en shell? • Requiere un cierto esfuerzo programar en shell, así que antes debemos plantearnos si nos va a ser útil • Razones para programar en shell • Porque nos lo mandan (como es el caso) • Porque sabemos programar: el esfuerzo necesario para aprender es muchísimo menor • Porque en nuestro trabajo nos va a ser útil: • Administradores: tareas complejas o automatizables • Hackers: tareas rápidas • Programadores usuarios: tareas que se repiten
Cuándo programar en shell? • Llamadas frecuentes a funciones del sistema • Llamadas repetitivas a una función del sistema • Programas cortos • Si un programa pasa de una página, probablemente la shell no sea la mejor solución • Cuanto mejor conozcamos la shell y sus comandos, más la usaremos y mayor útil será la programación en shell
Variables • Además de las variables de entorno podemos declarar variables locales al script • No tienen tipo, no hay que declararlas o inicializarlas previamente • Asignación: variable=valor • Acceder al valor: $variable
Variables (II) • Para diferenciar el valor de variables en cadenas, usamos { }: • dir2=/home/rodrigo/curso • cat ${dir2}/lista.txt • Normalmente, se abre una shell para ejecutar el script • si queremos que se ejecute en la shell en que estamos, y así luego tener disponibles las variables, usamos (.): . programa
Parámetros • Un script puede tener parámetros de entrada igual que cualquier comando • script par1 par2 par3 … • Para acceder a sus valores usamos • $1, $2, $3, … $9 • $0 es el nombre del comando • $*, $@ devuelven todos los parámetros separados por espacios
Parámetros (II) • Número de parámetros: $# • Si tenemos más de 9 parámetros, tenemos que usar desplazamientos: shift [n] • Donde n es el número de pasos que desplazamos • Si no se especifica n, se comporta como shift 1
Gestión E/S: echo • Salida por consola: echo cadena
echo: códigos de escape • Se introducen con la secuencia de escape \033 • Cada código tiene la sintaxis: [parametroAcción • parámetro es un número • acción es una letra • Ejemplo: • echo –e “\033[34m Hola”
Gestion E/S: read • Entrada de consola: read var • En ksh también se puede hacer así: • read fich?“Introduce nombre de fichero: ”
Gestión E/S: exit • Salida del script: exit código_fin • 0 terminado con éxito • 1 error interno • 2 error por sintaxis de llamada • $? Devuelve el código de salida del último comando ejecutado
Expresiones regulares • Manejar con soltura las expresiones regulares es fundamental para programar en shell y manejar comandos como grep, sed o awk.
Expresiones regulares (II) • Más expresiones regulares
Expresiones regulares (III) • Extensión POSIX
Condiciones • if lista_condiciones1 • then lista_comandos1 • elif lista_condiciones2 • then lista_comandos2 • … • else lista_comandosN • fi
Test • Para chequear condiciones se usan [ ] en la sintaxis del if (equivalente al comando test)
Test Ficheros