Está en la página 1de 20

16/09/13

Script - doc.ubuntu-es

Script
De doc.ubuntu-es

Contenido
1 Definicin 2 Variables 2.1 Variables intrnsecas de Bash. 2.2 Variables creadas por el programador. 3 Caracteres especiales 4 Palabras especiales 5 Texto de titular 6 Argumentos propios de bash 7 Entrada/Salida 8 Condicionales 8.1 if-then fi 8.2 case-in esac 9 Funciones 10 Ciclos, lazos o bucles 10.1 While-do done 10.2 until-do done 10.3 for-in-done 11 Redireccionamiento 11.1 Los descriptores de archivos 11.2 Entubado 12 Globales y expansiones 12.1 Globales 12.2 Expansiones 13 Aritmtica de Bash 14 Lgica de Bash 15 Consideraciones finales

Definicin
Un Script (o guin) para Bash es un archivo de texto que contiene una sucesin de comandos de Shell que pueden ejecutar diversas tareas de acuerdo al contenido del texto del guin. De esta forma pueden automatizarse muchas acciones para alguna necesidad particular o para la administracin de sistemas. El guin debe escribirse en un orden lgico pues Bash ejecutar el guin en el orden en que se escriben las lneas, de la misma forma que cuando se realiza una tarea cualquiera por una persona, por ejemplo; primero hay que poner la escalera y luego subirse. Los Scripts de Bash deben tener siempre como primera lnea del guin el texto, para que el Sistema Operativo ejecute la accin usando el programa Bash.
doc.ubuntu-es.org/Script 1/20

16/09/13

Script - doc.ubuntu-es

# ! / b i n / b a s h

Una vez escrito el Script y guardado en el disco en alguno de los directorios "bin" con el nombre y permiso de ejecucin apropiados, se invoca, escribiendo en la consola el nombre del guin. Si el guin tiene una interfaz grfica se invoca como otro programa cualquiera, uno o dos clic sobre el guin o su icono. Este puede escribirse en cualquiera de los editores de texto de Linux, por ejemplo Kwrite y ser ya un guin funcional cuando se salve a alguno de los "bin". Nota: Es buena prctica cuando se escribe un guin salvarlo apenas se hayan escrito las primeras lneas para ir comprobando su funcionamiento e ir corrigiendo los problemas.

Variables
Es impensable elaborar Scripts de Bash sin el uso de las variables. Una variable es una estructura de texto (una letra, un nmero o sucesiones de ellos) que representa alguno de los elementos que varan en valor y/o significado en el entorno de la Shell, sirviendo como elemento bsico de entrada/salida de valores a y desde los comandos en su ejecucin consecutiva. Para invocar una variable se utiliza el carcter especial $ precediendo al nombre de la variable. Existen dos tipos de variables:

Variables intrnsecas de Bash.


Estas son elaboradas por defecto por el propio Bash y son: $0 Nombre del guin $1....$n Variables que almacenan los n argumentos (opciones) proporcionados al comando. $# Variable que contiene el total de los argumentos proporcionados. $* Conjunto de los argumentos. $? Valor de ejecucin del comando anterior, si es cero es que el comando anterior se ejecut sin errores, de lo contrario hubo algn error. $$ Identifica el proceso del guin. $!
doc.ubuntu-es.org/Script 2/20

16/09/13

Script - doc.ubuntu-es

Identifica el ltimo proceso arrancado en el trasfondo (background).

Variables creadas por el programador.


Las variables pueden ser creadas en cualquier momento, pero siempre antes de su utilizacin de manera muy simple, se escribe:
n o m b r e _ v a r i a b l e = v a l o r _ v a r i a b l e

en cualquier momento posterior a la creacin si se coloca $nombre_variable dentro del entorno de la Shell el sistema colocar all valor_variable.
S A L U D O = B i e n v e n i d o

En cualquier momento posterior si se pone $SALUDO, Bash colocar ah Bienvenido. Una variable tambin puede ser la salida de un comando si ponemos al principio y final del mismo un acento invertido.
S A L I D A = ` c o m a n d o `

le indicar al sistema que donde se escriba $SALIDA debe poner la salida de ese comando. Es prctica comn utilizar maysculas para las variables a fin de identificarlas fcilmente dentro del guin. Cuando se ejecutan Scripts que pueden ser "hijos" de otro guin en ocasiones es necesario exportar las variables, esto se hace escribiendo;
e x p o r tn o m b r e _ v a r i a b l e

Caracteres especiales
Existe un grupo de caracteres especiales (tambin llamados meta caracteres) que tienen significado propio para Bash. Algunos son: \ Le indica a Bash que ignore el carcter especial que viene despus. "" Cuando se encierra entre comillas dobles un texto o una variables, si sta es una frase (cadena de palabras), Bash lo interpretar como una cadena nica. $ Identifica que lo que le sigue es una variable. ''
doc.ubuntu-es.org/Script 3/20

16/09/13

Script - doc.ubuntu-es

