Your SlideShare is downloading. ×
Bash prog-intro-como
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Bash prog-intro-como

199
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
199
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ´ ´Programacion en BASH - COMO de introduccionMike G (mikkey) disponible en dynamo.com.arTraducido por Gabriel Rodr´guez Alberich chewie@asef.us.es ıjueves, 27 de julio de 2000, a las 09:36:18 ART ´ Este art´culo pretende ayudarle a comenzar a programar shell scripts a un nivel basico/intermedio. No ı ı ´ ´pretende ser un documento avanzado (vea el t´tulo). NO soy un experto ni un guru de la programacion en ı ´shell. Decid´ escribir esto porque aprendere mucho con ello y puede serle util a otras personas. Cualquier ´ ´ ´aportacion sera apreciada, especialmente en forma de parche :)Contents1 Introducci´ n o 3 1.1 ´ Obteniendo la ultima versi´ n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 3 1.2 Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Usos de este documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Scripts muy sencillos 3 2.1 T´pico script ‘hola mundo’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı 4 2.2 Un script de copia de seguridad muy simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Todo sobre redirecci´ n o 4 3.1 Teor´a y referencia r´ pida ı a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3.2 Ejemplo: stdout a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3.3 Ejemplo: stderr a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.4 Ejemplo: stdout a stderr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.5 Ejemplo: stderr a stdout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.6 Ejemplo: stderr y stdout a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Tuber´as ı 5 4.1 Qu´ son y por qu´ querr´ utilizarlas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e a 6 4.2 Ejemplo: una tuber´a sencilla con sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı 6 4.3 Ejemplo: una alternativa a ls -l *.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Variables 6 5.1 Ejemplo: ¡Hola Mundo! utilizando variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor) . . . . . . . . . . . . . . . . . . 6 5.3 Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
  • 2. CONTENTS 26 Estructuras Condicionales 7 6.1 Pura teor´a ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 6.2 Ejemplo: Ejemplo b´ sico de condicional if .. then . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 8 6.3 Ejemplo: Ejemplo b´ sico de condicional if .. then ... else . . . . . . . . . . . . . . . . . . . . . . . . a 8 6.4 Ejemplo: Condicionales con variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6.5 Ejemplo: comprobando si existe un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Los bucles for, while y until 9 7.1 Por ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 7.2 for tipo-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 7.3 Ejemplo de while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 7.4 Ejemplo de until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Funciones 10 8.1 Ejemplo de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 8.2 Ejemplo de funciones con par´ metros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 109 Interfaces de usuario 11 9.1 Utilizando select para hacer men´ s sencillos u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 9.2 Utilizando la l´nea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı 1110 Miscel´ nea a 12 10.1 Leyendo informaci´ n del usuario o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 10.2 Evaluaci´ n aritm´ tica o e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 10.3 Encontrando el bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 10.4 Obteniendo el valor devuelto por un programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 10.5 Capurando la salida de un comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311 Tablas 13 11.1 Operadores de comparaci´ n de cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 13 11.2 Ejemplo de comparaci´ n de cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 14 11.3 Operadores aritm´ ticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 14 11.4 Operadores relacionales aritm´ ticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 14 ´ 11.5 Comandos utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1512 M´ s scripts a 18 12.1 Aplicando un comando a todos los ficheros de un directorio. . . . . . . . . . . . . . . . . . . . . . . 18 12.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor) . . . . . . . . . . . . . . . . . . 18 12.3 Re-nombrador de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
  • 3. 1. Introducci´ n o 3 12.4 Re-nombrador de ficheros (sencillo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2013 Cuando algo va mal (depuraci´ n) o 20 13.1 Maneras de llamar a BASH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2014 Sobre el documento 20 14.1 (sin) Garant´a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı 20 14.2 Traducciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 14.3 Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 14.4 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 14.5 M´ s recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 211 Introducci´ n o ´1.1 Obteniendo la ultima versi´ n ohttp://www.linuxdoc.org/HOWTO/Bash-Prog-Intro-HOWTO.html1.2 Requisitos a ´Le ser´ util tener una cierta familiaridad con la l´nea de comandos de GNU/Linux y con los conceptos b´ sicos de ı ala programaci´ n. Aunque esto no es una introducci´ n a la programaci´ n, explica (o al menos lo intenta) muchos o o oconceptos b´ sicos. a1.3 Usos de este documento ´Este documento intenta ser util en las siguientes situaciones • Si tiene alguna idea de programaci´ n y quiere empezar a programar algunos shell scripts. o • Si tiene una idea vaga de programar en shell y quiere alg´ n tipo de referencia. u • Si quiere ver algunos scripts y comentarios para empezar a escribir los suyos propios. • Si est´ migrando desde DOS/Windows (o ya lo ha hecho) y quiere hacer procesos ”por lotes”. a • Si es un completo novato y lee todo COMO disponible.2 Scripts muy sencillosEste COMO tratar´ de darle algunos consejos sobre la programaci´ n de shell scripts, bas´ ndose profundamente en a o aejemplos.En esta secci´ n encontrar´ varios scripts peque˜ os que esperanzadamente le ayudar´ n a entender algunas t´ cnicas. o a n a e
  • 4. 3. Todo sobre redirecci´ n o 42.1 T´pico script ‘hola mundo’ ı #!/bin/bash echo Hola MundoEste script tiene s´ lo dos l´neas. La primera le indica al sistema qu´ programa usar para ejecutar el fichero. o ı e ı ´La segunda l´nea es la unica acci´ n realizada por este script, que imprime ’Hola Mundo’ en la terminal. oSi le sale algo como ./hello.sh: Comando desconocido., probablemente la primera l´nea, ’#!/bin/bash’, est´ mal. ı aEjecute whereis bash, o vea ’encontrando el bash’ para saber c´ mo debe escribir esta l´nea. o ı2.2 Un script de copia de seguridad muy simple #!/bin/bash tar -cZf /var/my-backup.tgz /home/yo/En este script, en vez de imprimir un mensaje en la terminal, creamos un tar-ball del directorio home de un usuario. ´ a ´Esto NO pretende ser un script util; m´ s tarde se ofrece un script de copia de seguridad m´ s util. a3 Todo sobre redirecci´ n o3.1 Teor´a y referencia r´ pida ı aExisten 3 descriptores de ficheros: stdin, stdout y stderr (std=est´ ndar). aB´ sicamente, usted puede: a 1. redirigir stdout a un fichero 2. redirigir stderr a un fichero 3. redirigir stdout a stderr 4. redirigir stderr a stdout 5. redirigir stderr y stdout a un fichero 6. redirigir stderr y stdout a stdout 7. redirigir stderr y stdout a stderrEl n´ mero 1 ’representa’ a stdout, y 2 a stderr. uUna peque˜ a nota para ver todo esto: con el comando less puede visualizar stdout (que permanecer´ en el b´ fer) y n a ustderr, que se imprimir´ en la pantalla, pero ser´ borrado si intenta leer el b´ fer. a a u3.2 Ejemplo: stdout a un ficheroEsto har´ que la salida de un programa se escriba en un fichero. a ls -l > ls-l.txt
  • 5. 4. Tuber´as ı 5En este caso, se crear´ un fichero llamado ’ls-l.txt’ que contendr´ lo que se ver´a en la pantalla si escribiese el comando a a ı’ls -l’ y lo ejecutase.3.3 Ejemplo: stderr a un ficheroEsto har´ que la salida stderr de un programa se escriba en un fichero. a grep da * 2> errores-de-grep.txtEn este caso, se crear´ un fichero llamado ’errores-de-grep.txt’ que contendr´ la parte stderr de la salida que dar´a el a a ıcomando ’grep da *’.3.4 Ejemplo: stdout a stderrEsto har´ que la salida stdout de un programa se escriba en el mismo descriptor de fichero que stderr. a grep da * 1>&2En este caso, la parte stdout del comando se env´a a stderr; puede observar eso de varias maneras. ı3.5 Ejemplo: stderr a stdoutEsto har´ que la salida stderr de un programa se escriba en el mismo descriptor de fichero que stdout. a grep * 2>&1En este caso, la parte stderr del comando se env´a a stdout. Si hace una tuber´a con less, ver´ que las l´neas que ı ı a ınormalmente ’desaparecen’ (al ser escritas en stderr), ahora permanecen (porque est´ n en el stdout). a3.6 Ejemplo: stderr y stdout a un ficheroEsto colocar´ toda la salida de un programa en un fichero. A veces, esto es conveniente en las entradas del cron, si aquiere que un comando se ejecute en absoluto silencio. rm -f $(find / -name core) &> /dev/nullEsto (pensando en la entrada del cron) eliminar´ todo archivo llamado ‘core’ en cualquier directorio. Tenga en cuenta aque tiene que estar muy seguro de lo que hace un comando si le va a eliminar la salida.4 Tuber´as ıEsta secci´ n explica de una manera muy sencilla y pr´ ctica c´ mo utilizar tuber´as, y por qu´ querr´a utilizarlas. o a o ı e ı
  • 6. 5. Variables 64.1 Qu´ son y por qu´ querr´ utilizarlas e e aLas tuber´as le permiten utilizar (muy sencillo, insisto) la salida de un programa como la entrada de otro. ı4.2 Ejemplo: una tuber´a sencilla con sed ı´Esta es una manera muy sencilla de utilizar tuber´as. ı ls -l | sed -e "s/[aeio]/u/g"En este caso, ocurre lo siguiente: primero se ejecuta el comando ls -l, y luego su salida, en vez de imprimirse en lapantalla, se env´a (entuba) al programa sed, que imprime su salida correspondiente. ı4.3 Ejemplo: una alternativa a ls -l *.txt ´Probablemente esta es una manera m´ s dif´cil de hacer un ls -l *.txt, pero se muestra para ilustrar el funcionamiento a ıde las tuber´as, no para resolver ese dilema. ı ls -l | grep ".txt$"En este caso, la salida del programa ls -l se env´a al programa grep, que imprimir´ las l´neas que concuerden con la ı a ıregex (expresi´ n regular) ”.txt$”. o5 VariablesPuede usar variables como en cualquier otro lenguaje de programaci´ n. No existen tipos de datos. Una variable de obash puede contener un n´ mero, un caracter o una cadena de caracteres. uNo necesita declarar una variable. Se crear´ s´ lo con asignarle un valor a su referencia. a o5.1 Ejemplo: ¡Hola Mundo! utilizando variables #!/bin/bash CAD="<Hola Mundo!" echo $CADLa segunda l´nea crea una variable llamada STR y le asigna la cadena ”¡Hola Mundo!”. Luego se recupera el VALOR ıde esta variable poni´ ndole un ’$’ al principio. Por favor, tenga en cuenta (¡int´ ntelo!) que si no usa el signo ’$’, la e esalida del programa ser´ diferente, y probablemente no sea lo que usted quer´a. a ı5.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor) #!/bin/bash OF=/var/mi-backup-$(date +%Y%m%d).tgz tar -cZf $OF /home/yo/
  • 7. 6. Estructuras Condicionales 7Este script introduce algo nuevo. Antes que nada, deber´a familiarizarse con la creaci´ n y asignaci´ n de variable de ı o ola l´nea 2. F´jese en la expresi´ n ’$(date +%Y%m%d)’. Si ejecuta el script se dar´ cuenta de que ejecuta el comando ı ı o aque hay dentro de los par´ ntesis, capturando su salida. eTenga en cuenta que en este script, el fichero de salida ser´ distinto cada d´a, debido al formato pasado al comando a ıdate (+%Y%m%d). Puede cambiar esto especificando un formato diferente.Algunos ejemplos m´ s: aecho lsecho $(ls)5.3 Variables localesLas variables locales pueden crearse utilizando la palabra clave local. #!/bin/bash HOLA=Hola function hola { local HOLA=Mundo echo $HOLA } echo $HOLA hola echo $HOLAEste ejemplo deber´a bastar para mostrarle el uso de una variable local. ı6 Estructuras CondicionalesLas estructuras condicionales le permiten decidir si se realiza una acci´ n o no; esta decisi´ n se toma evaluando una o oexpresi´ n. o6.1 Pura teor´a ıLos condicionales tienen muchas formas. La m´ s b´ sica es: if expresi´ n then sentencia donde ’sentencia’ s´ lo se a a o oejecuta si ’expresi´ n’ se eval´ a como verdadera. ’2<1’ es una expresi´ n que se eval´ a falsa, mientras que ’2>1’ se o u o ueval´ a verdadera. uLos condicionales tienen otras formas, como: if expresi´ n then sentencia1 else sentencia2. Aqu´ ’sentencia1’ se o ıejecuta si ’expresi´ n’ es verdadera. De otra manera se ejecuta ’sentencia2’. oOtra forma m´ s de condicional es: if expresi´ n1 then sentencia1 else if expresi´ n2 then sentencia2 else sentencia3. En a o oesta forma s´ lo se a˜ ade ”ELSE IF ’expresi´ n2’ THEN ’sentencia2’”, que hace que sentencia2 se ejecute si expresi´ n2 o n o ose eval´ a verdadera. El resto es como puede imaginarse (v´ anse las formas anteriores). u eUnas palabras sobre la sintaxis: ´La base de las construcciones ’if’ es esta:if [expresi´ n]; othen
  • 8. 6. Estructuras Condicionales 8c´ digo si ’expresi´ n’ es verdadera. o ofi6.2 Ejemplo: Ejemplo b´ sico de condicional if .. then a #!/bin/bash if [ "petete" = "petete" ]; then echo expresi´n evaluada como verdadera o fiEl c´ digo que se ejecutar´ si la expresi´ n entre corchetes es verdadera se encuentra entre la palabra ’then’ y la palabra o a o’fi’, que indica el final del c´ digo ejecutado condicionalmente. o6.3 Ejemplo: Ejemplo b´ sico de condicional if .. then ... else a #!/bin/bash if [ "petete" = "petete" ]; then echo expresi´n evaluada como verdadera o else echo expresi´n evaluada como falsa o fi6.4 Ejemplo: Condicionales con variables #!/bin/bash T1="petete" T2="peteto" if [ "$T1" = "$T2" ]; then echo expresi´n evaluada como verdadera o else echo expresi´n evaluada como falsa o fi6.5 Ejemplo: comprobando si existe un ficheroun agradecimiento m´ s a mike a #!/bin/bash FILE=˜/.basrc if [ -f $FILE ]; then echo el fichero $FILE existe else echo fichero no encontrado fi if [ ’test -f $FILE’]
  • 9. 7. Los bucles for, while y until 97 Los bucles for, while y untilEn esta secci´ n se encontrar´ con los bucles for, while y until. o aEl bucle for es distinto a los de otros lenguajes de programaci´ n. B´ sicamente, le permite iterar sobre una serie de o a‘palabras’ contenidas dentro de una cadena.El bucle while ejecuta un trozo de c´ dico si la expresi´ n de control es verdadera, y s´ lo se para cuando es falsa (o se o o oencuentra una interrupci´ n expl´cita dentro del c´ digo en ejecuci´ n). o ı o oEl bucle until es casi id´ ntico al bucle loop, excepto en que el c´ digo se ejecuta mientras la expresi´ n de control se e o oeval´ e como falsa. uSi sospecha que while y until son demasiado parecidos, est´ en lo cierto. a7.1 Por ejemplo #!/bin/bash for i in $( ls ); do echo item: $i doneEn la segunda l´nea declaramos i como la variable que recibir´ los diferentes valores contenidos en $( ls ). ı aLa tercera l´nea podr´a ser m´ s larga o podr´a haber m´ s l´neas antes del done (4). ı ı a ı a ı‘done’ (4) indica que el c´ digo que ha utilizado el valor de $i ha acabado e $i puede tomar el nuevo valor. o a ´Este script no tiene mucho sentido, pero una manera m´ s util de usar el bucle for ser´a hacer que concordasen s´ lo ı ociertos ficheros en el ejemplo anterior.7.2 for tipo-CFiesh sugiri´ a˜ adir esta forma de bucle. Es un bucle for m´ s parecido al for de C/perl... o n a #!/bin/bash for i in ‘seq 1 10‘; do echo $i done7.3 Ejemplo de while #!/bin/bash CONTADOR=0 while [ $CONTADOR -lt 10 ]; do echo El contador es $CONTADOR let CONTADOR=CONTADOR+1 doneEste script ’emula’ la conocida (C, Pascal, perl, etc) estructura ‘for’.
  • 10. 8. Funciones 107.4 Ejemplo de until #!/bin/bash CONTADOR=20 until [ $CONTADOR -lt 10 ]; do echo CONTADOR $CONTADOR let CONTADOR-=1 done8 FuncionesComo en casi todo lenguaje de programaci´ n, puede utilizar funciones para agrupar trozos de c´ digo de una manera o om´ s l´ gica, o practicar el divino arte de la recursi´ n. a o oDeclarar una funci´ n es s´ lo cuesti´ n de escribir function mi func { mi c´ digo }. o o o oLlamar a la funci´ n es como llamar a otro programa, s´ lo hay que escribir su nombre. o o8.1 Ejemplo de funciones #!/bin/bash function salir { exit } function hola { echo <Hola! } hola salir echo peteteLas l´neas 2-4 contienen la funci´ n ’salir’. Las l´neas 5-7 contienen la funci´ n ’hola’. Si no est´ completamente seguro ı o ı o ade lo que hace este script, por favor, ¡pru´ belo!. eTenga en cuenta que una funci´ n no necesita que sea declarada en un orden espec´fico. o ıCuando ejecute el script se dar´ cuenta de que: primero se llama a la funci´ n ’hola’, luego a la funci´ n ’quit’, y el a o oprograma nunca llega a la l´nea 10. ı8.2 Ejemplo de funciones con par´ metros a #!/bin/bash function salir { exit } function e { echo $1 } e Hola e Mundo salir echo petete
  • 11. 9. Interfaces de usuario 11Este script es casi id´ ntico al anterior. La diferencia principal es la funci´ n ’e’. Esta funci´ n imprime el primer e o oargumento que recibe. Los argumentos, dentro de las funciones, son tratados de la misma manera que los argumentossuministrados al script.9 Interfaces de usuario ´9.1 Utilizando select para hacer menus sencillos #!/bin/bash OPCIONES="Hola Salir" select opt in $OPCIONES; do if [ "$opt" = "Salir" ]; then echo done exit elif [ "$opt" = "Hola" ]; then echo Hola Mundo else clear echo opci´n err´nea o o fi doneSi ejecuta este script ver´ que es el sue˜ o de un programador para hacer men´ s basados en texto. Probablemente se a n udar´ cuenta de que es muy similar a la construcci´ n ’for’, s´ lo que en vez de iterar para cada ’palabra’ en $OPCIONES, a o ose lo pide al usuario.9.2 Utilizando la l´nea de comandos ı #!/bin/bash if [ -z "$1" ]; then echo uso: $0 directorio exit fi SRCD=$1 TGTD="/var/backups/" OF=home-$(date +%Y%m%d).tgz tar -cZf $TGTD$OF $SRCDLo que hace este script deber´a estar claro para usted. La expresi´ n del primer condicional comprueba si el programa ı oha recibido alg´ n argumento ($1) y sale si no lo ha recibido, mostr´ ndole al usuario un peque˜ o mensaje de uso. El u a nresto del script deber´a estar claro. ı
  • 12. 10. Miscel´ nea a 1210 Miscel´ nea a10.1 Leyendo informaci´ n del usuario oEn muchas ocasiones, puede querer solicitar al usuario alguna informaci´ n, y existen varias maneras para hacer esto. o´Esta es una de ellas: #!/bin/bash echo Por favor, introduzca su nombre read NOMBRE echo "<Hola $NOMBRE!"Como variante, se pueden obtener m´ ltiples valores con read. Este ejemplo deber´a clarificarlo. u ı #!/bin/bash echo Por favor, introduzca su nombre y primer apellido read NO AP echo "<Hola $AP, $NO!"10.2 Evaluaci´ n aritm´ tica o ePruebe esto en la l´nea de comandos (o en una shell): ıecho 1 + 1Si esperaba ver ’2’, quedar´ desilusionado. ¿Qu´ hacer si quiere que BASH eval´ e unos n´ meros? La soluci´ n es a e u u o´esta:echo $((1+1))Esto producir´ una salida m´ s ’l´ gica’. Esto se hace para evaluar una expresi´ n aritm´ tica. Tambi´ n puede hacerlo de a a o o e eesta manera:echo $[1+1]Si necesita usar fracciones, u otras matem´ ticas, puede utilizar bc para evaluar expresiones aritm´ ticas. a eSi ejecuta ”echo $[3/4]” en la l´nea de comandos, devolver´ 0, porque bash s´ lo utiliza enteros en sus respuestas. Si ı a oejecuta ”echo 3/4|bc -l”, devolver´ 0.75. a10.3 Encontrando el bashDe un mensaje de mike (vea los agradecimientos):siempre usas #!/bin/bash .. a lo mejor quieres dar un ejemplode c´ mo saber d´ nde encontrar el bash. o o‘locate bash’ es preferible, pero no todas las m´ quinas atienen locate.‘find ./ -name bash’ desde el directorio ra´z funcionar´ , ı anormalmente.Sitios donde poder buscar:
  • 13. 11. Tablas 13ls -l /bin/bashls -l /sbin/bashls -l /usr/local/bin/bashls -l /usr/bin/bashls -l /usr/sbin/bashls -l /usr/local/sbin/bash(no se me ocurre ning´ n otro directorio... lo he encontrado ula mayor´a de estos sitios en sistemas diferentes). ıTambi´ n puedes probar ’which bash’. e10.4 Obteniendo el valor devuelto por un programaEn bash, el valor de retorno de un programa se guarda en una variable especial llamada $?.Esto ilustra c´ mo capturar el valor de retorno de un programa. Supongo que el directorio dada no existe. (Esto tambi´ n o ees sugerencia de Mike). #!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?10.5 Capurando la salida de un comandoEste peque˜ o script muestra todas las tablas de todas las bases de datos (suponiendo que tenga MySQL instalado). nConsidere tambi´ n cambiar el comando ’mysql’ para que use un nombre de usuario y clave v´ lidos. e a #!/bin/bash DBS=‘mysql -uroot -e"show databases"‘ for b in $DBS ; do mysql -uroot -e"show tables from $b" done11 Tablas11.1 Operadores de comparaci´ n de cadenas os1 = s2 s1 coincide con s2s1 != s2 s1 no coincide con s2
  • 14. 11. Tablas 14s1 < s2 s1 es alfab´ ticamente anterior a s2, con el locale actual es1 > s2 s1 es alfab´ ticamente posterior a s2, con el locale actual e-n s1 s1 no es nulo (contiene uno o m´ s caracteres) a-z s1 s1 es nulo11.2 Ejemplo de comparaci´ n de cadenas oComparando dos cadenas #!/bin/bash S1=’cadena’ S2=’Cadena’ if [ $S1!=$S2 ]; then echo "S1(’$S1’) no es igual a S2(’$S2’)" fi if [ $S1=$S1 ]; then echo "S1(’$S1’) es igual a S1(’$S1’)" fiCito aqu´ el consejo de un correo enviado por Andreas Beck, referido al uso de if [ $1 = $2 ]. ıEsto no es buena idea, porque si $S1 o $S2 son vac´os, aparecer´ un parse error. Es mejor: x$1=x$2 or ”$1”=”$2” ı a11.3 Operadores aritm´ ticos e+ (adici´ n) o- (sustracci´ n) o* (producto)/ (divisi´ n) o% (m´ dulo) o11.4 Operadores relacionales aritm´ ticos e-lt (<)-gt (>)-le (<=)-ge (>=)-eq (==)
  • 15. 11. Tablas 15-ne (!=)Los programadores de C tan s´ lo tienen que corresponder el operador con su par´ ntesis. o e ´11.5 Comandos utilesEsta secci´ n ha sido reescrita por Kees (v´ anse agradecimientos) o eAlgunos de estos comandos contienen lenguajes de programaci´ n completos. S´ lo se explicar´ n las bases de estos o o acomandos. Para una descripci´ n m´ s detallada, eche un vistazo a las p´ ginas man de cada uno. o a ased (editor de flujo)Sed es un editor no interactivo. En vez de alterar un fichero moviendo el cursor por la pantalla, se utiliza una seriede instrucciones de edici´ n de sed, y el nombre del fichero a editar. Tambi´ n se puede describir a sed como un filtro. o eMiremos algunos ejemplos: $sed ’s/a_sustituir/sustituto/g’ /tmp/peteteSed sustituye la cadena ’a sustituir’ por la cadena ’sustituto’, leyendo del fichero /tmp/petete. El resultado se env´a a ıstdout (normalmente la consola), pero se puede a˜ adir ’> captura’ al final de la l´nea de arriba para que sed env´e la n ı ısalida al fichero ’capture’. $sed 12, 18d /tmp/peteteSed muestra todas las l´neas de /tmp/petete excepto la 12 y la 18. El fichero original no queda alterado por este ıcomando.awk (manipulaci´ n de bases de datos, extracci´ n y proceso de texto) o oExisten muchas implementaciones del lenguaje de programacin AWK (los int´ rpretes m´ s conocidos son gawk de e aGNU, y el ’nuevo awk’ mawk). El principio es sencillo: AWK busca un patr´ n, y por cada patr´ n de b´ squeda que o o ucoincida, se realiza una acci´ n. oSi tenemos un fichero /tmp/petete con las siguientes l´neas: ı”prueba123pruebapprruueebbaa”y ejecutamos: $awk ’/prueba/ {print}’ /tmp/petetetest123testEl patr´ n que busca AWK es ’prueba’ y la acci´ n que realiza cuando encuentra una l´nea en /tmp/petete con la cadena o o ı’prueba’ es ‘print’. $awk ’/prueba/ {i=i+1} END {print i}’ /tmp/petete
  • 16. 11. Tablas 163Cuando se utilizan muchos patrones, se puede reemplazar el texto entre comillas por ’-f fichero.awk’, y poner todoslos patrones y acciones en ’fichero.awk’.grep (impresi´ n de l´neas que coinciden con un patr´ n de b´ squeda) o ı o uYa hemos visto ejemplos del comando grep en los cap´tulos anteriores, que muestra las l´neas que concuerdan con un ı ıpatr´ n. Pero grep puede hacer m´ s que eso. o a $grep "busca esto" /var/log/messages -c12Se ha encontrado 12 veces la cadena ”busca esto” en el fichero /var/log/messages.[vale, este ejemplo es falso, el fichero /var/log/messages est´ alterado :-)] awc (cuenta l´neas, palabras y bytes) ıEn el siguiente ejemplo, vemos que la salida no es lo que esper´ bamos. El fichero petete utilizado en este ejemplo acontiene el texto siguiente:”programaci´ n en bash ocomo de introducci´ n” o $wc --words --lines --bytes /tmp/petete2 5 41 /tmp/peteteWc no tiene en cuenta el orden de los par´ metros. Wc siempre los imprime en un orden est´ ndar, que es, como se a apuede ver: l´neas, palabras, bytes y fichero. ısort (ordena l´neas de ficheros de texto) ıEsta vez, el fichero petete contiene el texto siguiente:”bca” $sort /tmp/peteteEsto es lo que muestra la salida:abcLos comandos no deber´an ser tan f´ ciles :-) ı abc (un lenguaje de programaci´ n de c´ lculos matem´ ticos) o a aBc acepta c´ lculos desde la l´nea de comandos (entrada desde un fichero, pero no desde una redirecci´ n o una tuber´a), a ı o ıy tambi´ n desde una interfaz de usuario. La siguiente demostraci´ n expone algunos de los comandos. Note que ejecuto e obc con el par´ metro -q para evitar el mensaje de bienvenida. a $bc -q
  • 17. 11. Tablas 171 == 500.05 == 0.0515 != 502ˆ8256sqrt(9)3while (i != 9) {i = i + 1;print i}123456789quittput (inicializa una terminal o consulta la base de datos de terminfo)Una peque˜ a demostraci´ n de las capacidades de tput: n o $tput cup 10 4La l´nea de comandos aparece en (y10,x4). ı $tput resetLimpia la pantalla y la l´nea de comandos aparece en (y1,x1). Observe que (y0,x0) es la esquina superior izquierda. ı $tput cols80Muestra el n´ mero de caracteres que caben en la direcci´ n x. u oEs muy recomendable familiarizarse con estos programas (al menos). Hay montones de programillas que le permitir´ n ahacer virguer´as en la l´nea de comandos. ı ı[algunos ejemplos est´ n copiados de las p´ ginas man o los PUFs] a a
  • 18. 12. M´ s scripts a 1812 M´ s scripts a12.1 Aplicando un comando a todos los ficheros de un directorio.12.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor) #!/bin/bash ORIG="/home/" DEST="/var/copias_de_seguridad/" FICH=home-$(date +%Y%m%d).tgz tar -cZf $DEST$FICH $ORIG12.3 Re-nombrador de ficheros #!/bin/sh # renom: renombra m´ltiples ficheros de acuerdo con ciertas u # reglas # escrito por Felix Hudson Enero - 2000 # primero comprueba los distintos ’modos’ que tiene este # programa # si la primera ($1) condici´n coincide, se ejecuta esa parte o # del programa y acaba # comprueba la condici´n de prefijo o if [ $1 = p ]; then # ahora nos libramos de la variable de modo ($1) y ponemos $2 # de prefijo prefijo=$2 ; shift ; shift # una r´pida comprobaci´n para ver si se especific´ alg´n a o o u # fichero # si no, hay cosas mejores que hacer que renombrar ficheros # inexistentes!! if [$1 = ]; then echo "no se especificaron ficheros" exit 0 fi # este bucle for itera a lo largo de todos los ficheros que # le hemos especificado al programa # renombra cada uno de ellos for fichero in $* do mv ${fichero} $prefijo$fichero done # ahora salimos del programa exit 0 fi
  • 19. 12. M´ s scripts a 19 # comprueba si es un renombramiento con sufijo # el resto es casi id´ntico a la parte anterior e # lea los comentarios anteriores if [ $1 = s ]; then sufijo=$2 ; shift ; shift if [$1 = ]; then echo "no se especificaron ficheros" exit 0 fi for fichero in $* do mv ${fichero} $fichero$sufijo done exit 0 fi # comprueba si es una sustituci´n o if [ $1 = r ]; then shift # he inclu´do esto para no da˜ar ning´n fichero si el ı n u # usuario no especifica que se haga nada # tan s´lo una medida de seguridad o if [ $# -lt 3 ] ; then echo "uso: renom r [expresi´n] [sustituto] ficheros... " o exit 0 fi # elimina el resto de informaci´n o VIEJO=$1 ; NUEVO=$2 ; shift ; shift # este bucle for itera a lo largo de todos los ficheros que # le hemos especificado al programa # renombra cada fichero utilizando el programa ’sed’ # es un sencillo programa desde la l´nea de comandos que ı # analiza la entrada est´ndar y sustituye una expresi´n por a o # una cadena dada # aqu´ le pasamos el nombre del fichero (como entrada ı # est´ndar) a for fichero in $* do nuevo=‘echo ${fichero} | sed s/${VIEJO}/${NUEVO}/g‘ mv ${fichero} $nuevo done exit 0 fi # si se llega a esta parte es que no se le pas´ nada o # apropiado al programa, por lo que le decimos al usuario # c´mo hacerlo o echo "uso:"
  • 20. 13. Cuando algo va mal (depuraci´ n) o 20 echo " renom p [prefijo] ficheros.." echo " renom s [sufijo] ficheros.." echo " renom r [expresi´n] [sustituto] ficheros.." o exit 0 # hecho!12.4 Re-nombrador de ficheros (sencillo) #!/bin/bash # renombra.sh # renombrador de ficheros b´sico a criterio=$1 expresion=$2 sustituto=$3 for i in $( ls *$criterio* ); do orig=$i dest=$(echo $i | sed -e "s/$expresion/$sustituto/") mv $orig $dest done13 Cuando algo va mal (depuraci´ n) o13.1 Maneras de llamar a BASHUna buena idea es poner esto en la primera l´nea: ı #!/bin/bash -xEsto producir´ informaci´ n interesante. a o14 Sobre el documentoSi´ ntase libre para hacer sugerencias/correcciones, o lo que crea que sea interesante que aparezca en este documento. eIntentar´ actualizarlo tan pronto como me sea posible. e14.1 (sin) Garant´a ıEste documento no lleva garant´a de ning´ n tipo. ı u
  • 21. 14. Sobre el documento 2114.2 TraduccionesItaliano: por William Ghelfi (wizzy est´ en tiscalinet.it). http://web.tiscalinet.it/penguin rules aFranc´ s: por Laurent Martelli ¿? eCoreano: Minseok Park http://kldp.orgCorean: Chun Hye Jin DesconocidoSpanish: Gabriel Rodr´guez Alberich http://www.insflug.org ıSupongo que habr´ m´ s traducciones, pero no tengo informaci´ n sobre ellas. Si las tiene, por favor, env´emelas para a a o ıque actualice esta secci´ n. o14.3 Agradecimientos • A la gente que ha traducido este documento a otras lenguas (secci´ n anterior). o • A Nathan Hurst por enviar montones de correcciones. • A Jon Abbott por enviar comentarios sobre la evaluaci´ n de expresiones aritm´ ticas. o e • A Felix Hudson por escribir el script renom • A Kees van den Broek (por enviar tantas correcciones y reescribir la secci´ n de comandos utiles) o ´ • Mike (pink) hizo algunas sugerencias sobre la localizaci´ n del bash y la comprobaci´ n de los ficheros o o • Fiesh hizo una buena sugerencia sobre la secci´ n de bucles. o • Lion sugiri´ mencionar un error com´ n (./hello.sh: Comando no encontrado.) o u • Andreas Beck hizo varias correcciones y comentarios.14.4 HistoriaA˜ adidas nuevas traducciones y correcciones menores. n n o ´A˜ adida la secci´ n de comandos utiles reescrita por Kess.Incorporadas m´ s correcciones y sugerencias. aA˜ adidos ejemplos sobre la comparaci´ n de cadenas. n ov0.8 abandono del versionamiento. Supongo que con la fecha es suficiente.v0.7 M´ s correcciones y algunas secciones TO-DO escritas. av0.6 Correcciones menores.v0.5 A˜ adida la secci´ n de redireccionamiento. n ov0.4 desaparici´ n de su sitio debido a mi ex-jefe. Este documento tiene un nuevo sitio en: http://www.linuxdoc.org. oAnteriores: no me acuerdo y no he usado rcs ni cvs :(14.5 M´ s recursos aIntroducci´ n a bash (bajo BE) http://org.laol.net/lamug/beforever/bashtut.htm oProgramaci´ n en Bourne Shell http://207.213.123.70/book/ o