PROGRAMACIÓN DEL INTÉRPRETE DE COMANDOS DE UNIX/LINUX Sesión 16/05/2016
Desarrollar aplicaciones sencillas Scripting original: juntar varia órdenes e invocar su ejecución secuencial bajo un sólo comando. Desde el plano de la programación, no es compilado. Incluso admite cierta interacción (input). Ejecución lenta: es intérprete y en las últimas capas del esquema multinivel del computador. El intérprete de comandos puede ser Un shell (bash, csh, ) Shell scripting. Un lenguaje de programación (awk, perl ) Admite comandos para una aplicación/programa concreta (gnuplot, bc ) Aunque ya no es lo habitual, se pueden encontrarse aplicaciones muy complejas. Hoy en día, se programan en python o c++, ya que está incorporado en el propio S.O. 2
Shell scripting (bash) Los comentarios comienzan por # La primera línea indica el intérprete de comandos que debe usarse #!/bin/bash #!/bin/csh #!/usr/bin/gnuplot En un principio, podría pensarse que, en un script, la ejecución de los comandos en él contenido, es puramente secuencial. Esta es la opción por defecto, pero admite bifurcaciones condicionales (if) y bucles for, while, etc. Cada línea es una orden, formada por orden [-opciones] [argumentos] Atención a los separadores Cuando en la página del manual un elemento aparece entre corchetes, quiere decir que es opcional, pero si va sin corchetes, es obligatorio. 3
Primer ejemplo #!/bin/bash echo Mi nombre es: \'$USER\' y mi búsqueda de ejecutables por defecto es: echo $PATH 4
Shell - Variables Declaración Nombre_variable=valor Si el valor contiene separadores, hay que entrecomillarlo. Variables pueden ser locales o exportadas a los intérpretes hijos. Un intérprete de comandos puede invocar a otro intérprete de comandos. El valor almacenado en una variable se obtiene anteponiendo el símbolo $ al nombre de la variable. Ver variables: echo $nombre_variable Se recomienda escribir ${nombre_variable} Uso de comillas: Las variables dentro de las comillas dobles se expanden por su valor. Las variables dentro de comillas simples no se expanden por su valor. El acento grave reemplaza las comillas por el resultado de la ejecución del comando entre comillas. Leer variables desde teclado de forma interactiva con el comando read. Los metacaracteres son interpretados por el Shell de manera especial <> `$ * @ #? & \ Para inhibir esa interpretación, hay que entrecomillarlos con o precederlos de \ 5
Segundo ejemplo Mostrar todos los dígitos de 0 a 9. Lo mismo, pero con todos los número decimales de dos cifras solamente. Igual, pero con una pausa cada diez. (man read) 6
Shell Ejecución de Scripts Recordar el significado de la variable PATH. El comando which Ejecución de scripts: sh f nombre_script sh < nombre_script./nombre_script Argumentos por línea de comandos a los scripts $0, $1, $9 Se puede acceder a más de 9 argumentos con el comando shift. Todos los argumentos $* Cuántos argumentos? $# Dar un valor de retorno con return N Dar un valor de salida al script: exit N Recoger el valor de salida del último comando/script $? 7
Ejemplo de argumentos #!/bin/bash echo $0, " $2", $4 echo $1, $3, $5 echo echo $* echo echo y tiene " $#" argumentos en total 8
Shell Control de flujo if expresión then comandos else comandos fi for var in [listavalores] do comandos done while expresión do comandos done until expresión do comandos done case cadena-prueba in patrón1) comandos1 ;; patrón2) comandos2 ;; patrónn) comandosn ;; esac break sale del bucle continue vuelve a evaluar la condición del bucle
Shell - Expresiones Las expresiones (condiciones en if/do/while) se evalúa con la orden test seguida de la expresión en sí, o bien escribiendo la expresión entre corchetes. if test $a lt $b then echo $a else echo $b fi o if [$a lt $b] then numéricas (int) sobre archivos -eq == -d Directorio? -lt < -f fichero? -le <= -r permi. lectura? -gt > -w perm. de escrit.? -ge <= -x permi. de ejec.? -ne <> -s archivo no vacío? Cadenas s1=s2 cadenas iguales? -z s1 cadena vacía? Lógicas -o (or) -a (and)! (not) 10
Ejemplo: Hacer un script que halle el número más pequeño y lo muestre por pantalla. Los datos serán suminstrados mediante read. 11 Otro script que calcule la suma de los dígitos dedimales por separado que conforman un número entero positivo. Por ejemplo: $./suma_digitos_decimales.sh 4567 $ El resultado es 22 Es decir tiene que sumar 4+5+6+7=22
Ejemplo: Hacer un script que compruebe si lo que se le pasa como primer parámetro, es un directorio, o no. En caso afirmativo que escriba: <1er. parámetro> es un directorio En caso contrario: <1er. parámetro> NO es un directorio 12
Shell Aritmética (Informativo) Aritmética entera expr 1 + 2 # El resultado va a la salida estándar Aritmética en punto flotante con la aplicación bc, que es capaz de leer la entrada estándar o de un fichero. Es totalmente programable. $ echo sqrt(10)+55.6 bc $ echo 'scale=10;sqrt(10)' bc 13
Shell Más sobre variables Hay variables predefinidas PATH, HOME, PWD, TERM, DISPLAY Vectores Empieza por el elemento 0. Los elementos del vector no tienen que ser consecutivos. a[1]= uno echo ${a[1]} a[7]= final echo ${a[2]} Los valores intermedios no están inicializados (null) echo ${a[*]} # muestra todos los valores. 14
Shell Más sobre variables Las cadenas de caracteres (strings) s=abcdefg echo ${s:3:2} # dos caracteres después del tercero de. echo ${#s} # La longitud de la cadena: 8 Ejemplo: Hacer una matriz de 6 elementos que almacenen los cuadrados de los 6 primeros naturales impares. Los muestre por pantalla 15
Shell Depuración de programas Se coloca set -x al principio del código que se quiere depurar Set +x al final de dicho código La salida muestra cada comando ejecutado después de sustituir los valores de las variables. Ejercicio: utilizar esto para ejemplo del condiconal es menor. 16
grep Búsqueda de texto Global Regular Expression Print Busca líneas dentro de un fichero de texto que contienen un patrón. Podemos hacer que coincidan exactamente en mayúsculas/minúsculas. Podemos buscar las líneas que no contengan ese patrón [-v]. Ejemplo grep i c*sa fichero 17
Ejemplo: Utilizando la orden ll, mostrar un listado de todos los directorio que cuelgan del actual. En previsión de que sean muchos y no dé tiempo a ver esta información completa, muéstrese pantalla a pantalla. Lo mismo que al principio, pero que sólo muestre los que comiencen por una determinada cadena de caracteres, como por ejemplo, los que empiecen por a. Los que empiecen por pp seguido de un dígito impar con extensión.txt Igual que lo anterior, pero sin restricción en la extensión 18
Expresiones regulares(informativo) Nombre Carácter Significado Cierre * (asterisco) El elemento precedente debe aparecer 0 o más veces Cierre positivo + (símbolo de la suma) El elemento precedente debe aparecer 1 o más veces Comodín. (punto) Un carácter cualquiera excepto salto de linea Condicional? (interrogante) Operador unario. El elemento precedente es opcional OR (barra vertical) Operador binario. Operador OR entre dos elementos. En el lenguaje aparecerá o uno u otro. Comienzo de línea ^ (ángulo superior) Comienzo de línea Fin de línea $ (símbolo del dólar) Fin de línea [...] (caracteres entre corchetes) Conjunto de caracteres admitidos [^...] (caracteres entre corchetes) Conjunto de caracteres no admitidos Operador de rango - (guión) Dentro de un conjunto de caracteres escrito entre corchetes, podemos especificar un rango (ej., [a-za-z0-9]) (...) (elementos entre paréntesis) Agrupación de varios elementos Carácter de escape \ (barra inversa) Debido a que algunos de los caracteres del alfabeto coinciden con meta- caracteres, el carácter de escape permite indicar que un meta-carácter se interprete como un símbolo del alfabeto Salto de línea \n (barra inversa + n) Carácter de salto de línea Tabulador \t (barra inversa + t) Carácter de tabulación 19
Ejemplo Ejecute la orden siguiente: for fichero in *; do echo $fichero; done Construir un script que recorra todos los elementos de un directorio y muestre aquellos que tiene permiso de ejecución. 20