Las comillas simples se usan para desactivar todos los caracteres especiales encerrados dentro de ellas, as tenemos que si escribimos '$VARIABLE' Bash interpreta literalmente lo escrito y no como variable. # Cuando se coloca este carcter dentro de una lnea del guin, Bash ignora el resto de la lnea. Muy til para hacer comentarios y anotaciones o para inhabilitar una lnea de comandos al hacer pruebas. ; Este carcter se usa para separar la ejecucin de distintos comandos en una misma lnea de comandos. `` Se utiliza como se explic en el punto anterior, para convertir la salida de un comando en una variable. El comando en cuestin se ejecuta en una sub shell. Tambin estn |, (), !, >, <, cuyo significado se ver mas adelante. El espacio es otro carcter especial y se interpreta por bash como el separador del nombre del programa y las opciones dentro de la lnea de comandos, por esta razn es importante encerrar entre comillas dobles el texto o las propias variables cuando son una frase de varias palabras. Otro carcter que debe evitarse en lo posible su uso es el guin (-), ya que en la mayora de los programas se usa para indicarle al propio programa que lo que sigue es una de sus opciones, de manera tal por ejemplo, si creamos un archivo con nombre -archivo (en caso que podamos) despus ser difcil borrarlo ya que rm (programa que borra) tratar el archivo como una de sus opciones (al "ver" el Script) y dar de error algo as, "Opcin -archivo no se reconoce".

Palabras especiales
Hay un grupo de palabras que tienen significado especial para bash y que siempre que se pueda deben evitarse cuando se escriben lneas de comandos para no crearle "confusiones", algunas son: exit, break, continue, true, false, return etc... cuyo significado es mas o menos as:

Texto de titular
exit Se sale del guin break Se manda explcitamente a salir de un ciclo continue Se manda explcitamente a retornar en un ciclo return
doc.ubuntu-es.org/Script 4/20

16/09/13

Script - doc.ubuntu-es

Como exit pero solo se sale del comando u operacin sin cerrar el guin true Indica que una condicin es verdadera false Indica que una condicin es falsa

Argumentos propios de bash


Bash como programa tiene algunos argumentos tiles y propios que se usan con frecuencia en la elaboracin de Scripts en los condicionales vinculados a la determinacin de elementos sobre los archivos, variables, cadenas de palabras o cadenas de pruebas, los mas comunes son: Argumentos de Archivos -d -c -e -h -s -f -r -w -x -O -G -n Archivo1 nt Archivo2 Archivo1 -ot Archivo2 Argumentos de cadenas -z -n cadena1 = cadena2 cadena1 != cadena2 cadena1 < cadena2 cadena1 >cadena2 Cierto si.... (salida 0) Archivo existe y es un directorio Archivo existe y es de caracteres Archivo existe Archivo existe y es un vnculo simblico Archivo existe y no est vaco Archivo existe y es normal Tienes permiso de lectura del archivo Tienes permiso de escritura en el archivo Tienes permiso de ejecucin del archivo Eres propietario del archivo Perteneces al grupo que tiene acceso al archivo Variable existe y no es nula Archivo1 es mas nuevo que Archivo2 Archivo1 es mas viejo que Archivo2 Cierto si La cadena est vaca La cadena no est vaca Si las cadenas son iguales Si las cadenas son diferentes Si la cadena 1 va antes en el orden lexicogrfico Si la cadena 1 va despus en el orden lexicogrfico

Entrada/Salida
doc.ubuntu-es.org/Script 5/20

16/09/13

Script - doc.ubuntu-es

En algunas ocasiones ser necesario leer ciertas variables desde el teclado o imprimirlas a la pantalla, para imprimir a la pantalla se pueden invocar dos programas en la lnea de comandos:

echo printf (que es un echo mejorado)

Y para leer desde el teclado se usa:

read

Si hacemos un read sin asignar variable, el dato se almacena en $REPLY. una variable del sistema. Tanto el comando echo como read tienen sus propias opciones. Ejemplos: 1. Si creamos en una lnea del Script una variable como un comando y queremos imprimir la variable a la pantalla podemos hacer algo as:
V A R I A B L E = ` c o m a n d o ` e c h o" $ V A R I A B L E "

La palabra $VARIABLE est puesta entre comillas dobles para que se imprima todo el texto ignorando los espacios entre palabras. 1. Si escribimos en una lnea del guin
r e a dP R E G U N T A

habremos creado una variable de nombre PREGUNTA as es que si luego ponemos


e c h o" $ P R E G U N T A "

Se imprimir a la pantalla lo que se escribi en el teclado al presionar la tecla Enter. Con los elementos tratados hasta aqu ya podemos escribir nuestros primeros guiones Guin 1
# ! / b i n / b a s h e c h oH o l am u n d o
doc.ubuntu-es.org/Script 6/20

16/09/13

Script - doc.ubuntu-es

Cuando se corre este guin se imprimir a la pantalla Hola mundo Guin 2 Lo mismo usando una variable
# ! / b i n / b a s h V A R I A B L E = H o l am u n d o e c h o" $ V A R I A B L E "

Ntese la variable entre comillas dobles para que imprima todo el texto. Guin 3 Cuando se usan ms de una variable
# ! / b i n / b a s h V A R I A B L E = H o l a S A L U D O = m u n d o e c h o" $ V A R I A B L E " " $ S A L U D O "

