´ ´ Programacion en BASH - COMO de introduccion
Mike G (mikkey) disponible en dynamo.com.ar Traducido 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 :)
Contents
1 Introducci´ n o 1.1 1.2 1.3 2 ´ Obteniendo la ultima versi´ n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 3 4 4 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 5 5 5 5 6 6 6 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7
Usos de este documento
Scripts muy sencillos 2.1 2.2 T´pico script ‘hola mundo’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı Un script de copia de seguridad muy simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Todo sobre redirecci´ n o 3.1 3.2 3.3 3.4 3.5 3.6 Teor´a y referencia r´ pida ı a
Ejemplo: stdout a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo: stderr a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo: stdout a stderr Ejemplo: stderr a stdout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo: stderr y stdout a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
Tuber´as ı 4.1 4.2 4.3 Qu´ son y por qu´ querr´ utilizarlas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e a Ejemplo: una tuber´a sencilla con sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı Ejemplo: una alternativa a ls -l *.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Variables 5.1 5.2 5.3 Ejemplo: ¡Hola Mundo! utilizando variables
Ejemplo: Un script de copia de seguridad muy simple (algo mejor)
Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CONTENTS
2
6
Estructuras Condicionales 6.1 6.2 6.3 6.4 6.5 Pura teor´a ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 7 8 8 8 8 9 9 9 9 10 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 12 13 13 13 13 14 14 14 15 18 18 18 18
Ejemplo: Ejemplo b´ sico de condicional if .. then . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Ejemplo: Ejemplo b´ sico de condicional if .. then ... else . . . . . . . . . . . . . . . . . . . . . . . . a Ejemplo: Condicionales con variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo: comprobando si existe un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
Los bucles for, while y until 7.1 7.2 7.3 7.4 Por ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for tipo-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
Funciones 8.1 8.2 Ejemplo de funciones
Ejemplo de funciones con par´ metros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a
9
Interfaces de usuario 9.1 9.2 Utilizando select para hacer men´ s sencillos u
Utilizando la l´nea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı
10 Miscel´ nea a 10.1 Leyendo informaci´ n del usuario o 10.2 Evaluaci´ n aritm´ tica o e 10.3 Encontrando el bash
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.4 Obteniendo el valor devuelto por un programa
10.5 Capurando la salida de un comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Tablas 11.1 Operadores de comparaci´ n de cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 11.2 Ejemplo de comparaci´ n de cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 11.3 Operadores aritm´ ticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 11.4 Operadores relacionales aritm´ ticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e ´ 11.5 Comandos utiles 12 M´ s scripts a 12.1 Aplicando un comando a todos los ficheros de un directorio. . . . . . . . . . . . . . . . . . . . . . . 12.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor) 12.3 Re-nombrador de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. Introducci´ n o
3
12.4 Re-nombrador de ficheros (sencillo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Cuando algo va mal (depuraci´ n) o 13.1 Maneras de llamar a BASH 14 Sobre el documento 14.1 (sin) Garant´a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı 14.2 Traducciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.3 Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.4 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.5 M´ s recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20 20 20 20 20 21 21 21 21
1
1.1
Introducci´ n o
´ Obteniendo la ultima versi´ n o
http://www.linuxdoc.org/HOWTO/Bash-Prog-Intro-HOWTO.html
1.2
Requisitos
Le ser´ util tener una cierta familiaridad con la l´nea de comandos de GNU/Linux y con los conceptos b´ sicos de a ´ ı a la programaci´ n. Aunque esto no es una introducci´ n a la programaci´ n, explica (o al menos lo intenta) muchos o o o conceptos b´ sicos. a
1.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 sencillos
Este COMO tratar´ de darle algunos consejos sobre la programaci´ n de shell scripts, bas´ ndose profundamente en a o a ejemplos. En esta secci´ n encontrar´ varios scripts peque˜ os que esperanzadamente le ayudar´ n a entender algunas t´ cnicas. o a n a e
3. Todo sobre redirecci´ n o
4
2.1
T´pico script ‘hola mundo’ ı
#!/bin/bash echo Hola Mundo
Este 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. ı o Si le sale algo como ./hello.sh: Comando desconocido., probablemente la primera l´nea, ’#!/bin/bash’, est´ mal. ı a Ejecute 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. ´ Esto NO pretende ser un script util; m´ s tarde se ofrece un script de copia de seguridad m´ s util. a a ´
3
3.1
Todo sobre redirecci´ n o
Teor´a y referencia r´ pida ı a
Existen 3 descriptores de ficheros: stdin, stdout y stderr (std=est´ ndar). a B´ 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 stderr El n´ mero 1 ’representa’ a stdout, y 2 a stderr. u Una peque˜ a nota para ver todo esto: con el comando less puede visualizar stdout (que permanecer´ en el b´ fer) y n a u stderr, que se imprimir´ en la pantalla, pero ser´ borrado si intenta leer el b´ fer. a a u
3.2
Ejemplo: stdout a un fichero
Esto har´ que la salida de un programa se escriba en un fichero. a
ls -l > ls-l.txt
4. Tuber´as ı
5
En 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 fichero
Esto har´ que la salida stderr de un programa se escriba en un fichero. a
grep da * 2> errores-de-grep.txt
En 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 stderr
Esto har´ que la salida stdout de un programa se escriba en el mismo descriptor de fichero que stderr. a
grep da * 1>&2
En este caso, la parte stdout del comando se env´a a stderr; puede observar eso de varias maneras. ı
3.5
Ejemplo: stderr a stdout
Esto har´ que la salida stderr de un programa se escriba en el mismo descriptor de fichero que stdout. a
grep * 2>&1
En 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). a
3.6
Ejemplo: stderr y stdout a un fichero
Esto colocar´ toda la salida de un programa en un fichero. A veces, esto es conveniente en las entradas del cron, si a quiere que un comando se ejecute en absoluto silencio.
rm -f $(find / -name core) &> /dev/null
Esto (pensando en la entrada del cron) eliminar´ todo archivo llamado ‘core’ en cualquier directorio. Tenga en cuenta a que 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 ı
5. Variables
6
4.1
Qu´ son y por qu´ querr´ utilizarlas e e a
Las 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 la pantalla, 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$”. o
5
Variables
Puede usar variables como en cualquier otro lenguaje de programaci´ n. No existen tipos de datos. Una variable de o bash puede contener un n´ mero, un caracter o una cadena de caracteres. u No necesita declarar una variable. Se crear´ s´ lo con asignarle un valor a su referencia. a o
5.1
Ejemplo: ¡Hola Mundo! utilizando variables
#!/bin/bash CAD="1’ se o u o u eval´ a verdadera. u Los 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’. o Otra forma m´ s de condicional es: if expresi´ n1 then sentencia1 else if expresi´ n2 then sentencia2 else sentencia3. En a o o esta forma s´ lo se a˜ ade ”ELSE IF ’expresi´ n2’ THEN ’sentencia2’”, que hace que sentencia2 se ejecute si expresi´ n2 o n o o se eval´ a verdadera. El resto es como puede imaginarse (v´ anse las formas anteriores). u e Unas palabras sobre la sintaxis: ´ La base de las construcciones ’if’ es esta: if [expresi´ n]; o then
6. Estructuras Condicionales
8
c´ digo si ’expresi´ n’ es verdadera. o o fi
6.2
Ejemplo: Ejemplo b´ sico de condicional if .. then a
#!/bin/bash if [ "petete" = "petete" ]; then echo expresi´n evaluada como verdadera o fi
El 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. o
6.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 fi
6.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 fi
6.5
Ejemplo: comprobando si existe un fichero
un 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’]
7. Los bucles for, while y until
9
7
Los bucles for, while y until
En esta secci´ n se encontrar´ con los bucles for, while y until. o a El 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 o encuentra una interrupci´ n expl´cita dentro del c´ digo en ejecuci´ n). o ı o o El 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 o eval´ e como falsa. u Si sospecha que while y until son demasiado parecidos, est´ en lo cierto. a
7.1
Por ejemplo
#!/bin/bash for i in $( ls ); do echo item: $i done
En la segunda l´nea declaramos i como la variable que recibir´ los diferentes valores contenidos en $( ls ). ı a La 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 Este script no tiene mucho sentido, pero una manera m´ s util de usar el bucle for ser´a hacer que concordasen s´ lo a ´ ı o ciertos ficheros en el ejemplo anterior.
7.2
for tipo-C
Fiesh 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 done
7.3
Ejemplo de while
#!/bin/bash CONTADOR=0 while [ $CONTADOR -lt 10 ]; do echo El contador es $CONTADOR let CONTADOR=CONTADOR+1 done
Este script ’emula’ la conocida (C, Pascal, perl, etc) estructura ‘for’.
8. Funciones
10
7.4
Ejemplo de until
#!/bin/bash CONTADOR=20 until [ $CONTADOR -lt 10 ]; do echo CONTADOR $CONTADOR let CONTADOR-=1 done
8
Funciones
Como en casi todo lenguaje de programaci´ n, puede utilizar funciones para agrupar trozos de c´ digo de una manera o o m´ s l´ gica, o practicar el divino arte de la recursi´ n. a o o o Declarar una funci´ n es s´ lo cuesti´ n de escribir function mi func { mi c´ digo }. o o o Llamar a la funci´ n es como llamar a otro programa, s´ lo hay que escribir su nombre. o o
8.1
Ejemplo de funciones
#!/bin/bash function salir { exit } function hola { echo /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?
10.5 Capurando la salida de un comando
Este peque˜ o script muestra todas las tablas de todas las bases de datos (suponiendo que tenga MySQL instalado). n Considere 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" done
11
Tablas
11.1 Operadores de comparaci´ n de cadenas o
s1 = s2 s1 coincide con s2 s1 != s2 s1 no coincide con s2
11. Tablas
14
s1 < s2 s1 es alfab´ ticamente anterior a s2, con el locale actual e s1 > 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 nulo
11.2
Ejemplo de comparaci´ n de cadenas o
Comparando 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’)" fi
Cito 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” ı a
11.3
Operadores aritm´ ticos e
+ (adici´ n) o - (sustracci´ n) o * (producto) / (divisi´ n) o % (m´ dulo) o
11.4 Operadores relacionales aritm´ ticos e
-lt (<) -gt (>) -le (<=) -ge (>=) -eq (==)
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 utiles
Esta secci´ n ha sido reescrita por Kees (v´ anse agradecimientos) o e Algunos de estos comandos contienen lenguajes de programaci´ n completos. S´ lo se explicar´ n las bases de estos o o a comandos. Para una descripci´ n m´ s detallada, eche un vistazo a las p´ ginas man de cada uno. o a a sed (editor de flujo) Sed es un editor no interactivo. En vez de alterar un fichero moviendo el cursor por la pantalla, se utiliza una serie de instrucciones de edici´ n de sed, y el nombre del fichero a editar. Tambi´ n se puede describir a sed como un filtro. o e Miremos algunos ejemplos:
$sed ’s/a_sustituir/sustituto/g’ /tmp/petete
Sed 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/petete
Sed 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 o Existen muchas implementaciones del lenguaje de programacin AWK (los int´ rpretes m´ s conocidos son gawk de e a GNU, 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 u coincida, se realiza una acci´ n. o Si tenemos un fichero /tmp/petete con las siguientes l´neas: ı ”prueba123 prueba pprruueebbaa” y ejecutamos:
$awk ’/prueba/ {print}’ /tmp/petete
test123 test El 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
11. Tablas
16
3 Cuando se utilizan muchos patrones, se puede reemplazar el texto entre comillas por ’-f fichero.awk’, y poner todos los patrones y acciones en ’fichero.awk’. grep (impresi´ n de l´neas que coinciden con un patr´ n de b´ squeda) o ı o u Ya 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 -c
12 Se 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 :-)] a wc (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 a contiene el texto siguiente: ”programaci´ n en bash o como de introducci´ n” o
$wc --words --lines --bytes /tmp/petete
2 5 41 /tmp/petete Wc no tiene en cuenta el orden de los par´ metros. Wc siempre los imprime en un orden est´ ndar, que es, como se a a puede ver: l´neas, palabras, bytes y fichero. ı sort (ordena l´neas de ficheros de texto) ı Esta vez, el fichero petete contiene el texto siguiente: ”b c a”
$sort /tmp/petete
Esto es lo que muestra la salida: a b c Los comandos no deber´an ser tan f´ ciles :-) ı a bc (un lenguaje de programaci´ n de c´ lculos matem´ ticos) o a a Bc 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 o bc con el par´ metro -q para evitar el mensaje de bienvenida. a
$bc -q
11. Tablas
17
1 == 5 0 0.05 == 0.05 1 5 != 5 0 2ˆ8 256 sqrt(9) 3 while (i != 9) { i = i + 1; print i } 123456789 quit tput (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 4
La l´nea de comandos aparece en (y10,x4). ı
$tput reset
Limpia la pantalla y la l´nea de comandos aparece en (y1,x1). Observe que (y0,x0) es la esquina superior izquierda. ı
$tput cols
80 Muestra el n´ mero de caracteres que caben en la direcci´ n x. u o Es muy recomendable familiarizarse con estos programas (al menos). Hay montones de programillas que le permitir´ n a hacer virguer´as en la l´nea de comandos. ı ı [algunos ejemplos est´ n copiados de las p´ ginas man o los PUFs] a a
12. M´ s scripts a
18
12
12.1 12.2
M´ s scripts a
Aplicando un comando a todos los ficheros de un directorio. 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 $ORIG
12.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
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:" # # # # # # # #
13. Cuando algo va mal (depuraci´ n) o
20
echo echo echo exit
" renom p [prefijo] ficheros.." " renom s [sufijo] ficheros.." " renom r [expresi´n] [sustituto] ficheros.." o 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 done
13
13.1
Cuando algo va mal (depuraci´ n) o
Maneras de llamar a BASH
Una buena idea es poner esto en la primera l´nea: ı
#!/bin/bash -x
Esto producir´ informaci´ n interesante. a o
14
Sobre el documento
Si´ ntase libre para hacer sugerencias/correcciones, o lo que crea que sea interesante que aparezca en este documento. e Intentar´ actualizarlo tan pronto como me sea posible. e
14.1 (sin) Garant´a ı
Este documento no lleva garant´a de ning´ n tipo. ı u
14. Sobre el documento
21
14.2
Traducciones
Italiano: por William Ghelfi (wizzy est´ en tiscalinet.it). http://web.tiscalinet.it/penguin rules a Franc´ s: por Laurent Martelli ¿? e Coreano: Minseok Park http://kldp.org Corean: Chun Hye Jin Desconocido Spanish: 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. o
14.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
Historia
A˜ adidas nuevas traducciones y correcciones menores. n ´ A˜ adida la secci´ n de comandos utiles reescrita por Kess. n o Incorporadas m´ s correcciones y sugerencias. a A˜ adidos ejemplos sobre la comparaci´ n de cadenas. n o v0.8 abandono del versionamiento. Supongo que con la fecha es suficiente. v0.7 M´ s correcciones y algunas secciones TO-DO escritas. a v0.6 Correcciones menores. v0.5 A˜ adida la secci´ n de redireccionamiento. n o v0.4 desaparici´ n de su sitio debido a mi ex-jefe. Este documento tiene un nuevo sitio en: http://www.linuxdoc.org. o Anteriores: no me acuerdo y no he usado rcs ni cvs :(
14.5 M´ s recursos a
Introducci´ n a bash (bajo BE) http://org.laol.net/lamug/beforever/bashtut.htm o Programaci´ n en Bourne Shell http://207.213.123.70/book/ o