Professional Documents
Culture Documents
Mike G (mikkey) disponible en dynamo.com.ar Traducido por Gabriel Rodrguez Alberich chewie@asef.us.es jueves, 27 de julio de 2000, a las 09:36:18 ART
Este artculo pretende ayudarle a comenzar a programar shell scripts a un nivel basico/intermedio. No pretende ser un documento avanzado (vea el ttulo). 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
Scripts muy sencillos 2.1 2.2 Tpico script hola mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un script de copia de seguridad muy simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Todo sobre redirecci n o 3.1 3.2 3.3 3.4 3.5 3.6 Teora y referencia r pida a
Ejemplo: stdout a un chero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo: stderr a un chero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo: stdout a stderr Ejemplo: stderr a stdout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tuberas 4.1 4.2 4.3 Qu son y por qu querr utilizarlas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e a Ejemplo: una tubera sencilla con sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo: una alternativa a ls -l *.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CONTENTS
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 chero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interfaces de usuario 9.1 9.2 Utilizando select para hacer men s sencillos u
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.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 cheros de un directorio. . . . . . . . . . . . . . . . . . . . . . . 12.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor) 12.3 Re-nombrador de cheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1. Introducci n o
12.4 Re-nombrador de cheros (sencillo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Cuando algo va mal (depuraci n) o 13.1 Maneras de llamar a BASH 14 Sobre el documento 14.1 (sin) Garanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 lnea 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
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.1
Este script tiene s lo dos lneas. La primera le indica al sistema qu programa usar para ejecutar el chero. o e La segunda lnea 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 lnea, #!/bin/bash, est mal. a Ejecute whereis bash, o vea encontrando el bash para saber c mo debe escribir esta lnea. o
2.2
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
Existen 3 descriptores de cheros: stdin, stdout y stderr (std=est ndar). a B sicamente, usted puede: a 1. redirigir stdout a un chero 2. redirigir stderr a un chero 3. redirigir stdout a stderr 4. redirigir stderr a stdout 5. redirigir stderr y stdout a un chero 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
4. Tuberas
En este caso, se crear un chero llamado ls-l.txt que contendr lo que se vera en la pantalla si escribiese el comando a a ls -l y lo ejecutase.
3.3
En este caso, se crear un chero llamado errores-de-grep.txt que contendr la parte stderr de la salida que dara el a a comando grep da *.
3.4
Esto har que la salida stdout de un programa se escriba en el mismo descriptor de chero que stderr. a
grep da * 1>&2
En este caso, la parte stdout del comando se enva a stderr; puede observar eso de varias maneras.
3.5
Esto har que la salida stderr de un programa se escriba en el mismo descriptor de chero que stdout. a
grep * 2>&1
En este caso, la parte stderr del comando se enva a stdout. Si hace una tubera con less, ver que las lneas que a normalmente desaparecen (al ser escritas en stderr), ahora permanecen (porque est n en el stdout). a
3.6
Esto colocar toda la salida de un programa en un chero. 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.
Tuberas
Esta secci n explica de una manera muy sencilla y pr ctica c mo utilizar tuberas, y por qu querra utilizarlas. o a o e
5. Variables
4.1
Las tuberas le permiten utilizar (muy sencillo, insisto) la salida de un programa como la entrada de otro.
4.2
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 enva (entuba) al programa sed, que imprime su salida correspondiente.
4.3
Probablemente esta es una manera m s difcil de hacer un ls -l *.txt, pero se muestra para ilustrar el funcionamiento a de las tuberas, no para resolver ese dilema.
ls -l | grep "\.txt$"
En este caso, la salida del programa ls -l se enva al programa grep, que imprimir las lneas que concuerden con la a regex (expresi n regular) \.txt$. o
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
La segunda lnea 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 e salida del programa ser diferente, y probablemente no sea lo que usted quera. a
5.2
6. Estructuras Condicionales
Este script introduce algo nuevo. Antes que nada, debera familiarizarse con la creaci n y asignaci n de variable de o o la lnea 2. Fjese en la expresi n $(date +%Y%m%d). Si ejecuta el script se dar cuenta de que ejecuta el comando o a que hay dentro de los par ntesis, capturando su salida. e Tenga en cuenta que en este script, el chero de salida ser distinto cada da, debido al formato pasado al comando a date (+%Y%m%d). Puede cambiar esto especicando un formato diferente. Algunos ejemplos m s: a echo ls echo $(ls)
5.3
Variables locales
Este ejemplo debera bastar para mostrarle el uso de una variable local.
Estructuras Condicionales
Las estructuras condicionales le permiten decidir si se realiza una acci n o no; esta decisi n se toma evaluando una o o expresi n. o
6.1
Pura teora
Los condicionales tienen muchas formas. La m s b sica es: if expresi n then sentencia donde sentencia s lo se a a o o ejecuta 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 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
6.2
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 , que indica el nal del c digo ejecutado condicionalmente. o
6.3
6.4
6.5
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]
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 explcita 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 lnea declaramos i como la variable que recibir los diferentes valores contenidos en $( ls ). a La tercera lnea podra ser m s larga o podra haber m s lneas 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 sera hacer que concordasen s lo a o ciertos cheros 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
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 <Hola! } hola salir echo petete
Las lneas 2-4 contienen la funci n salir. Las lneas 5-7 contienen la funci n hola. Si no est completamente seguro o o a de lo que hace este script, por favor, pru belo!. e Tenga en cuenta que una funci n no necesita que sea declarada en un orden especco. 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 o programa nunca llega a la lnea 10.
8.2
9. Interfaces de usuario
11
Este script es casi id ntico al anterior. La diferencia principal es la funci n e. Esta funci n imprime el primer e o o argumento que recibe. Los argumentos, dentro de las funciones, son tratados de la misma manera que los argumentos suministrados al script.
9
9.1
Interfaces de usuario
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 opcin errnea o o fi done
Si ejecuta este script ver que es el sue o de un programador para hacer men s basados en texto. Probablemente se a n u dar 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 o se lo pide al usuario.
9.2
Lo que hace este script debera estar claro para usted. La expresi n del primer condicional comprueba si el programa o ha 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 n resto del script debera estar claro.
12
10
10.1
Miscel nea a
Leyendo informaci n del usuario o
En 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 debera claricarlo. u
#!/bin/bash echo Por favor, introduzca su nombre y primer apellido read NO AP echo "<Hola $AP, $NO!"
10.2
Pruebe esto en la lnea de comandos (o en una shell): echo 1 + 1 Si 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 e esta manera: echo $[1+1] Si necesita usar fracciones, u otras matem ticas, puede utilizar bc para evaluar expresiones aritm ticas. a e Si ejecuta echo $[3/4] en la lnea de comandos, devolver 0, porque bash s lo utiliza enteros en sus respuestas. Si a o ejecuta echo 3/4|bc -l, devolver 0.75. a
10.3
Encontrando el bash
De un mensaje de mike (vea los agradecimientos): siempre usas #!/bin/bash .. a lo mejor quieres dar un ejemplo de c mo saber d nde encontrar el bash. o o locate bash es preferible, pero no todas las m quinas a tienen locate. nd ./ -name bash desde el directorio raz funcionar , a normalmente. Sitios donde poder buscar:
11. Tablas
13
ls -l /bin/bash ls -l /sbin/bash ls -l /usr/local/bin/bash ls -l /usr/bin/bash ls -l /usr/sbin/bash ls -l /usr/local/sbin/bash (no se me ocurre ning n otro directorio... lo he encontrado u la mayora de estos sitios en sistemas diferentes). Tambi n puedes probar which bash. e
10.4
En 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 e es sugerencia de Mike).
#!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?
11
Tablas
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
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 vacos, aparecer un parse error. Es mejor: x$1=x$2 or $1=$2 a
11.3
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 ujo) Sed es un editor no interactivo. En vez de alterar un chero moviendo el cursor por la pantalla, se utiliza una serie de instrucciones de edici n de sed, y el nombre del chero a editar. Tambi n se puede describir a sed como un ltro. 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 chero /tmp/petete. El resultado se enva a stdout (normalmente la consola), pero se puede a adir > captura al nal de la lnea de arriba para que sed enve la n salida al chero capture.
$sed 12, 18d /tmp/petete
Sed muestra todas las lneas de /tmp/petete excepto la 12 y la 18. El chero 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 chero /tmp/petete con las siguientes lneas: 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 lnea 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 chero.awk, y poner todos los patrones y acciones en chero.awk. grep (impresi n de lneas que coinciden con un patr n de b squeda) o o u Ya hemos visto ejemplos del comando grep en los captulos anteriores, que muestra las lneas 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 chero /var/log/messages. [vale, este ejemplo es falso, el chero /var/log/messages est alterado :-)] a wc (cuenta lneas, palabras y bytes) En el siguiente ejemplo, vemos que la salida no es lo que esper bamos. El chero 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: lneas, palabras, bytes y chero. sort (ordena lneas de cheros de texto) Esta vez, el chero petete contiene el texto siguiente: b c a
$sort /tmp/petete
Esto es lo que muestra la salida: a b c Los comandos no deberan 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 lnea de comandos (entrada desde un chero, pero no desde una redirecci n o una tubera), 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 28 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
Limpia la pantalla y la lnea 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 virgueras en la lnea 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 cheros 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 cheros
#!/bin/sh # renom: renombra mltiples 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) condicin coincide, se ejecuta esa parte o del programa y acaba
# comprueba la condicin 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 rpida comprobacin para ver si se especific algn 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 idntico 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 sustitucin o if [ $1 = r ]; then shift # he includo esto para no daar ningn fichero si el n u # usuario no especifica que se haga nada # tan slo una medida de seguridad o if [ $# -lt 3 ] ; then echo "uso: renom r [expresin] [sustituto] ficheros... " o exit 0 fi # elimina el resto de informacin 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 lnea de comandos que analiza la entrada estndar y sustituye una expresin por a o una cadena dada aqu le pasamos el nombre del fichero (como entrada estndar) 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 # cmo hacerlo o echo "uso:"
20
" renom p [prefijo] ficheros.." " renom s [sufijo] ficheros.." " renom r [expresin] [sustituto] ficheros.." o 0
# hecho!
12.4
13
13.1
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
21
14.2
Traducciones
Italiano: por William Ghel (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 Rodrguez Alberich http://www.insug.org Supongo que habr m s traducciones, pero no tengo informaci n sobre ellas. Si las tiene, por favor, envemelas 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 cheros 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 suciente. 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