En los tres casos se imprimir a la pantalla Hola mundo Guin 4 Si se usan caracteres especiales la cosa puede cambiar
# ! / b i n / b a s h V A R = a u t o e c h o" M ec o m p r u n$ V A R " e c h o' M ec o m p r u n$ V A R ' e c h o" M ec o m p r u n\ $ V A R "

I m p r i m i r M ec o m p r u na u t o I m p r i m i r M ec o m p r u n$ V A R I m p r i m i r M ec o m p r u n$ V A R

Note como las comillas simples y el carcter \ hacen que Bash ignore la funcin del carcter especial $. Siempre las comillas simples harn que se ignore todos los meta caracteres encerrados entre ellas y \ solo el que sigue despus.

Condicionales
Los condicionales son claves para "explicarle" a la mquina cmo debe proceder en una tarea cualquiera, esto se hace casi como si se estuviera explicando una tarea a ejecutar a otra persona.

if-then fi
El condicional por excelencia tiene seis palabras claves que son if, elif, else , then y fi. Donde las palabras tienen un significado comunicativo (en ingls) casi literal, como si se tratara con otra persona y que Bash por defecto las entienda con ese significado. if si condicional (de si esto o lo otro) elif tambin si (contraccin de else if) else
doc.ubuntu-es.org/Script 7/20

16/09/13

Script - doc.ubuntu-es

De cualquier otra manera then Entonces fi if invertido, indica que se acab la condicional abierta con if Solo son imprescindibles en la estructura del Script if, then y fi. Supongamos ahora que es usted el jefe de una oficina y tiene una secretaria y que por alguna razn le han pedido que enve una copia de cualquier documento que lo identifique; normalmente le dira a la secretaria algo as:
" M a r a ,p o rf a v o r ,b u s c ae ne la r c h i v oa l g u n ai d e n t i f i c a c i n " ( c o n d i c i nae v a l u a r ) i f " s ie su n ac o p i ad e lp a s a p o r t e " ( p r i m e rr e s u l t a d od el ac o n d i c i n ) ;t h e n( e n t o n c e s ) "e n v a l ap o rf a xa . . . . " ( e q u i v a l e n t ea lc o m a n d oae j e c u t a r ) e l i f " s ie sd el al i c e n c i ad ec o n d u c c i n " ( s e g u n d or e s u l t a d od el ac o n d i c i n ) ;t h e n " e n v a l ap o rc o r r e o " ( o t r oc o m a n d oae j e c u t a r ) e l i f "s ie sd e lc a r n d ei d e n t i d a d " ( t e r c e rr e s u l t a d od el ac o n d i c i n ) ;t h e n " e n v a l ac o nu nm e n s a j e r o"( o t r oc o m a n d od i f e r e n t e ) e l s e" d ec u a l q u i e ro t r am a n e r a " " p a s au nf a xd i c i e n d oq u el ae n v i a r m a a n a " ( o t r oc o m a n d o ) f i

Observe que la accin a ejecutar (equivalente al comando) se hace si la condicin se evala como verdadera, de lo contrario se ignora y se pasa a la prxima, si ninguna es verdadera se ejecuta finalmente la accin despus del else. La sintaxis de bash se debe tener en cuenta a la hora de escribir el Script o de lo contrario Bash no entender lo que usted quiso decirle, Pongamos ejemplos de guiones reales Guin 5
# ! / b i n / b a s h V A R 1 = P a b l o V A R 2 = P e d r o i f[" $ V A R 1 "=" $ V A R 2 "] ;t h e n e c h oS o ni g u a l e s e l s e e c h oS o nd i f e r e n t e s f i

Los corchetes son parte de la sintaxis de Bash y en realidad son un atajo (shortcut) al programa test que es el que ejecuta la accin de comparacin. Observe siempre los espacios vacos entre los elementos que conforman la lnea de comandos (excepto entre el ltimo corchete y el ;), recuerde que ese espacio vaco por defecto Bash lo interpreta como final de un elemento y comienzo de otro. Si corre este guin siempre se imprimir a pantalla Son diferentes, ya que la condicin es falsa. Pero si cambia el valor de VAR2=Pablo entonces se imprime Son iguales. Guin 6 Un guin que verifica si existe un directorio y si no existe lo crea e imprime mensajes a pantalla comunicando la accin ejecutada.

# ! / b i n / b a s h D I R = ~ / f o t o s ( c r e ac o m ov a r i a b l ee ld i r e c t o r i o/ h o m e / f o t o s ) i f[!d" $ D I R "] ;t h e n ( v e r i f i c as i n oe x i s t ee ld i r e c t o r i o ) m k d i r" $ D I R " ( s il ac o n d i c i ne sc i e r t a ,n oe x i s t ee ld i r e c t o r i o ,l oc r e a ) i f[$ ?e q0] ;t h e n( v e r i f i c as il aa c c i ns ee j e c u t s i ne r r o r e s ,d es e ra s i m p r i m el oq u es i g u e ) e c h o" $ D I R "h as i d oc r e a d o . . . " e l s e ( d el oc o n t r a r i oi m p r i m e )


