Está en la página 1de 27

SEMINARIO 06013 PROGRAMACIN AVANZADA EN SHELL (lnea de comandos)

Ramn M. Gmez Labrador (ramon.gomez@eii.us.es) Septiembre de 2.006

Nota importante: El presente seminario se oferta dentro del plan de formacin para personal informtico de la Universidad de Sevilla para el ao 2006 y toda su documentacin asociada est bajo licencia Creative Commons con reconocimiento (http://creativecommons.org/licenses/by/2.5/deed.es). 1 edicin: Curso 03-55 Programacin Avanzada en Shell, octubre 2.003. 2 edicin: Curso 05-08 Programacin Avanzada en Shell, abril 2.005. Esta 3 edicin divide el curso en 2 seminarios: 1. Seminario 06013 Programacin Avanzada en Shell (lnea de comandos), septiembre 2.006. 2. Seminario 06053 Programacin Avanzada en Shell (shellscripts), septiembre 2.006.

06013 Programacin Avanzada en Shell (lnea de comandos)

NDICE
1. Introduccin.................................................................................4 1.1. Caractersticas principales de BASH................................................4 1.2. Cundo utilizar el intrprete de mandatos.......................................5 2. Redirecciones...............................................................................6 2.1. Redireccin de entrada.....................................................................6 2.2. Redirecciones de salida.....................................................................7 2.3. Combinacin de redirecciones..........................................................7 2.4. Redireccin de entrada/salida...........................................................8 2.5. Documento interno............................................................................9 2.6. Tuberas...........................................................................................10 3. Variables....................................................................................12 3.1. Tipos de variables...........................................................................12 3.1.1. Variables locales.......................................................................12 3.1.2. Variables de entorno.................................................................13 3.1.3. Parmetros de posicin.............................................................15 3.1.4. Variables especiales..................................................................15 3.2. Matrices..........................................................................................17 3.3. Configuracin del entorno...............................................................17 4. Expresiones................................................................................19 4.1. Expresiones aritmticas..................................................................20 4.2. Expresiones condicionales..............................................................22 4.2.1. Expresiones de ficheros............................................................22 4.3.2. Expresiones comparativas numricas.......................................24 4.3.3. Expresiones comparativas de cadenas.....................................24 5. Entrecomillado...........................................................................26 6. Referencias................................................................................27

1. Introduccin.
El intrprete de mandatos o "shell" es la interfaz principal entre el usuario y el sistema, permitindole a aqul interactuar con los recursos de ste. El usuario introduce sus rdenes, el intrprete las procesa y genera la salida correspondiente. Por lo tanto, un intrprete de mandatos de Unix es tanto una interfaz de ejecucin de rdenes y utilidades, como un lenguaje de programacin, que admite crear nuevas rdenes denominadas guiones o shellscripts, utilizando combinaciones de mandatos y estructuras lgicas de control, que cuentan con caractersticas similares a las del sistema y que permiten que los usuarios y grupos de la mquina cuenten con un entorno personalizado [2]. En Unix existen 2 familias principales de intrpretes de mandatos: los basados en el intrprete de Bourne (BSH, KSH o BASH) y los basados en el intrprete C (CSH o TCSH). Los 2 seminarios de formacin sobre programacin en shell pretenden formar una gua para el usuario de Linux, que le permitir comprender, ejecutar y empezar a programar en la Shell, haciendo referencia especialmente a BASH (Bourne Again Shell) evolucin de BSH, con caractersticas de KSH y CSH, ya que es el intrprete de mandatos ms utilizado en Linux e incluye un completo lenguaje para programacin estructurada y gran variedad de funciones internas.

1.1. Caractersticas principales de BASH.


Los principales caractersticas del intrprete BASH [i] son: Ejecucin sncrona de rdenes (una tras otra) o asncrona (en paralelo). Distintos tipos de redirecciones de entradas y salidas para el control y filtrado de la informacin. Control del entorno de los procesos. Ejecucin de mandatos interactiva y desatendida, aceptando entradas desde teclado o desde ficheros.. Proporciona una serie de rdenes internas para la manipulacin directa del intrprete y su entrono de operacin. Un lenguaje de programacin de alto nivel, que incluye distinto tipos de variables, operadores, matrices, estructuras de control de flujo, entrecomillado, sustitucin de valores y funciones. Control de trabajos en primer y segundo plano. 4

Edicin del histrico de mandatos ejecutados. Posibilidad de usar una "shell" para el uso de un entorno controlado.

1.2. Cundo utilizar el intrprete de mandatos.


Como se ha indicado anteriormente, una shell de Unix puede utilizarse como interfaz para ejecutar rdenes en la lnea de comandos o como intrprete de un lenguaje de programacin para la administracin del sistema. El lenguaje de BASH incluye una sintaxis algo engorrosa, pero relativamente fcil de aprender, con una serie de rdenes internas que funcionan de forma similar a la lnea de comandos. Un programa o guin puede dividirse en secciones cortas, cmodas de depurar, permitiendo realizar prototipos de aplicaciones ms complejas. Sin embargo, hay ciertas tareas que deben ser resueltas con otros intrpretes ms complejos o con lenguajes compilados de alto nivel, tales como [4]: . Procesos a tiempo real, o donde la velocidad es un factor fundamental. Operaciones matemticas de alta precisin, de lgica difusa o de nmeros complejos. Portabilidad de cdigo entre distintas plataformas. Aplicaciones complejas que necesiten programacin estructurada o proceso multihilvanado. Aplicaciones crticas para el funcionamiento del sistema. Situaciones donde debe garantizarse la seguridad e integridad del sistema, para protegerlo contra intrusin o vandalismo. Proyectos bloqueos. formados por componentes con dependencias de

Proceso intensivo de ficheros, que requieran accesos directos o indexados. Uso de matrices multidimensionales o estructuras de datos (listas, colas, pilas, etc.). Proceso de grficos. Manipulacin de dispositivos, puertos o sockets. Uso de bibliotecas de programacin o de cdigo propietario

2. Redirecciones.
Unix hereda 3 ficheros especiales del lenguaje de programacin C, que representan las funciones de entrada y salida de cada programa. stos son: Entrada estndar: procede del teclado; abre el fichero descriptor 0 (stdin) para lectura. Salida estndar: se dirige a la pantalla; abre el fichero descriptor 1 (stdout) para escritura. Salida de error: se dirige a la pantalla; abre el fichero descriptor 2 (stderr) para escritura y control de mensajes de error.

El proceso de redireccin permite hacer una copia de uno de estos ficheros especiales hacia o desde otro fichero normal. Tambin pueden asignarse los descriptores de ficheros del 3 al 9 para abrir otros tantos archivos, tanto de entrada como de salida. El fichero especial /dev/null sirve para descartar alguna redireccin e ignorar sus datos.

2.1. Redireccin de entrada.


La redireccin de entrada sirve para abrir para lectura el archivo especificado usando un determinado nmero descriptor de fichero. Se usa la entrada estndar cuando el valor del descriptor es 0 o ste no se especifica. El siguiente cuadro muestra el formato genrico de la redireccin de entrada.
[N]<Fichero

La redireccin de entrada se usa para indicar un fichero que contiene los datos que sern procesados por el programa, en vez de teclearlos directamente por teclado. Por ejemplo:
miproceso.sh < fichdatos

Sin embargo, conviene recordar que la mayora de las utilidades y filtros de Unix soportan los ficheros de entrada como parmetro del programa y no es necesario redirigirlos.

2.2. Redirecciones de salida.


De igual forma a los descrito en el apartado anterior, la redireccin de salida se utiliza para abrir un fichero asociado a un determinado nmero de descriptor para operaciones de escritura. Se reservan 2 ficheros especiales para el control de salida de un programa: la salida normal (con nmero de descriptor 1) y la salida de error (con el descriptor 2). En la siguiente tabla se muestran los formatos genricos para las redirecciones de salida. Redireccin
[N]> Fichero

Descripcin Abre el fichero de descriptor N para escritura. Por defecto se usa la salida estndar (N=1). Si el fichero existe, se borra; en caso contrario, se crea. Como en el caso anterior, pero el fichero debe existir previamente. Como en el primer caso, pero se abre el fichero para aadir datos al final, sin borrar su contenido. Escribe las salida normal y de error en el mismo fichero.

[N]>| Fichero

[N]>> Fichero

&> Fichero

El siguiente ejemplo crea un fichero con las salidas generadas para configurar, compilar e instalar una aplicacin GNU.
configure > aplic.sal make >> aplic.sal make install >> aplic.sal

2.3. Combinacin de redirecciones.


Pueden combinarse ms de una redireccin sobre el mismo mandato o grupo de mandatos, interpretndose siempre de izquierda a derecha. Ejercicio 2.1: interpretar las siguientes rdenes:
ls al /usr /tmp /noexiste >ls.sal 2>ls.err find /tmp print >find.sal 2>/dev/null

Otras formas de combinar las redirecciones permiten realizar copias de descriptores de ficheros de entrada o de salida. La siguiente tabla muestra los formatos para duplicar descriptores.

Redireccin
[N]<&M

Descripcin Duplicar descriptor de entrada M en N (N=0, por defecto). Cerrar descriptor de entrada N. Mover descriptor de entrada M en N, cerrando M (N=0, por defecto). Duplicar descriptor de salida M en N (N=1, por defecto). Cerrar descriptor de salida N. Mover descriptor de salida M en N, cerrando M (N=1, por defecto).

[N]<&[N]<&M-

[N]>&M [N]>&[N]>&M-

Conviene hacer notar, que siguiendo las normas anteriores las 2 lneas siguientes son equivalentes y ambas sirven para almacenar las salidas normal y de error en el fichero indicado:
ls al /var/* &>ls.txt ls al /var/* >ls.txt 2>&1

Sin embargo, el siguiente ejemplo muestra 2 mandatos que no tienen por qu dar el mismo resultado, ya que las redirecciones se procesan de izquierda a derecha, teniendo en cuenta los posibles duplicados de descriptores hechos en lneas anteriores.
ls al * >ls.txt 2>&1 ls al * 2>&1 >ls.txt # # # # Salida normal y de error a "ls.txt". Asigna la de error a la normal anterior (puede haberse redirigido) y luego manda la estndar a "ls.txt".

2.4. Redireccin de entrada/salida.


La redireccin de entrada y salida abre el fichero especificada para operaciones de lectura y escritura y le asigna el descriptor indicado (0 por defecto). Se utiliza en operaciones para modificacin y actualizacin de datos. El formato genrico es:
[N]<>Fichero

El siguiente ejemplo muestra una simple operacin de actualizacin de datos en un determinado lugar del fichero [4].

echo 1234567890 > fich exec 3<> fich read -n 4 <&3 echo -n , >&3 exec 3>&cat fich

# # # # # #

Genera el contenido de "fich" Abrir fich con descriptor 3 en E/S Leer 4 caracteres Escribir coma decimal Cerrar descriptor 3 1234,67890

2.5. Documento interno.


La redireccin de documento interno usa parte del propio programa hasta encontrar un delimitador de final como redireccin de entrada al comando correspondiente. Suele utilizarse para mostrar o almacenar texto fijo, como por ejemplo un mensaje de ayuda. El texto del bloque que se utiliza como entrada se trata de forma literal, esto es, no se realizan sustituciones ni expansiones. El texto interno suele ir tabulado para obtener una lectura ms comprensible. El formato << mantiene el formato original, pero en el caso de usar el smbolo <<-, el intrprete elimina los caracteres de tabulacin antes de redirigir el texto. La siguiente tabla muestra el formato de la redireccin de documento interno. Redireccin
<<[-] Delimitador Texto ... Delimitador

Descripcin Se usa el propio shellscript como entrada estndar, hasta la lnea donde se encuentra el delimitador. Los tabuladores se eliminan de la entrada en el caso de usar la redireccin <<- y se mantienen con <<.

Como ejemplo se muestra un trozo de cdigo y su salida correspondiente, que presentan el texto explicativo para el formato de uso de un programa.
echo << FIN Formato: config OPCION ... OPCIONES: --cflags --ldflags --libs --version --help FIN Formato: config OPCION ... OPCIONES: --cflags --ldflags --libs --version --help

2.6. Tuberas.
La tubera es una herramienta que permite utilizar la salida normal de un programa como entrada de otro, por lo que suele usarse en el filtrado y depuracin de la informacin, siendo una de las herramientas ms potentes de la programacin con intrpretes Unix. Pueden combinarse ms de una tubera en la misma lnea de rdenes, usando el siguiente formato:
Mandato1 | Mandato2 ...

Todos los dialectos Unix incluyen gran variedad de filtros de informacin. La siguiente tabla recuerda algunos de los ms utilizados. Mandato
head tail grep

Descripcin Corta las primeras lneas de un fichero. Extrae las ltimas lneas de un fichero. Muestra las lneas que contienen una determinada cadena de caracteres o cumplen un cierto patrn. Corta columnas agrupadas por campos o caracteres. Muestra o quita las lneas repetidas. Lista el contenido numricamente. del fichero ordenado alfabtica o

cut uniq sort

wc find

Cuenta lneas, palabras y caracteres de ficheros. Busca ficheros que cumplan ciertas condiciones y posibilita ejecutar operaciones con los archivos localizados Edita automticamente un fichero. Muestra las diferencias entre 2 ficheros en un formato compatible con la orden sed. Compara 2 ficheros. Sustituye grupos de caracteres uno a uno. Procesa el fichero de entrada segn las reglas de dicho lenguaje.

sed diff

comm tr awk

El siguiente ejemplo muestra una orden compuesta que ordena todos los ficheros con extensin ".txt", elimina las lneas duplicadas y guarda los datos en el fichero "resultado.sal". 10

cat *.txt | sort | uniq >resultado.sal

La orden tee es un filtro especial que recoge datos de la entrada estndar y lo redirige a la salida normal y a un fichero especificado, tanto en operaciones de escritura como de aadidura. Esta es una orden muy til que suele usarse en procesos largos para observar y registrar la evolucin de los resultados. El siguiente ejemplo muestra y registra el proceso de compilacin e instalacin de una aplicacin GNU.
configure 2>&1 | tee aplic.sal make 2>&1 | tee a aplic.sal make instal 2>&1 | tee a aplic.sal

Ejercicio 2.2: interpretar la siguiente orden:


ls | tee salida | sort -r

11

3. Variables.
Al contrario que en otros lenguajes de programacin, BASH no hace distincin en los tipos de datos de las variables; son esencialmente cadenas de caracteres, aunque segn el contexto tambin pueden usarse con operadores de nmeros enteros y condicionales. Esta filosofa de trabajo permite una mayor flexibilidad en la programacin de guiones, pero tambin puede provocar errores difciles de depurar [4]. Una variable BASH se define o actualiza mediante operaciones de asignacin, mientras que se hace referencia a su valor utilizando el smbolo del dlar delante de su nombre. Suele usarse la convencin de definir las variables en maysculas para distinguirlas fcilmente de los mandatos y funciones, ya que en Unix las maysculas y minsculas se consideran caracteres distintos.
VAR1="Esto es una prueba VAR2=35 echo $VAR1 echo "VAR2=$VAR2" # # # # asignacin de una variable asignar valor numrico Esto es una prueba VAR2=35

3.1. Tipos de variables.


Las variables del intrprete BASH pueden considerarse desde los siguientes puntos de vista: Las variables locales son definidas por el usuario y se utilizan nicamente dentro de un bloque de cdigo, de una funcin determinada o de un guin. Las variables de entorno son las que afectan al comportamiento del intrprete y al de la interfaz del usuario. Los parmetros de posicin son los recibidos en la ejecucin de cualquier programa o funcin, y hacen referencia a su orden ocupado en la lnea de mandatos. Las variables especiales son aquellas que tienen una sintaxis especial y que hacen referencia a valores internos del proceso. Los parmetros de posicin pueden incluirse en esta categora.

3.1.1. Variables locales.


Las variables locales son definidas para operar en un mbito reducido de trabajo, ya sea en un programa, en una funcin o en un bloque de cdigo. Fuera de dicho mbito de operacin, la variable no tiene un valor preciso. 12

Una variable tiene un nombre nico en su entorno de operacin, sin embargo pueden aunque no es nada recomendable usarse variables con el mismo nombre en distintos bloques de cdigo. El siguiente ejemplo muestra los problemas de comprensin y depuracin de cdigo que pueden desatarse en caso de usar variables con el mismo nombre. En la primera fila se presentan 2 programas que usan la misma variable y en la segunda, la ejecucin de los programas (ntese que el signo > es el punto indicativo del interfaz de la shell y que lo tecleado por el usuario se representa en letra negrita).
#!/bin/bash # prog1 variables prueba 1 VAR1=prueba echo $VAR1 > echo $VAR1 > prog1 prueba > prog2 otra prueba > prog1 prueba #!/bin/bash # prog2 variables prueba 2 VAR1="otra prueba" echo $VAR1

Por lo tanto, para asignar valores a una variable se utiliza simplemente su nombre, pero para hacer referencia a su valor hay que utilizar el smbolo dlar ($). El siguiente ejemplo muestra los modos de referirse a una variable.
ERR=2 echo ERR echo $ERR echo ${ERR} echo "Error ${ERR}: salir" # # # # # Asigna 2 ERR 2 2 Error a la variable ERR. (cadena "ERR"). (valor de ERR). (es equivalente). 2: salir

El formato ${Variable} se utiliza en cadenas de caracteres donde se puede prestar a confusin o en procesos de sustitucin de valores.

3.1.2. Variables de entorno.


Al igual que cualquier otro proceso Unix, la shell mantiene un conjunto de variables que informan sobre su propio contexto de operacin. El usuario o un shellscript puede actualizar y aadir variables exportando sus valores al entorno del intrprete (mandato export), lo que afectar tambin a todos los procesos hijos generados por ella. El administrador puede definir variables de entorno estticas para los usuarios del sistema (como, por ejemplo, en el caso de la variable IFS). La siguiente tabla presenta las principales variables de entorno.

13

Variable de entorno
SHELL

Descripcin Camino del mandatos. programa intrprete

Valor por omisin de La propia shell. Lo modifica la sheil. Lo modifica la sheil. Lo modifica la shell

PWD

Directorio de trabajo actual. Directorio de trabajo anterior (equivale a ~-). Identificador del proceso padre (PPID).

OLDPWD

PPID

IFS

Separador de campos de entrada (debe ser ESP, TAB, NL. de slo lectura). Directorio personal de la cuenta. Nombre de usuario que ejecuta la shell. Camino de bsqueda de mandatos. Idioma para los mensajes. Editor usado por defecto. Tipo de terminal. Puntos indicativos primario, selectivo y de errores. secundario, Lo define root. Activado
login

HOME LOGNAME

por el

PATH

Segn sistema

LANG EDITOR TERM PS1 ... PS4

FUNCNAME

Nombre de la funcin que se est ejecutando. Lo modifica la shell. N de lnea actual del guin (para depuracin Lo modifica la de cdigo) shell.

LINENO

Debe hacerse una mencin especial a la variable PATH, que se encarga de guardar la lista de directorios con ficheros ejecutables. Si no se especifica el camino exacto de un programa, el sistema busca en los directorios especificados por PATH, siguiendo el orden de izquierda a derecha. El carcter separador de directorios es dos puntos. El administrador del sistema debe establecer los caminos por defecto para todos los usuarios del sistema y cada uno de stos puede personalizar su propio entorno, aadiendo sus propios caminos de bsqueda (si no usa un intrprete restringido).

14

Ejercicio 3.1: interpretar la siguiente orden:


PATH=$PATH:/home/grupo/bin:/opt/oracle/bin

Recomendaciones de seguridad: Siempre deben indicarse caminos absolutos en la definicin de la variable PATH y, sobre todo, nunca incluir el directorio actual (.), ni el directorio padre (..). Declarar la variable IFS de slo lectura, para evitar intrusiones del tipo caballos de Troya.

3.1.3. Parmetros de posicin.


Los parmetros de posicin son variables especiales de BASH que contienen los valores de los parmetros que recibe un programa o una funcin. El nmero indica la posicin de dicho parmetro en la llamada al cdigo. El 1er parmetro se denota por la variable $1, el 9 por $9 y a partir del 10 hay que usar la notacin ${Nmero}. El mandato interno shift desplaza la lista de parmetros hacia la izquierda para procesar los parmetros ms cmodamente. El nombre del programa se denota por la variable $0. Observar el siguiente cuadro para observar el uso de parmetros posicionales y de variables locales, donde se muestran algunas lneas de un programa para gestin de usuarios.
grep "^$1:" /etc/passwd grep ":$GID:" /etc/group | cut -f1 -d:

1. Imprime la lnea del fichero de usuarios para el especificado en el 1er parmetro recibido por el programa. 2. Presenta el nombre del grupo cuyo identificador se encuentra en la variable GID.

3.1.4. Variables especiales.


Las variables especiales informan sobre el estado del proceso, son tratadas y modificadas directamente por el intrprete, por lo tanto, son de slo lectura. La siguiente tabla describe brevemente estas variables.

15

Variable especial
$$ $*

Descripcin Identificador del proceso (PID). Cadena con el contenido completo de los parmetros recibidos por el programa. Como en el caso anterior, pero trata cada parmetro como un palabra diferente. Nmero de parmetros. Cdigo de retorno del ltimo mandato (0=normal, >0=error). ltimo identificador de proceso ejecutado en segundo plano. Valor del ltimo previamente. argumento del comando ejecutado

$@

$# $? $! $_

La construccin cat "$@" se utiliza para procesar datos tanto de ficheros como de la entrada estndar [4]. La 1 fila de la tabla del siguiente ejemplo muestra el cdigo de un programa para convertir minsculas en maysculas; mientras que la 2, indica cmo puede utilizarse el programa (el texto tecleado est representado en letra negrita). Nota: la construccin ^D representa la combinacin de teclas Control-D (carcter fin de texto).
#!/bin/bash # mayusculas convierte a maysculas usando ficheros o stdin # Uso: mayusculas [ [<]fichero ] cat "$@" | tr 'a-z' 'A-Z' > mayusculas datos.txt >datos.sal > mayusculas <datos.txt >datos.sal > mayusculas Esto es una prueba de ejecucin del programa. ^D ESTO ES UNA PRUEBA DE EJECUCIN DEL PROGRAMA.

Un uso comn de la variable $$ es el de asignar nombres para ficheros temporales que permiten el uso concurrente del programa, ya que al estar asociada al PID del proceso, ste valor no se repetir nunca al ejecutar simultneamente varias instancias del mismo programa. Ejercicio 3.2: interpretar los siguientes mandatos:
echo $0; shift; echo $0

16

3.2. Matrices.
Una matriz (o array) es un conjunto de valores identificados por el mismo nombre de variable, donde cada una de sus celdas cuenta con un ndice que la identifica. Las matrices deben declararse mediante la clusula interna declare, antes de ser utilizadas. BASH soporta matrices de una nica dimensin conocidas tambin como vectores, con un nico ndice numrico, pero sin restricciones de tamao ni de orden numrico o continuidad. Los valores de las celdas pueden asignarse de manera individual o compuesta. Esta segunda frmula permite asignar un conjunto de valores a varias de las celdas del vector. Si no se indica el ndice en asignaciones compuestas, el valor para ste por defecto es 0 o sumando 1 al valor previamente usado. El uso de los caracteres especiales [@] o [*] como ndice de la matriz, supone referirse a todos los valores en su conjunto, con un significado similar al expresado en el apartado anterior. El siguiente ejemplo describe la utilizacin de matrices.
declare a NUMEROS NUMEROS=( cero uno dos tres ) echo ${NUMEROS[2]} NUMEROS[4]="cuatro" echo ${NUMEROS[4]} NUMEROS=( [6]=seis siete [9]=nueve ) # echo ${NUMEROS[7]} # Declarar la matriz. # Asignacin compuesta. # dos # Asignacin simple. # cuatro celdas 6, 7 y 9. # siete

Ejercicio 3.3: segn los datos de la matriz del ejemplo anterior, cul es la salida de la siguiente orden:
echo ${NUMEROS[*]}

3.3. Configuracin del entorno.


El intrprete de mandados de cada cuenta de usuario tiene un entorno de operacin propio, en el que se incluyen una serie de variables de configuracin. El administrador del sistema asignar unas variables para el entorno de ejecucin comunes a cada grupo de usuarios o a todos ellos; mientras que cada usuario puede personalizar algunas de estas caractersticas en su perfil de entrada, aadiendo o modificando las variables. Para crear el entorno global, el administrador crea un perfil de entrada comn para todos los usuarios (archivo /etc/bashrc en el caso de BASH),

17

donde entre otros cometidos se definen las variables del sistema y se ejecutan los ficheros de configuracin propios para cada aplicacin. Estos pequeos programas se sitan en el subdirectorio /etc/profile.d; debiendo existir ficheros propios de los intrpretes de mandatos basados en el de Bourne (BSH, BASH, PDKSH, etc.), con extensin .sh, y otros para los basados en el intrprete C (CSH, TCSH, etc.), con extensin .csh. El proceso de conexin del usuario se completa con la ejecucin del perfil de entrada personal del usuario (archivo ~/.bash_profile para BASH). Aunque el administrador debe suministrar un perfil vlido, el usuario puede retocarlo a su conveniencia. En el siguiente captulo se presentan las variables de entorno ms importantes usadas por BASH.

18

4. Expresiones.
El intrprete BASH permite utilizar una gran variedad de expresiones en el desarrollo de programas y en la lnea de mandatos. Las distintas expresiones soportadas por el intrprete pueden englobarse en las siguientes categoras: Expresiones aritmticas: las que dan como resultado un nmero entero o binario. Expresiones condicionales: utilizadas por mandatos internos de BASH para su evaluar indicando si sta es cierta o falsa. Expresiones de cadenas: aquellas que tratan caracteres (se tratarn a fondo en el Captulo 6). cadenas de

Las expresiones complejas cuentan con varios parmetros y operadores, se evalan de izquierda a derecha. Sin embargo, si una operacin est encerrada entre parntesis se considera de mayor prioridad y se ejecuta antes. La tabla lista los operadores utilizados en los distintos tipos de expresiones BASH. Operadores aritmticos: Operadores comparacin: Operadores lgicos: Operadores binarios: Operadores asignacin: de de
+ - * / % ++ --

== != < <= > >= -eq nt lt -le gt ge

! && || & | ^ << >> = *= /= %= += -= <<= >>= &= ^= |=

Operadores de tipos de ficheros: Operadores permisos: de

-e b c d f -h -L -p -S t

-r -w -x -g -u -k -O -G N

Operadores de fechas: Operadores cadenas: de

-nt ot et -z -n

19

4.1. Expresiones aritmticas.


Las expresiones aritmticas representan operaciones nmeros enteros o binarios (booleanos) evaluadas mediante el mandato interno let (no se permiten nmero reales ni complejos). La valoracin de expresiones aritmticas enteras sigue las reglas: Se realiza con nmeros enteros de longitud fija sin comprobacin de desbordamiento, esto es, ignorando los valores que sobrepasen el mximo permitido. La divisin por 0 genera un error que puede ser procesado. La prioridad y asociatividad de los operadores sigue las reglas del lenguaje C.

La siguiente tabla describe las operaciones aritmticas enteras y binarias agrupadas en orden de prioridad. Operacin
Var++ Var--

Descripcin Post-incremento de variable. Post-decremento de variable. Pre-incremento de variable. Pre-decremento de variable. Ms unario. Menos unario. Negacin lgica. Negacin binaria. Exponenciacin. Multiplicacin. Divisin. Resto. Suma.. Resta. Desplazamiento binario a la izquierda. Desplazamiento binario a la derecha.

Comentarios La variable se incrementa o decrementa en 1 despus de evaluarse su expresin. La variable se incrementa o decrementa en 1 antes de evaluarse su expresin. Signo positivo o negativo de la expresin (por defecto se considera positivo). Negacin de la expresin lgica o negacin bit a bit. E1 elevado a E2 (E1 E2). Operaciones de multiplicacin y divisin entre nmeros enteros. Suma y resta de enteros.

++Var --Var

+Expr -Expr

! Expr ~ Expr E1 ** E2

E1 * E2 E1 / E2 E1 % E2

E1 + E2 E1 - E2

Expr << N Expr> > N

Desplazamiento de los bits un nmero indicado de veces.

20

E1 < E2 E1 <= E2 E1 > E2 E1 >= E2 E1 = E2 E1 != E2 E1 & E2 E1 ^ E2 E1 | E2 E1 && E2 E1 || E2 E1 ? E2 : E3

Comparaciones (menor, menor o igual, mayor, mayor o igual). Igualdad. Desigualdad. Operacin binaria Y. Operacin binaria O Exclusivo. Operacin binaria O. Operacin lgica Y. Operacin lgica O. Evaluacin lgica. Asignacin normal y con preoperacin (operadores vlidos: *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=). Operaciones independientes. Si E1=cierto, se devuelve E2; si no, E3. Asigna el valor de E2 a E1. Si es indica un operador, primero se realiza la operacin entre las 2 expresiones y se asigna el resultado (E1 = E1 Op E2). Se ejecutan en orden.

E1 = E2 E1 Op= E2

E1, E2

El cuadro que se muestra a continuacin ilustra el uso de las expresiones aritmticas.


let a=5 # Asignacin a=5. let b=$a+3*9 # b=a+(3*9)=32. echo "a=$a, b=$b" # a=5, b=32 let c=$b/($a+3) # c=b/(a+3)=4. let a+=c-# a=a+c=9, c=c-1=3. echo "a=$a, c=$c" # a=9, c=3 let CTE=$b/$c, RESTO=$b%$c # CTE=b/c, RESTO=resto(b/c). echo "Cociente=$CTE, Resto=$RESTO" # Cociente=10, Resto=2

Los nmeros enteros pueden expresarse en bases numricas distintas a la decimal (base por defecto). El siguiente ejemplo muestra los formatos de cambio de base.
let let let let N=59 N=034 N=0x34AF N=[20#]G4H2 # # # # Base Base Base Base decimal (0-9). octal (0-7), empieza por 0. hexadecimal (0-9A-F), empieza por 0x. 20 (especificada entre 2 y 64).

Ejercicio 4.1: explicar la siguiente expresin.


let a=(b>c)?b:c

21

4.2. Expresiones condicionales.


Las expresiones condicionales son evaluadas por los mandatos internos del tipo test, dando como resultado un valor de cierto o de falso. Suelen emplearse en operaciones condicionales y bucles, aunque tambin pueden ser empleadas en rdenes compuestas. Existen varios tipos de expresiones condicionales segn el tipo de parmetros utilizado o su modo de operacin: Expresiones con ficheros, que comparan la existencia , el tipo, los permisos o la fecha de ficheros o directorios. Expresiones comparativas numricas, que evalan la relacin de orden numrico entre los parmetros. Expresiones comparativas de cadenas, que relacin de orden alfabtico entre los parmetros. establecen la

Todas las expresiones condicionales pueden usar el modificador de negacin (! Expr) para indicar la operacin inversa. Asimismo, pueden combinarse varias de ellas en una expresin compleja usando los operadores lgicos Y (Expr1 && Expr2) y O (Expr1 || Expr2).

4.2.1. Expresiones de ficheros.


Son expresiones condicionales que devuelven el valor de cierto si se cumple la condicin especificada; en caso contrario da un valor de falso. Hay una gran variedad de expresiones relacionadas con ficheros y pueden agruparse en operaciones de tipos, de permisos y de comparacin de fechas. Conviene recordar que todo en Unix es un fichero, por eso hay bastantes operadores de tipos de ficheros. La siguiente tabla lista los formatos de estas expresiones. Formato
-e Fich -s Fich -f Fich -d Fich -b Fich -c Fich -p Fich

Condicin (cierto si...) El fichero (de cualquier tipo) existe El fichero no est vaco. Es un fichero normal. Es un directorio. Es un dispositivo de bloques. Es un dispositivo de caracteres. Es una tubera. 22

-h Fich -L Fich -S Fich -t Desc F1 -ef F2

Es un enlace simblico. Es una socket de comunicaciones. El descriptor est asociado a una terminal. Los 2 ficheros son enlaces hacia el mismo archivo.

Las condiciones sobre permisos establecen si el usuario que realiza la comprobacin puede ejecutar o no la operacin deseada sobre un determinado fichero. La tabla describe estas condiciones. Formato
-r Fich -w Fich -x Fich -u Fich -g Fich -t Fich -O Fich -G Fich

Condicin (cierto si...) Tiene permiso de lectura. Tiene permiso de escritura (modificacin). Tiene permiso de ejecucin/acceso. Tiene el permiso SUID. Tiene el permiso SGID. Tiene permiso de directorio compartido o fichero en cach. Es el propietario del archivo. El usuario pertenece al grupo con el GID del fichero.

Las operaciones sobre fechas descritas en la siguiente tabla establecen comparaciones entre las correspondientes a 2 ficheros. Formato
-N Fich F1 -nt F2 F1 -ot F2

Condicin (cierto si...) El fichero ha sido modificado desde al ltima lectura. El fichero F1 es ms nuevo que el F2. El fichero F1 es ms antiguo que el F2. extrados del fichero de configuracin

Vanse

ejemplos /etc/rc.d/rc.sysinit .

23

# Si if [ ... # Si # if [ ...

/proa/mdstat y /etc/raidtab son ficheros; entonces ... -f /proc/mdstat -a -f /etc/raidtab ]; then el camino representado por el contenido de la variable $afile es un directorio; entonces ... -d "$afile" ]; then

Ejercicio 4.2: interpretar la siguiente expresin.


if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ];

4.3.2. Expresiones comparativas numricas.


Aunque los operadores de comparacin para nmeros ya se han comentado en el apartado anterior, la siguiente tabla describe los formatos para este tipo de expresiones. Formato
N1 -eq N2 N1 -ne N2 N1 -lt N2 N1 -gt N2

Condicin (cierto si...) Se cumple la condicin de comparacin numrica (respectivamente igual, distinto, menor y mayor).

Continuando

con

el

ejemplo,

se

comentan

unas

lneas

de

/etc/rc.d/rc.sysinit .
# Si la variable RESULT es > 0 y # /sbin/raidstart es ejecutable; entonces ... if [ $RESULT -gt 0 -a -x /sbin/raidstart ]; then ... # Si el cdigo de la ejecucin del 1er mandato es 0 y # el del 2 es distinto de 0; entonces ... if grep -q /initrd /proc/mounts && \ ! grep -q /initrd/loopfs /proc/mounts ; then ... # Si la expresin de que existe el fichero /fastboot es cierta o # el cdigo de salida del mandato es correcto; entonces ... if [ -f /fastboot ] || \ grep -iq "fastboot" /proc/cmdline 2>/dev/null ; then ...

4.3.3. Expresiones comparativas de cadenas.


De forma similar, tambin pueden realizarse comparaciones entre cadenas de caracteres. Conviene destacar que es recomendable usar comillas dobles para delimitar las cadenas a comparar. La tabla siguiente indica el formato para este tipo de expresiones.

24

Formato
Cad1 = Cad2 Cad1 != Cad2 [-n] Cad -z Cad

Condicin (cierto si...) Se cumple la condicin de comparacin de cadenas (respectivamente igual y distinto). La cadena no est vaco (su longitud no es 0). La longitud de la cadena es 0.

Como en los prrafos previos, se revisa parte del cdigo del fichero /etc/rc.d/rc.sysinit .
# Si # if [ ... # Si # if [ ... LOGNAME es una variable vaca o tiene el valor "(none)"; entonces ... -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then la variable $fastboot no tiene contenido y la variable $ROOTFSTYPE no es "nfs"; entonces ... -z "$fastboot" -a "$ROOTFSTYPE" != "nfs" ]; then

Ejercicio 4.3: interpretar la siguiente orden.


if [ -n "$PNP" -a -f /proc/isapnp -a -x /sbin/sndconfig ]; then

25

5. Entrecomillado.

Cada uno de los caracteres especiales metacaracteres usados en BASH tienen un comportamiento especial, segn la sintaxis del lenguaje. El entrecomillado es el procedimiento utilizado para modificar o eliminar el uso normal de dicho metacaracteres. Obsrvese el siguiente ejemplo.
# El ; se usa normalmente para separar comandos. echo Hola; echo que tal # Hola # que tal # Usando entrecomillado pierde su funcin normal. echo "Hola; echo que tal" # Hola; echo que tal

Los 3 tipos bsicos de entrecomillado definidos en BASH son

[2]

Carcter de escape (\Carcter): mantiene el valor literal del carcter que lo precede; la secuencia \\ equivale a presentar el carcter \. Cuando aparece como ltimo carcter de la lnea, sirve para continuar la ejecucin de una orden en la lnea siguiente. Comillas simples ('Cadena'): siempre conserva el valor literal de cada uno de los caracteres de la cadena. Comillas dobles ("Cadena"): conserva el valor de literal de la cadena, excepto para los caracteres dlar ($), comilla simple (') y de escape (\$, \\, \', \", ante el fin de lnea y secuencia de escape del tipo ANSI-C).

El entrecomillado con formato $"Cadena" se utiliza para procesos de traduccin segn el idioma expresado por la variable LANG. Si se utiliza el valor de idioma por defecto (C o POSIX), la cadena se trata normalmente con comillas dobles. Veamos unos ejemplos:
echo "Slo con permiso \"root\"" # Slo con permiso "root" echo 'Slo con permiso \"root\"' # Slo con permiso \"root\"

Ejecrcicia 5.1: indicar la salida del siguiente mandato.


echo "Ejecutar 'smbmount \\\\servidor\\documentos \$HOME/doc'"

26

6. Referencias.
1. B. Fox, C. Ramey: BASH(1) (pginas de manuales de BASH v2.5b). 2.002. 2. C. Ramey, B. Fox: Bash Reference Manual, v2.5b. Free Software Foundation, 2.002. 3. Mike G, trad. G. Rodrguez Alborich: Programacin en BASH COMO de Introduccin. 2.000. 4. M. Cooper: Advanced Bash-Scripting Guide, v2.1. Linux Documentation Project, 2.003. 5. R. M. Gmez Labrador: Administracin Avanzada de Sistemas Linux (3 edicin). Secretariado de Formacin del PAS (Universidad de Sevilla), 2.004. i. Proyecto GNU.: http://www.gnu.org/ ii. The Linux Documentation Project (TLDP): http://www.tldp.org/ iii. Proyecto HispaLinux (LDP-ES): http://www.hispalinux.es/

27

También podría gustarte