Programación shell-scripts 1 LA SHELL Un gran número de utilidades y herramientas de administración están realizadas mediante ficheros de ordenes del interprete de comandos de Unix (Shell). A lo largo del la evolución de este S.O. han aparecido distintas versiones de Shell siendo la Cshell (csh) y Kshell (ksh), las más utilizadas junto a la Bourne shell (sh), la shell originaria. El sistema GNU/Linux utilizan por defecto la shell Bash, (Bourne-Again shell) desarrollada por FSF (Free Software Fundation). Este intérprete de comandos incluye la características tanto de la C-shell como K-shell La shell es el programa más del sistema que encargado de interpretar las órdenes que introduce el usuario, buscar el comando y controlar su ejecución. Esquema de ejecución de la Shell: MIENTRAS NO TERMINAR Leer línea de comando SI línea termina en & arrancar proceso comando SI NO arrancar proceso comando esperar terminación FIN SI FIN MIENTRAS $ comando (espera) $ comando & (sin espera) En 2º plano o background Por omisión cuando termina la shell terminan todos su procesos asociados, nohup permite que continúen mostrando el resultado en un fichero Manejo del historial de ordenes en bash: Movimiento en la línea de orden Flechas del cursor!! ultimo!cadena -- Ultimo que empiece por cadena Formatos de ordenes: $comando arg1 arg2 - Ejecutar varios comandos en una sola línea $comando ; comando ; - Ejecutar un comando que ocupa más de una línea $comando parametro1 \ Para que no interprete el salto resto de parámetros - Ejecutar uno o varios comandos en segundo plano $comando & $(comando; comando ) & - Ejecución condicionada $ comando1 && comando2 Si comando1 hace comando2 $ comando1 comando2 Si falla comando1 hace comando2 Caracteres especiales en bash En los parámetros se pueden utilizar caracteres comodines * Cualquier carácter. $cat *test*
Programación shell-scripts 2? Un carácter $ls facturas.200? [] Un conjunto de caracteres [1-8][a-b][aeiou] $ls [aa]* Caracteres de redirección Todo proceso tiene 3 ficheros abiertos stdin 0, stdout 1, stderr,2 > Redirección de la salida estándar < Redirección de la entrada estándar >> Añade a la salida estándar 1> Salida estándar 2> Salida estándar de errores 2>&1 Mezcla la salida estándar y la errores conecta la salida de un comando con la entrada del otro Ej.- $ who sort la salida de un comando es la entrado del otro Caracteres de control de proceso <ctrl.> C Termina el proceso activo <ctrl.> D Final de fichero o Fin de sesión <Ctrl.> Z Suspende la ejecución de proceso activo la orden $fg trabajo reanuda el trabajo la orden $jobs nos muestra los trabajos arrancados <ctrl.> S Detiene la salida por pantalla <ctrl.> Q Reanuda la salida por pantalla %1 : Primer tarea en segundo plano %xxx : Tarea en segundo plano con el comando xxx ALIAS - Versión resumida de una orden Mostar alias Definir alias ll="ls -l" alias l ="ls -F" Elminar unalias ll VARIABLES DE LA SHELL Definición de variables (Todos son texto) nombre=valor nombre=`comando` Toma la salida de ese comando Consultar su contenido $nombre o ${nombre} Mostrar todas las variables definidas $set
Programación shell-scripts 3 Elimina una variables $unset nombre Por convenio se suele definir en mayúsculas Variables de entorno. La shell tiene predefinidas un conjunto más o menos extenso de variables de entorno que definen valores de configuración. Estos valores pueden ser utilizados tanto por la shell como por todos los procesos que arrancados por ella. Variables de entorno más comunes: PATH - Indica el camino y el orden de búsqueda de los comandos externos. ej - PATH=/usr/bin:/usr/local/bin:/home/jalb/bin:.: HOME - Directorio de trabajo del usuario (PWD) LOGNAME - Nombre del usuario (USER) TERM - Tipo de terminal MAIL - Archivo de correos no leídos o guardados (buzón o mailbox) PS1 - Prompt, Indicador del sistema ej -PS1=[\u@\h \W]\$ Indica: usuario@host Directorio_Actual $ Ficheros de configuración del usuario.bash_profile Archivo de ordenes de inicialización de bash.bash_login Archivo que se ejecuta al conectarnos al sistema.bash_logout Archivo que se ejecuta antes de desconectarnos.bash_history Archivo Historial de orden.bashrc Archivo de configuración personal Ficheros de configuración generales (shell) /etc/profile /etc/bashrc EJECUCIÓN DE PROGRAMAS SHELL (ficheros de ordenes) Como ejecutar un programa shell? $ bash <fichero de ordenes> $. <fichero de ordenes> Pero si el fichero tiene permiso de ejecución ( chmod +x $<fichero de ordenes>) y está el PATH si no./<fichero de ordenes> La primera instrucción puede indicar una shell específica #! /bin/bash El simbolo # -> Indica un comentario Mostrar un mensaje: echo "Mensaje..." echo -n "Mensaje" -- No salta de línea Leer un dato: read variable
Programación shell-scripts 4 Parámetros: $0,$1...$n Parámetro 1,2, 3 El 0 es el nombre del programa $* Todos en una sola cadena $@ Todos los parámetros en varias cadenas) $# El número de parámetros shift -- Desplaza los parámetros $2 -> $1, $# --> $# - 1 Otros: $$ Es el PID $? Valor devuelto por el último comando en exit Si un comando devuelve 0 (No hay fallos) es un valor Falso exit 0 Literales y variables: pepe=hola pepe="hola como estas" pepe="hola $nombre" --Sustituye $nombre por su valor pepe='precio 100 $dolares' --No interpreta el $ pepe=`wc -l datos.dat` --Guarda el resultado de la orden INSTRUCCIONES DE CONTROL Alternativa simple if orden o condición then ordenes else ordenes fi Alternativa múltiple (select) case cadena in patron1) ordenes;; patron2) ordenes;; patrona patronb) ordenes;; *) ordenes en otro caso (default) esac Ciclo Para for var in Lista do ordenes done Ciclo Hasta until orden o condición do ordenes done Ciclo Mientras while orden o condición do ordenes done Evaluar una expresión numérica o lógica: expr resu='expr $1 + 15' let variable=expresión Evaluaciones lógicas y condiciones sobre ficheros mediante el comando test, [ ] Comprobaciones sobre fichero: [ -e fichero ] Si existe el fichero [ -d fichero ] Si es un directorio [ -r fichero ] si se puede leer -r,-w,-x
Programación shell-scripts 5 Comparaciones de cadenas cadena1 = cadena2 cadena1!= cadena2 cadena1 > cadena2 Comparaciones de números numero1 <operador> numero2 -eq -ne -lt ( =,!=, < ) -le -gt -ge (<=, >, >= ) Operadores lógicos: -o (OR ) a (AND )! (NOT) if [ -r fichero1 ] then echo No se puede leer el fichero1 fi
Programación shell-scripts 6 Definición de funciones Las funciones deben estar definidas antes de su llamada según el siguiente formato function NombreF { comandos; } La función se invoca con su nombre: NombreF Puede trabajar con parámetros de la misma manera que la shell $1 NombreF parametros PROGRAMAS ASOCIADOS Existen diversas herramientas muy utilizadas a la hora de elaborar shell-scritps complejas para facilitar el proceso de ficheros grep,egrep,fgrep comandos de búsqueda de patrones awk - Lenguaje de análisis y procesamiento de patrones bc - Lenguaje para cálculo matemático de precisión sed - Editor de texto en modo comando, admite ordenes simulares al vi. perl - Lenguaje de scripts más moderno y potente que shell, enfocado al procesamiento de fichero de texto aunque actualmente se utiliza para todo, desde acceso a bases de datos como para construir CGI. Ej.- # Muestra el contenido del fichero menos las líneas de la 3 a la 6 cat fichero sed 3,6d # Muestra la salida del comando ls en distinto orden ls -l awk '{ printf("%-20s Permisos: %s Usuario:%s \n",$9,$1,$3) }' <Consular los ejemplos y ejercicios del la web>
Programación shell-scripts 7 LENGUAJE AWK Es un lenguaje interpretado, similar al C, pero enfocado al procesamiento de patrones, desarrollado por Alfred V. Aho, Brian W.Kernighan, y Peter J. Weinberger (AWK). - Tiene variables con tipo: carácter, reales, enteros, cadenas y tablas - las variables son dinámicas, se crean el momento que se asigna un valor. Estructura de un programa awk patrón { instrucciones }... patrón { instrucciones } El awk lee líneas del fichero de entrada estándar, comprueba sí la línea cumple con el patrón en ese caso ejecuta las instrucciones señaladas escribiendo en la salida estándar. El programa termina cuando se encuentra el final de fichero Ej- $ cat fichero awk '\pepe\'{ printf $0 } Imprime todas las líneas donde aparezca el patrón "pepe"!ojo $0 es toda la línea no tiene que ver con lo parámetros de la shell Otras formas de ejecución: $ comando awk -f programa.awk Recibe la salida del comando y la procesa según indique el fichero programa.awk mostrando el resultado por pantalla $ awk -f programa.awk datos.dat > ficheroresu Lee el fichero datos.dat, lo procesa según programa.awk guardando la salida en ficheroresu CAMPOS Y REGISTROS Por omisión cada línea representa un registro y cada registro se separa por un o varios espacios en blanco o tabuladores Cada campo en el registro de entrada puede ser referenciado por su posición, $1,$2.. $0 es el registro completo. El valor de un campo puede ser modificados. $1= "Hola" Los campos no necesitan ser referenciados por constantes: n = 5 print $n Muestrea el campo 5
Programación shell-scripts 8
Programación shell-scripts 9 PATRONES /cadena/ Procesa si aparece la cadena /^cadena/ Procesa si aparece la cadena al principio de linea /cadena$/ Procesa si aparece al final del la linea /cadena[a-c]/ Procesa si aparece la cadena seguida de a b c /cadena./ Procesa si aparece la cadena seguida de cualquier caracter /cadena[srz] Procesa si aparece la cadena seguida de s r Z /caden1 caden2/ Procesa si aparece la cadena 1 o la cadena2 Los patrones se pueden unir con condiciones: /cade1/ /cade2/ /cade1/ && /cade2/ Condiciones >,<,<=,>=,==,!= Podemos preguntar si un campo y un patrón $2 < $1 $3 == "Juan" $2~/patron/ Si el campo 2 concuerda con el patrón PATRONES ESPECIALES: BEGIN - Patrón inicial se hace procesa las ordenes antes de leer nada END - Patrón final se procesa una vez hayamos leído el final de fichero ACCIONES La principal: la función: print (sintaxis similar a C) Tiene numerosas funciones para manejar cadenas, así como matemáticas. VARIABLES PREDEFINIDAS FILENAME Fichero que se está procesando FNR - Nº de línea que se esta procesando dentro del fichero actual FS - Separador de campos, por omisión se supone que es espacio RS - Separador de registros, por omisión, el salto de línea. NF - Número de campos. OFS - Separador de campos de salida. ORS - Separador de registros de salida. $n - Valor del campo n en la línea / registro actual. $0 - Línea o registro actual completo
Programación shell-scripts 10 Ejemplo: Editamos el archivo: fichero.awk #!/usr/bin/awk BEGIN { system("clear"); printf " LISTADO DE ARCHIVOS \n"; printf "--------------------------------------------------------\n"; printf " Nombre Tamaño Usuario Permisos \n"; printf "--------------------------------------------------------\n"; nf = 0; nbytes = 0; } $1!= "total"{ nf = nf +1 nbytes = nbytes + $5 printf "%3d %-20s% 8d } %-10s %s \n",nf,$8,$5,$3,$1; END { printf "---------------------------------------------------------\n"; printf " Total:%4d ficheros, %10d bytes.\n ",nf,nbytes; } Ejecutaríamos el programa awk recibiendo como entrada la salida del comando ls: $ls l awk f fichero.awk