doc.ubuntu-es.org/Script 8/20

16/09/13

Script - doc.ubuntu-es

e c h o" S ep r o d u c eu ne r r o ra lc r e a r" $ D I R " f i( S ec i e r r al ac o n d i c i na b i e r t ae nl ar e a l i z a c i nd e ld i r e c t o r i os e g u n d oi f ) e l s e(d el oc o n t r a r i o ,r e l a t i v oa lp r i m e ri f ) e c h o" S eu s a r " $ D I R "e x i s t e n t e " f i

En este guin pueden verse varias cosas nuevas: 1. El carcter ! niega la accin, si se hubiera escrito if [ -d "$DIR" ] lo que se estaba evaluando era la condicin existe el directorio"$DIR"? pero al colocar ! se evala lo contrario. 2. El carcter ~ significa el /home del usuario. 3. La expresin -eq se utiliza cuando quieren compararse valores numricos, y significa = 4. Se usa una de las variables del sistema, "$?", explicada ms arriba. 5. Pueden utilizarse unos condicionales dentro de otros siempre que se cierren apropiadamente.

# ! / b i n / b a s h e c h o" D i g as ion o : " r e a dV A R i f [" $ V A R "=s i] ;t h e n e c h o" E s c r i b i s t es i " e l i f[" $ V A R "=n o] ;t h e n e c h o" E s c r i b i s t en o " e l i f[" $ V A R "=" "] ;t h e n e c h o" N op u e d ed e j a r l oe nb l a n c o " e l s e e c h o" L oq u ee s c r i b i n os ea c e p t a " f i

Observe que se estn evaluando varias opciones de la misma condicin, por lo que lo apropiado es incorporar los respectivos elif dentro de la misma condicional. Un elemento nuevo que se incorpora aqu es la condicin " ", que quiere decir "la variable est vaca". En este caso, cuando no se escribi nada.

case-in esac
Cuando una variable puede puede adquirir varios valores o significados diferentes, ya hemos visto como puede usarse la palabra elif para hacer diferentes ejecuciones de comandos dentro de una misma condicional if-thenfi de acuerdo al valor de la variable. Una forma de realizar la misma accin sin escribir tantas lneas de condicionales elif y con ello disminuir el tamao del guin es la utilizacin de la sentencia case-in-esac. Esta sentencia permite vincular patrones de texto con conjuntos de comandos; cuando la variable de la sentencia coincide con alguno de los patrones, se ejecuta el conjunto de comandos asociados. La sintaxis de la sentencia case-in esac es como sigue
c a s e" n o m b r e _ v a r i a b l e "i n p o s i b i l i d a d1 ) " u n oom a sc o m a n d o s "; ; p o s i b i l i d a d2 ) " u n oom a sc o m a n d o s "; ; p o s i b i l i d a dn ) " u n oom a sc o m a n d o s "; ; e s a c

Guin 8

doc.ubuntu-es.org/Script

9/20

16/09/13

Script - doc.ubuntu-es

# ! / b i n / b a s h e c h o" D i g as ion o : " r e a dV A R c a s e" $ V A R "i n s i )e c h o" E s c r i b i s t es i "; ; n o )e c h o" E s c r i b i s t en o "; ; * )e c h o" L oq u ee s c r i b i n os ea c e p t a "; ; e s a c

Este guin es el mismo guin 7 pero utilizando la sentencia case-in-esac Observe que el carcter (*) utilizado en la ltima opcin significa "patrn no contemplado" en este caso

Funciones
Como mecanismo de estructuracin en la codificacin de Scripts, existe la posibilidad de crear funciones. Su definicin exige la definicin de un nombre y un cuerpo. El nombre que debe ser representativo , es seguido de apertura y cierre de parntesis, mientras que el cuerpo se delimita con llaves. La sintaxis es la siguiente.
n o m b r e _ f u n c i n( ) { u n oom a sc o m a n d o s }

Una vez definida la funcin se utiliza como si de un comando se tratase, invocndolo con el nombre de la funcin. Hay que hacer una invocacin de la funcin ya definida para que se ejecute el cdigo en su interior y se convierta en operativa. Las funciones son muy tiles cuando segmentos del cdigo del Script son repetitivos, de tal forma solo se escriben una vez y se invocan todas las veces que haga falta, practicando el divino arte de la recursin. Creando una funcin simple:
a y u d a( ) ( s ed e f i n el af u n c i na y u d a ) { e c h o" L a so p c i o n e ss o ns ion o ,l u e g oa p r i e t eE n t e r " }

