Bisoños Usuarios de GNU/Linux de Mallorca y Alrededores | Bergantells Usuaris de GNU/Linux de Mallorca i Afegitons |
||||||||||
Dale potencia a tus bourne-shell scripts (2489 lectures)
Per Domingo Fiesta Segura, C2H5OH (http://www.telefonica.net/web/etanol-web) Creat el 18/08/2004 04:35 modificat el 18/08/2004 04:35 | ||||||||||
Aquí os propongo algunos trucos para programar scripts. Supongo que los que estéis interesados ya sabéis algo sobre shellscripts. Índice
2. Magia con el $IFS(2) 3. Manejo de descriptores de fichero(3)
3.2. Operaciones de redirección(5) 3.3. Modo de uso(6) 3.4. Otras redirecciones(7) 5. Colofón(9) Para hacer el artículo más breve y llevadero me limitaré a exponer ejemplos con alguna explicación ocasional. El objetivo es despertar vuestra curiosidad y que experimentéis por inciativa propia. Todo lo que aquí se comenta está explicado en la página man del sh(1) 1. Manipulando las expansiones de variablesYa que siempre estamos manejando texto que entra, texto que sale, tuberías y demás historias, existen algunos mecanismos prácticos antes de recurrir al Perl, Awk o Sed. Y de paso nos ahorramos algunos ciclos. Disponemos de unos pocos operadores para controlar la expansión de las variables del shell, aquí os describo los más sencillos.
Los operadores para eliminar prefijo y sufijo buscan la coincidencia más corta, existen versiones para buscar la coincidencia más larga: ${variable##prefijo} y ${variable%%sufijo} respectivamente. Además, donde indicamos el prefijo o sufijo podemos poner cualquier expresión que pueda ser evaluada por el shell. Como por ejemplo:
Hay unos cuantos más, pero estos me han parecido los más útiles. Vamos con unos ejemplos:
Otro ejemplo:
2. Magia con el $IFSIFS son las siglas de Inter Field Separator, que significa separador de campos. Se trata de una variable muy especial para el shell, en ella se encuentran todos los caracteres que pueden ser delimitadores de campo o de palabra. Viene a ser como el FS del awk Esta característica del shell no tiene mucho más misterio. Para verificarlo usaremos un ejemplo:
3. Manejo de descriptores de ficheroUna de las primeras cosas que se aprende a hacer con el shell (tanto interactivamente como en script) es utilizar las redirecciones de la entrada/salida estándar a ficheros alternativos. Imagino que sabéis lo que es un descriptor de fichero. Para los que no lo sepan basta con decir que es un índice de una tabla de información sobre ficheros abiertos que gestiona el sistema operativo para cada proceso; por eso el descriptor de fichero es un entero. 3.1. Introducción a redireccionesLas redirecciones no son más que operaciones sencillas sobre ficheros que podemos realizar desde el shell. Podemos abrir ficheros para lectura, para escritura desctructiva[1] (primero trunca y luego escribe), para escritura constructiva (abre y empieza a escribir desde el final) y para lectura/escritura. Normalmente es más fácil de entender cuando uno piensa en términos de entrada y salida de texto, pero en algunos casos resulta más cómodo imaginar las llamadas a sistema que se ejecutarán al interpretar la redirección. Si no se indican los descriptores de ficheros de forma explícita por defecto se asume 0 (entrada estándar) para las redirecciones de entrada (apertura de ficheros para lectura) y 1 (salida estándar) para las redirecciones de salida (apertura de ficheros para escritura). También se toma 0 por defecto para lectura/escritura. 3.2. Operaciones de redirecciónLas que todos conocemos. Abriendo ficheros y asociándolos a descriptores. Recordemos que si no se indica el descriptor se toma 0 para entrada o entrada/salida y 1 para salida y append.
También podemos duplicar, cerrar y mover descriptores de ficheros que ya estén abiertos.
Tanto copia, original, nuevo como descriptor deben de ser (o deben expandirse a) un número entero que se corresponda con un descriptor abierto. Nuevamente insistir en que si el número antes del operador de redirección (<, >) no está presente se tomarán los valores por defecto 0 ó 1. 3.3. Modo de usoA niveles prácticos, los operadores para copiar, cerrar y mover descriptores no tienen en cuenta que el fichero sea de lectura y/o escritura. Es decir, si tenemos el descriptor 5 abierto y lo queremos copiar al 7 da igual que hagamos 7<&5 o 7>&5 . Sólo resulta útil diferenciar < de > cuando el parámetro de la izquierda es la entrada o la salida estándar[2].
Veamos ahora cómo utilizar los descriptores de ficheros con un ejemplo:
Otro ejemplo de propina:
Podéis encontrar más ejemplos sencillos y demostraciones prácticas que ilustran las ventajas en tiempo de ejecución que existen al utilizar descriptores, aqui(10). 3.4. Otras redireccionesQuizá muchos se pregunten: Si hay un operador >>, ¿también hay un <<?. Pues, efectivamente, lo hay. Pero su uso tiene poco que ver con lo hasta ahora mencionado. El operador << se utiliza para crear lo que se conoce como here document que no es más que incrustar un fichero de texto (para ser utilizado como entrada estándar) dentro de un script. Por ejemplo:
[1] Sé que no es un adjetivo muy apropiado. [2] Para aquellos que necesiten una explicación más técnica, pueden empezar por man dup2. 4. Manejo de señalesOtra funcionalidad que no se enseña de buenas a primeras en los tutoriales de scripting es la gestión de señales desde un shell script. Al contrario de lo que pueda parecer, es sencillísimo. El secreto reside en el uso del comando trap para asociar señales a comandos. Como ya he dicho, es un comando muy sencillo: trap argumento señal1 señal2 señal3 ... El parámetro argumento es el comando que se debe ejecutar cuando se reciba(n) la(s) señal(es) indicada(s) a continuación de éste. Si argumento no se indica o es un guión (-) se restaura el comportamiento original asociado a la(s) señal(es) indicada(s). Si argumento es la cadena vacía ("" ó '') la(s) señal(es) indicada(s) son ignoradas por completo, siempre que sea posible. Si el comando indicado por argumento contiene espacios tendréis que entrecomillarlo debidamente. Para verlo más claro, un ejemplo:
5. ColofónY, a partir de aquí sólo es probar, probar y probar. Cuanto más se aprende es preguntándose uno mismo: ¿Es posible hacer esto o lo otro?. Y probar. Además, programar scripts es pura diversión cuando uno le coge el truquillo. Lista de enlaces de este artículo:
| ||||||||||
E-mail del autor: linuxdummybudy _ARROBA_ yahoo.es Podrás encontrar este artículo e información adicional en: http://bulma.net/body.phtml?nIdNoticia=2080 |