Despus de creada y activada la funcin, cada vez que necesitemos la "ayuda" dentro del guin solo colocamos la palabra ayuda como si se tratase de un comando ms y Bash ejecutar el cdigo incluido dentro de la funcin, es decir, imprimir el texto "Las opciones son si o no, luego apriete Enter". Las funciones pueden ser definidas en cualquier orden, pueden ser tantas como haga falta y pueden contener un paquete relativamente complejo de comandos. Un programador que ha pensado la estructura del Script antes de empezarlo puede y de hecho se hace, crear todas las funciones que necesitar al empezar el guin. Pruebe lo siguiente Guin 9
# ! / b i n / b a s h s a l i r( ) # ( S ec r e al af u n c i ns a l i r ) { e x i t # ( c o m a n d o ) } h o l a ( ) # ( S ec r e al af u n c i nH o l a ) { e c h oH o l a # ( c o m a n d o ) }
doc.ubuntu-es.org/Script 10/20

16/09/13

Script - doc.ubuntu-es

h o l a #( S ei n v o c al af u n c i nH o l a ) s a l i r #(S ei n v o c al af u n c i ns a l i r ) e c h o" E s t on os ei m p r i m en u n c a "

Ver que el ltimo echo no se imprime. ya que primero se invoca la funcin hola y luego la funcin salir, que cierra el guin (exit). Trate ahora poniendo un comentario (#) a la lnea que invoca la funcin salir (lnea 11) y note la diferencia, ver cmo se imprime el ltimo echo. Observe tambin cmo se han comentado aquellas cosas que no son parte integrante del guin pero que se pueden escribir para hacer aclaraciones o anotaciones de inters.

Ciclos, lazos o bucles


While-do done
La sentencia while-do done se utiliza para ejecutar un grupo de comandos en forma repetida mientras una condicin sea verdadera. Su sintaxis es:
w h i l e l i s t ad ec o m a n d o s1 d o l i s t ad ec o m a n d o s2

done Mientras la condicin de control (lista de comandos1) sea verdadera, se ejecutarn los comandos comprendidos entre do y done en forma repetida, si la condicin da falsa (o encuentra una interrupcin explcita dentro del cdigo) el programa sale del bucle (se para) y contina la ejecucin por debajo del while. Un ejemplo de la utilidad de este lazo es la posibilidad de poder escoger varias opciones de un men sin tener que correr el guin para cada opcin, es decir se escoge y evala una opcin y el programa no se cierra, vuelve al men principal y se puede escoger otra opcin, tantas veces como sea necesario. Veamos un ejemplo de cmo elaborar un men de opciones.
# ! / b i n / b a s h w h i l e[" $ O P C I O N "! =5] d o e c h o" [ 1 ]L i s t a ra r c h i v o s " e c h o" [ 2 ]V e rd i r e c t o r i od et r a b a j o " e c h o" [ 3 ]C r e a rd i r e c t o r i o " e c h o" [ 4 ]C r e a ru s u a r i o " e c h o" [ 5 ]S a l i r " r e a dp" I n g r e s eu n ao p c i n :"O P C I O N c a s e$ O P C I O Ni n 1 )l s ; ; 2 )p w d ; ; 3 )r e a dp" N o m b r ed e ld i r e c t o r i o :"D I R E C T O R I O m k d i r$ D I R E C T O R I O ; ; 4 )i fi d|g r e pu i d = 0 t h e n r e a dp" N o m b r ed e lu s u a r i o :"N O M B R E U S U A R I O u s e r a d d$ N O M B R E U S U A R I O e l s e e c h o" S en e c e s i t a np e r m i s o sd er o o t " f i ; ; 5 ) ; ; * )e c h o" O p c i ni n g r e s a d ai n v a l i d a ,i n t e n t ed en u e v o " ; ; e s a c d o n e
doc.ubuntu-es.org/Script 11/20

16/09/13

Script - doc.ubuntu-es

e x i t0

Descripcin del Script: 1. En la primera lnea condicionamos el lazo a que la opcin escogida sea diferente de 5. 2. Luego se hace una lista de echos de las opciones desde 1 hasta 5 con su descripcin para que sean imprimidas a la pantalla y as poder escoger alguna. 3. Le sigue el comando read para que lea del teclado la opcin escogida (variable OPCION), a read se le ha agregado -p que hace que imprima un mensaje, en este caso imprime Ingrese una opcin. 4. Para ahorrar lneas del guin se elabora un case con los comandos que deben ejecutarse en cada caso: ls para listar los archivos [1], pwd (present work directory) para ver directorio de trabajo [2], otro read para escribir el nombre del directorio que quiere crear [3] y hacer la variable DIRECTORIO seguido por mkdir, que crea el directorio. Luego se crea una condicional if-fi para chequear si el usuario tiene permisos de root, necesario para la opcin [4] de crear un usuario, rechazndolo de lo contrario. Despus viene la opcin [5] vaca que ejecuta el comando exit 0. Finalmente se incluye "cualquier otra cosa" con el carcter * Este guin resulta interesante porque se usan las dos formas de compactar el guin vistas hasta ahora, la sentencia case-in esac y la while-do done. Adems empiezan a aparecer incluidos en los comandos algunos de los programas muy usados de Linux al escribir guiones.

until-do done
La sentencia until-do done es lo contrario de while-do done es decir el lazo se cierra o para, cuando la condicin sea falsa. Si le parece que ambas son muy parecidas est en lo cierto. En ambos casos se pueden elaborar bucles o ciclos infinitos si la condicin de control es siempre verdadera o falsa segn el caso, veamos Lazos infinitos Bucles infinitos son aquellos donde la ejecucin contina dentro del bucle indefinidamente, veamos cmo hacer un bucle infinito mediante while:
w h i l et r u e d o c o m a n d o1 c o m a n d o2 c o m a n d on d o n e

La condicin siempre es verdadera y se ejecutara el bucle indefinidamente, mediante until sera as:
u n t i lf a l s e d o c o m a n d o1 c o m a n d o2 c o m a n d on d o n e

Existe la posibilidad de salir de un bucle, independientemente del estado de la condicin, el comando break produce el abandono del bucle inmediatamente. Veamos el guin anterior sobre la creacin de un men utilizando un lazo infinito y el comando break

doc.ubuntu-es.org/Script

12/20

16/09/13

Script - doc.ubuntu-es

w h i l et r u e d o e c h o" [ 1 ]L i s t a ra r c h i v o s " e c h o" [ 2 ]V e rd i r e c t o r i od et r a b a j o " e c h o" [ 3 ]C r e a rd i r e c t o r i o " e c h o" [ 4 ]C r e a ru s u a r i o " e c h o" [ 5 ]S a l i r " r e a dp" I n g r e s eu n ao p c i n :"O P C I O N c a s e$ O P C I O Ni n 1 )l s ; ; 2 )p w d ; ; 3 )r e a dp" N o m b r ed e ld i r e c t o r i o :"D I R E C T O R I O m k d i r$ D I R E C T O R I O ; ; 4 )i fi d|g r e pu i d = 0 t h e n r e a dp" N o m b r ed e lu s u a r i o :"N O M B R E U S U A R I O u s e r a d d$ N O M B R E U S U A R I O e l s e e c h o" S en e c e s i t a np e r m i s o sd er o o t " f i ; ; 5 ) e c h o" A b a n d o n a n d oe lp r o g r a m a . . . " b r e a k ; ; * ) e c h o" O p c i ni n g r e s a d ai n v l i d a ,i n t e n t ed en u e v o " ; ; e s a c d o G u i n1 1 n e e x i t0

for-in-done
Es otro tipo de ciclo o lazo disponible, la diferencia con los anteriores es que no se basa en una condicin, sino que ejecuta el bucle una cantidad determinada de veces, su sintaxis es la siguiente:
f o rv a r i a b l ei na r g1a r g2. . . . . . a r gn d o c o m a n d o1 c o m a n d o2 c o m a n d on d o n e

Ejemplos
f o rL E T R Ai nabcdef d o e c h o$ L E T R A d o n e

En este guin el comando echo se ejecutar tantas veces como argumentos se hayan puesto despus del in, por lo tanto imprimir seis lneas, cada una con una letra de la a a la f.

f o rA R C H I V Oi n* i f[d$ A R C H I V O] ;t h e n c d$ A R C H I V O r m* . t m p c d. . f i
doc.ubuntu-es.org/Script 13/20

16/09/13

Script - doc.ubuntu-es

d o n e

Este es un guin que entra en todos los subdirectorios del directorio actual de trabajo y borrar todos los archivos .tmp (temporales). En este caso el carcter * se usa en la primera lnea con el significado "tantas veces como sea necesario" y en la penltima lnea como "cualquier cosa".

Redireccionamiento
Es frecuente la necesidad de redirigir resultados de la ejecucin de un comando a diferentes lugares, que pueden ser los descriptores de ficheros stdin, stdout y stderr, a la entrada de otro comando o a un archivo en el disco duro. Esto se llama redireccin y es muy til en la escritura de guiones.

Los descriptores de archivos


En Bash, al igual que en cualquier otro programa de consola de Linux, tenemos tres flujos o descriptores de archivos abiertos por defecto: La entrada estndar (STDIN) La salida estndar (STDOUT) El error estndar (STDERR) El primero puede ser utilizado para leer de l, y los otros dos para enviar datos hacia ellos. Normalmente STDIN viene del teclado de la terminal en uso, y tanto STDOUT como STDERR van hacia la pantalla. STDOUT muestra los datos normales o esperados durante la ejecucin, y STDERR se utiliza para enviar datos de depuracin o errores. Cualquier programa iniciado desde el shell, a menos que se le indique explcitamente, hereda estos tres descriptores de archivo permitindole interactuar con el usuario. Enviar STDOUT a un archivo En ocasiones necesitamos enviar la salida estndar a un archivo y no a la pantalla, ya sea porque es muy grande para "manejar a ojo" o porque nos interesa guardarla en disco duro. Para enviar la salida estndar a un archivo usamos > con lo que se sobreescribe el archivo si ya existe, o >> que solo agrega los datos de salida al final del archivo ya existente.

# ! / b i n / b a s h l sR/ h o m e / m i s _ f o t o s>/ t m p / i n d i c e

Crear un archivo llamado /tmp/indice donde estar el listado de los archivos bajo /home/mis_fotos. Tomar STDIN de un archivo Si queremos que un proceso tome su entrada estndar de un archivo existente usamos < como es el caso por ejemplo de los procesos que piden datos de confirmacin (nombre de usuario, contrasea etc). Para esto creamos un archivo con los datos de confirmacin y agregamos un < antes del comando que ejecutar el proceso. Enviar STDERR a un archivo
doc.ubuntu-es.org/Script 14/20

16/09/13

Script - doc.ubuntu-es

Si queremos enviar la salida de errores a un archivo se procede igual que lo que se mencionaba con respecto a la salida estndar, pero se usa &> o &>> segun el caso. Enviar STDERR a STDOUT Para esto se escribe al final de la lnea de comandos 2>&1. Enviar STDOUT a STDERR En este caso se escribe al final de la lnea de comandos 1>&2

Entubado
Las tuberas se utilizan para enviar la salida de un comando o proceso a la entrada de otro, esto es con frecuencia necesario para completar una accin iniciada con un comando que debe ser completada con otro. Es simple el modo de operar, solo se coloca el carcter | en la lnea de comandos entre un programa y otro. Este carcter (|) se conoce como tubo (pipe)

# ! / b i n / b a s h f i l eb" $ 1 "|g r e pi" v o r b i s "> / d e v / n u l l2 > & 1 i f[$ ?e q0] ;t h e n o g g d e c" $ 1 " e c h o " H e c h o " e l s e e c h o" A r c h i v on os o p o r t a d o " e x i t f i

Este guin convierte a wav cualquier archivo de audio ogg. Primero se invoca a file para que analice el tipo de archivo correspondiente a la variable $1 que como ya se sabe es el primer argumento introducido en la lnea de comandos (por ejemplo la ruta hasta un archivo). Luego la salida de file se entuba al programa grep que determina si dentro del archivo aparece la palabra vorbis (caso de los archivos de audio ogg). El condiciomal ifthen-fi chequea que sea cierto (es decir la palabra vorbis s exista, por lo que es un archivo ogg de audio), entonces se decodifica a wav con el comando oggdec, de lo contrario se imprime que es un archivo no soportado. Tanto la salida estndar como la de errores se enva a /dev/null, un dispositivo que "hace desaparecer" la informacin suprimiendo la salida por pantalla. Esto es conveniente y saludable en muchas lneas de comandos cuando la salida puede generar gran cantidad de informacin tanto de salida estndar como de errores y estos no nos interesan. Solo se escribe >/dev/null 2>&1.

Globales y expansiones
Globales
Estos son aliados cuando uno quiere ahorrarse teclazos y funcionan como "generalizadores" de cosas, los globales ms comunes son: 1. ~ Le dice a Bash que es el directorio home del usuario. 2. * Significa "todo lo que puedas incluir ah" de forma tal que si ponemos el comando ls ~/*.wav listar
doc.ubuntu-es.org/Script 15/20

16/09/13

Script - doc.ubuntu-es

todos los archivos .wav que estn en el directorio home del usuario. Ahora si escribimos ls ~/m* nos listar todos los archivos de home que empiecen con m. 3. . Un punto en el entorno de la shell significa "el directorio donde estamos trabajando" Ejemplo:

# ! / b i n / b a s h D I R = . m k d i r" $ D I R " e c h o" $ ? "

Si escribimos este guin y lo corremos dar un error. Por supuesto, le estamos mandando a hacer el directorio donde estamos. Habr notado usted que es muy comn a la hora de compilar programas desde el binario utilizar ./configure, con esto le estamos diciendo a Bash "corre el archivo configure que est en este mismo directorio".

Expansiones
Las expansiones son ms configurables y trabajan con argumentos mucho ms definidos, est claramente hecha para hacer ms inteligente la shell. Cuando especificamos una lista de valores o argumentos separados por comas entre llaves, Bash la expande convirtindola en la cadena expandida con cada uno de los argumentos, por ejemplo: el comando
e c h oe s t e / d i r e c t o r i o / { a l g o , m u y , d e m a s i a d o } / l a r g o

dar como resultado la impresin a pantalla de:


e s t e / d i r e c t o r i o / a l g o / l a r g oe s t e / d i r e c t o r i o / m u y / l a r g oe s t e / d i r e c t o r i o / d e m a s i a d o / l a r g o

Hay que tener en cuenta que: 1. La expansin funciona sobre una sola palabra sin espacios si escribimos:
e c h oe s t o{ e s , p a r e c e }d i f c i l e s c r i b i r : e s t oe sp a r e c ed i f c i l

1. La expansin no se realiza entre comillas simples ni dobles por lo que no sirve para corregir el ejemplo anterior:
e c h o" e s t o{ e s , p a r e c e }d i f c i l " d a r : e s t o { e s , p a r e c e }d i f c i l

1. Lo que debe hacerse es ignorar o escapar los espacios y escribir


e c h oe s t o \{ e s , p a r e c e } \c o n f u s o a s o b t e n d r e m o sl oq u eq u e r a m o s :
doc.ubuntu-es.org/Script 16/20

16/09/13

Script - doc.ubuntu-es

e s t oe sd i f c i le s t op a r e c ec o n f u s o .

Pueden ponerse mltiples expansiones en una sola lnea y se obtendrn todas las combinaciones posibles.

e c h o{ u n a , o t r a } \ c o m b i n a c i n \ {b a s t a n t e , m u y } \d i f c i l . R e s p o n d e u n ac o m b i n a c i nb a s t a n t ed i f c i l .o t r ac o m b i n a c i nb a s t a n t ed i f c i l .u n ac o m b i n a c i nm u yd i f c i l .o t r

Aritmtica de Bash
Se pueden ejecutar en Bash las principales acciones aritmticas entre las variables utilizando los signos: + suma resta * multiplicacin / divisin Las operaciones tienen su sintaxis que debe ser respetada para que Bash lo haga adecuadamente. 1. Pruebe esto en la shell o la lnea de comandos (consola).
e c h o1 + 1

La respuesta ser 1+1 porque bash lo interpreta como caracteres simples, para que realice la operacin de suma hay que escribir:
e c h o$ ( ( 1 + 1 ) ) o e c h o$ [ 1 + 1 ]

Bash no maneja nmeros fraccionarios solo nmeros enteros por lo tanto si usted escribe:
e c h o$ [ 3 / 4 ] l ar e s p u e s t as e r c e r o ,s i ne m b a r g os ie s c r i b e : e c h o$ [ 4 / 2 ] l ar e s p u e s t as e r c o r r e c t a2

1. Tambin podr utilizar a expr para las operaciones de la forma siguiente:

doc.ubuntu-es.org/Script

17/20

16/09/13

Script - doc.ubuntu-es

e x p ra r g u m e n t o 1s i g n oa r g u m e n t o 2

pruebe en la consola
e x p r2 + 2 l ar e s p u e s t as e r 4 o e x p r4/2 l ar e s p u e s t as e r 2

Cuando se use el signo * para la multiplicacin debe anteponerle una barra invertida para que Bash no lo interprete como un global, sera:
e x p r1 0\ *1 0 l ar e s p u e s t as e r 1 0 0

El programa expr da sus resultados directamente a la salida estndar pero tampoco maneja nmeros fraccionarios. Hay que observar siempre un espacio entre los argumentos. 1. Para operar con fraccionarios debe entubar la expresin al programa bc de la forma siguiente:
e c h oo p e r a c i n|b cl e c h o3 / 4|b cl p o re j e m p l o ;

El resultado ser 0.75 o


e c h o2 + 2 . 5|b cl

Devolver 4.5 En algunas distribuciones el programa bc no se instala por defecto. Hay otras expresiones que Bash interpreta aritmticamente;

-lt Menor que -le Menor o igual que -eq Igual que -ge Mayor o igual que -gt Mayor que -ne Distinto que

Lgica de Bash
doc.ubuntu-es.org/Script 18/20

16/09/13

Script - doc.ubuntu-es

Para la shell los caracteres que tienen un significado lgico en la comparacin o evaluacin de archivos son:

> <

Mayor que Menor que

>= Mayor o igual que <= Menor o igual que ! || Diferente que OR ()

&& AND (y)

# ! / b i n / b a s h A R C H I V O = $ 1 f i l eb" $ 1 "|g r e pi' J P E G '| |f i l eb" $ 1 "|g r e pi' G I F '| |f i l eb" $ 1 "|g r e pi' P N G '| |f i l e i f[$ ?e q0] ;t h e n e c h o" E su n ai m a g e n " e l s e" N oe su n ai m g e n " f i

En este guin hemos supuesto que un archivo cualquiera se convierte en la variable $1 y queremos averiguar si el archivo es una imagen en alguno de los formatos ms comunes, primero acudimos a file para que "lea" el texto que contiene el archivo y lo entubamos a grep, que buscar patrones de texto de lo que le entrega file. Como necesitamos averiguar si alguno de los patrones JPEG, GIF, PNG o BITMAP aparece dentro del archivo utilizamos varias instancias de file y grep separadas con OR (||), de esta forma le estamos diciendo en el comando "busca si aparece JPEG o GIF o PNG o BITMAP, si lo encuentras entonces imprime" "Es una imgen" de cualquier otra forma imprime "No es una imgen"

Consideraciones finales
No existe forma alguna de que se aprenda Bash que no sea usndolo, son tantas y tan variadas las herramientas a su disposicin, as como las vas para lograr un objetivo, que solo la experiencia puede ayudarle a aprenderlo. Al principio le parecer inalcanzable pero si persevera se dar cuenta de que es posible y hasta fcil, despus que uno le encuentra "las cosquillas", dir con orgullo "esto es pan comido" cuando quiera automatizar una tarea o si quiere hacer un "programita" para cumplir un objetivo. Haga lo mismo que yo, empec jugando y ya he aprendido algo. Le deseo suerte.

doc.ubuntu-es.org/Script

19/20

16/09/13

Script - doc.ubuntu-es

En la elaboracin de este manual se ha usado la siguiente Fuente. Por lo tanto se publica con la licencia GNU General Public License Obtenido de http://doc.ubuntu-es.org/index.php?title=Script&oldid=15346 Categoras: Programacin Bash script Terminal Bash

doc.ubuntu-es.org/Script

20/20