Bash Comandos

download Bash Comandos

of 27

Transcript of Bash Comandos

  • 8/7/2019 Bash Comandos

    1/27

    SEMINARIO 06013

    PROGRAMACIN AVANZADA EN

    SHELL (lnea de comandos)

    Ramn M. Gmez Labrador

    ([email protected])

    Septiembre de 2.006

    mailto:[email protected]:[email protected]
  • 8/7/2019 Bash Comandos

    2/27

    Nota importante: El presente seminario se oferta dentro del plan deformacin para personal informtico de la Universidad de Sevilla para elao 2006 y toda su documentacin asociada est bajo licencia CreativeCommons 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 decomandos), septiembre 2.006.

    2. Seminario 06053 Programacin Avanzada en Shell(shellscripts),septiembre 2.006.

    2

    http://creativecommons.org/licenses/by/2.5/eshttp://creativecommons.org/licenses/by/2.5/es
  • 8/7/2019 Bash Comandos

    3/27

    06013 Programacin Avanzada en Shell(lnea de comandos)

    NDICE

    1. Introduccin.................................................................................41.1. Caractersticas principales de BASH................................................41.2. Cundo utilizar el intrprete de mandatos.......................................5

    2. Redirecciones...............................................................................62.1. Redireccin de entrada.....................................................................62.2. Redirecciones de salida.....................................................................7

    2.3. Combinacin de redirecciones..........................................................72.4. Redireccin de entrada/salida...........................................................82.5. Documento interno............................................................................92.6. Tuberas...........................................................................................10

    3. Variables....................................................................................123.1. Tipos de variables...........................................................................12

    3.1.1. Variables locales.......................................................................123.1.2. Variables de entorno.................................................................133.1.3. Parmetros de posicin.............................................................153.1.4. Variables especiales..................................................................15

    3.2. Matrices..........................................................................................17

    3.3. Configuracin del entorno...............................................................174. Expresiones................................................................................19

    4.1. Expresiones aritmticas..................................................................204.2. Expresiones condicionales..............................................................22

    4.2.1. Expresiones de ficheros............................................................224.3.2. Expresiones comparativas numricas.......................................244.3.3. Expresiones comparativas de cadenas.....................................24

    5. Entrecomillado...........................................................................266. Referencias................................................................................27

    3

  • 8/7/2019 Bash Comandos

    4/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 recursosde ste. El usuario introduce sus rdenes, el intrprete las procesa ygenera la salida correspondiente.

    Por lo tanto, un intrprete de mandatos de Unix es tanto una interfaz deejecucin de rdenes y utilidades, como un lenguaje de programacin,que admite crear nuevas rdenes denominadas guiones oshellscripts, utilizando combinaciones de mandatos y estructuraslgicas de control, que cuentan con caractersticas similares a las delsistema y que permiten que los usuarios y grupos de la mquina cuentencon un entorno personalizado [2].

    En Unix existen 2 familias principales de intrpretes de mandatos: losbasados en el intrprete de Bourne (BSH, KSH o BASH) y los basados enel intrprete C (CSH o TCSH).

    Los 2 seminarios de formacin sobre programacin en shell pretendenformar una gua para el usuario de Linux, que le permitir comprender,ejecutar y empezar a programar en la Shell, haciendo referenciaespecialmente a BASH (Bourne Again Shell) evolucin de BSH, concaractersticas de KSH y CSH, ya que es el intrprete de mandatos msutilizado en Linux e incluye un completo lenguaje para programacinestructurada 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 (enparalelo).

    Distintos tipos de redirecciones de entradas y salidas para elcontrol y filtrado de la informacin.

    Control del entorno de los procesos.

    Ejecucin de mandatos interactiva y desatendida, aceptandoentradas desde teclado o desde ficheros..

    Proporciona una serie de rdenes internas para la manipulacindirecta del intrprete y su entrono de operacin.

    Un lenguaje de programacin de alto nivel, que incluye distintotipos de variables, operadores, matrices, estructuras de control de

    flujo, entrecomillado, sustitucin de valores y funciones. Control de trabajos en primer y segundo plano.

    4

  • 8/7/2019 Bash Comandos

    5/27

    Edicin del histrico de mandatos ejecutados.

    Posibilidad de usar una "shell" para el uso de un entornocontrolado.

    1.2. Cundo utilizar el intrprete de mandatos.

    Como se ha indicado anteriormente, una shell de Unix puede utilizarsecomo interfaz para ejecutar rdenes en la lnea de comandos o comointrprete de un lenguaje de programacin para la administracin delsistema.

    El lenguaje de BASH incluye una sintaxis algo engorrosa, pero

    relativamente fcil de aprender, con una serie de rdenes internas quefuncionan de forma similar a la lnea de comandos. Un programa o guinpuede dividirse en secciones cortas, cmodas de depurar, permitiendorealizar prototipos de aplicaciones ms complejas.

    Sin embargo, hay ciertas tareas que deben ser resueltas con otrosintrpretes ms complejos o con lenguajes compilados de alto nivel, talescomo [4]:

    Procesos a tiempo real, o donde la velocidad es un factorfundamental.

    Operaciones matemticas de alta precisin, de lgica difusa o denmeros complejos.

    Portabilidad de cdigo entre distintas plataformas.

    Aplicaciones complejas que necesiten programacin estructurada oproceso multihilvanado.

    Aplicaciones crticas para el funcionamiento del sistema.

    Situaciones donde debe garantizarse la seguridad e integridad delsistema, para protegerlo contra intrusin o vandalismo.

    Proyectos formados por componentes con dependencias de

    bloqueos. 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

    .

    5

  • 8/7/2019 Bash Comandos

    6/27

    2. Redirecciones.

    Unix hereda 3 ficheros especiales del lenguaje de programacin C, que

    representan las funciones de entrada y salida de cada programa. stosson:

    Entrada estndar: procede del teclado; abre el fichero descriptor0 (stdin) para lectura.

    Salida estndar: se dirige a la pantalla; abre el fichero descriptor1 (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 puedenasignarse los descriptores de ficheros del 3 al 9 para abrir otros tantosarchivos, tanto de entrada como de salida.

    El fichero especial /dev/null sirve para descartar alguna redireccin eignorar sus datos.

    2.1. Redireccin de entrada.

    La redireccin de entrada sirve para abrir para lectura el archivoespecificado usando un determinado nmero descriptor de fichero. Seusa la entrada estndar cuando el valor del descriptor es 0 o ste no seespecifica.

    El siguiente cuadro muestra el formato genrico de la redireccin deentrada.

    [N]

  • 8/7/2019 Bash Comandos

    7/27

    2.2. Redirecciones de salida.

    De igual forma a los descrito en el apartado anterior, la redireccin desalida 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 unprograma: la salida normal (con nmero de descriptor 1) y la salida deerror (con el descriptor 2).

    En la siguiente tabla se muestran los formatos genricos para lasredirecciones de salida.

    Redireccin Descripcin

    [N]>Fichero

    Abre el fichero de descriptor N para escritura. Pordefecto se usa la salida estndar (N=1). Si el ficheroexiste, se borra; en caso contrario, se crea.

    [N]>|Fichero Como en el caso anterior, pero el fichero debe existirpreviamente.

    [N]>>Fichero Como en el primer caso, pero se abre el fichero paraaadir datos al final, sin borrar su contenido.

    &>Fichero Escribe las salida normal y de error en el mismo fichero.

    El siguiente ejemplo crea un fichero con las salidas generadas paraconfigurar, compilar e instalar una aplicacin GNU.

    configure > aplic.salmake >> aplic.salmake install >> aplic.sal

    2.3. Combinacin de redirecciones.

    Pueden combinarse ms de una redireccin sobre el mismo mandato ogrupo de mandatos, interpretndose siempre de izquierda a derecha.

    Ejercicio 2.1: interpretar las siguientes rdenes:

    ls al /usr /tmp /noexiste >ls.sal 2>ls.errfind /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 tablamuestra los formatos para duplicar descriptores.

    7

  • 8/7/2019 Bash Comandos

    8/27

    Redireccin Descripcin

    [N]&M- Mover descriptor de salida M en N, cerrando M (N=1,por defecto).

    Conviene hacer notar, que siguiendo las normas anteriores las 2 lneassiguientes son equivalentes y ambas sirven para almacenar las salidasnormal y de error en el fichero indicado:

    ls al /var/* &>ls.txtls 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 deizquierda a derecha, teniendo en cuenta los posibles duplicados dedescriptores hechos en lneas anteriores.

    ls al * >ls.txt 2>&1 # Salida normal y de error a "ls.txt".ls al * 2>&1 >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 paraoperaciones de lectura y escritura y le asigna el descriptor indicado (0por defecto). Se utiliza en operaciones para modificacin y actualizacinde datos. El formato genrico es:

    [N]Fichero

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

    8

  • 8/7/2019 Bash Comandos

    9/27

    echo 1234567890 > fich # Genera el contenido de "fich"exec 3 fich # Abrir fich con descriptor 3 en E/Sread -n 4 &3 # Escribir coma decimalexec 3>&- # Cerrar descriptor 3cat fich # 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 alcomando correspondiente. Suele utilizarse para mostrar o almacenartexto 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 mscomprensible. El formato

  • 8/7/2019 Bash Comandos

    10/27

    2.6. Tuberas.

    La tubera es una herramienta que permite utilizar la salida normal deun programa como entrada de otro, por lo que suele usarse en el filtrado

    y depuracin de la informacin, siendo una de las herramientas mspotentes 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 Descripcin

    head Corta las primeras lneas de un fichero.

    tail Extrae las ltimas lneas de un fichero.

    grep Muestra las lneas que contienen una determinada cadena decaracteres o cumplen un cierto patrn.

    cut Corta columnas agrupadas por campos o caracteres.

    uniq

    Muestra o quita las lneas repetidas.sort Lista el contenido del fichero ordenado alfabtica o

    numricamente.

    wc Cuenta lneas, palabras y caracteres de ficheros.

    find Busca ficheros que cumplan ciertas condiciones y posibilitaejecutar operaciones con los archivos localizados

    sed Edita automticamente un fichero.

    diff

    Muestra las diferencias entre 2 ficheros en un formatocompatible con la orden sed.

    comm Compara 2 ficheros.

    tr Sustituye grupos de caracteres uno a uno.

    awk Procesa el fichero de entrada segn las reglas de dicholenguaje.

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

    10

  • 8/7/2019 Bash Comandos

    11/27

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

    La orden tee es un filtro especial que recoge datos de la entradaestndar y lo redirige a la salida normal y a un fichero especificado, tanto

    en operaciones de escritura como de aadidura. Esta es una orden muytil que suele usarse en procesos largos para observar y registrar laevolucin de los resultados.

    El siguiente ejemplo muestra y registra el proceso de compilacin einstalacin de una aplicacin GNU.

    configure 2>&1 | tee aplic.salmake 2>&1 | tee a aplic.salmake instal 2>&1 | tee a aplic.sal

    Ejercicio 2.2: interpretar la siguiente orden:

    ls | tee salida | sort -r

    11

  • 8/7/2019 Bash Comandos

    12/27

    3. Variables.

    Al contrario que en otros lenguajes de programacin, BASH no hace

    distincin en los tipos de datos de las variables; son esencialmentecadenas de caracteres, aunque segn el contexto tambin puedenusarse con operadores de nmeros enteros y condicionales. Esta filosofade 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 deasignacin, mientras que se hace referencia a su valor utilizando elsmbolo del dlar delante de su nombre.

    Suele usarse la convencin de definir las variables en maysculas paradistinguirlas fcilmente de los mandatos y funciones, ya que en Unix las

    maysculas y minsculas se consideran caracteres distintos.VAR1="Esto es una prueba # asignacin de una variableVAR2=35 # asignar valor numricoecho $VAR1 # Esto es una pruebaecho "VAR2=$VAR2" # VAR2=35

    3.1. Tipos de variables.

    Las variables del intrprete BASH pueden considerarse desde lossiguientes puntos de vista:

    Las variables locales son definidas por el usuario y se utilizannicamente dentro de un bloque de cdigo, de una funcindeterminada o de un guin.

    Las variables de entorno son las que afectan al comportamientodel intrprete y al de la interfaz del usuario.

    Los parmetros de posicin son los recibidos en la ejecucin decualquier 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. Losparmetros 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

  • 8/7/2019 Bash Comandos

    13/27

    Una variable tiene un nombre nico en su entorno de operacin, sinembargo pueden aunque no es nada recomendable usarse variables conel mismo nombre en distintos bloques de cdigo.

    El siguiente ejemplo muestra los problemas de comprensin y depuracinde cdigo que pueden desatarse en caso de usar variables con el mismonombre. En la primera fila se presentan 2 programas que usan la mismavariable y en la segunda, la ejecucin de los programas (ntese que elsigno>es el punto indicativo del interfaz de la shell y que lo tecleadopor el usuario se representa en letra negrita).

    #!/bin/bash# prog1 variables prueba 1VAR1=pruebaecho $VAR1

    #!/bin/bash# prog2 variables prueba 2VAR1="otra prueba"echo $VAR1

    > echo $VAR1

    > prog1prueba

    > prog2otra prueba> prog1prueba

    Por lo tanto, para asignar valores a una variable se utiliza simplemente sunombre, pero para hacer referencia a su valor hay que utilizar el smbolodlar ($). El siguiente ejemplo muestra los modos de referirse a unavariable.

    ERR=2 # Asigna 2 a la variable ERR.echo ERR # ERR (cadena "ERR").

    echo $ERR #

    2 (valor de ERR).echo ${ERR} # 2 (es equivalente).echo "Error ${ERR}: salir" # Error 2: salir

    El formato ${Variable} se utiliza en cadenas de caracteres donde sepuede 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 conjuntode variables que informan sobre su propio contexto de operacin. Elusuario o un shellscript puede actualizar y aadir variables exportandosus valores al entorno del intrprete (mandato export), lo que afectartambin a todos los procesos hijos generados por ella.

    El administrador puede definir variables de entorno estticas para losusuarios del sistema (como, por ejemplo, en el caso de la variableIFS).

    La siguiente tabla presenta las principales variables de entorno.

    13

  • 8/7/2019 Bash Comandos

    14/27

    Variable deentorno

    Descripcin Valor poromisin

    SHELL Camino del programa intrprete demandatos.

    La propia shell.

    PWD Directorio de trabajo actual. Lo modifica lasheil.

    OLDPWD Directorio de trabajo anterior (equivale a ~-). Lo modifica lasheil.

    PPID Identificador del proceso padre (PPID). Lo modifica lashell

    IFS Separador de campos de entrada (debe serde slo lectura).

    ESP, TAB, NL.

    HOME Directorio personal de la cuenta. Lo define root.

    LOGNAME Nombre de usuario que ejecuta la shell. Activado porlogin

    PATH Camino de bsqueda de mandatos. Segn elsistema

    LANG Idioma para los mensajes.

    EDITOR Editor usado por defecto.

    TERM Tipo de terminal.

    PS1 ... PS4 Puntos indicativos primario, secundario,selectivo y de errores.

    FUNCNAME Nombre de la funcin que se est ejecutando. Lo modifica lashell.

    LINENO N de lnea actual del guin (para depuracinde cdigo)

    Lo modifica lashell.

    Debe hacerse una mencin especial a la variable PATH, que se encarga deguardar la lista de directorios con ficheros ejecutables. Si no se especificael camino exacto de un programa, el sistema busca en los directoriosespecificados por PATH, siguiendo el orden de izquierda a derecha. Elcarcter separador de directorios es dos puntos.

    El administrador del sistema debe establecer los caminos por defectopara todos los usuarios del sistema y cada uno de stos puedepersonalizar su propio entorno, aadiendo sus propios caminos debsqueda (si no usa un intrprete restringido).

    14

  • 8/7/2019 Bash Comandos

    15/27

    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 variablePATHy, sobre todo, nunca incluir el directorio actual (.), ni el directorio padre(..).

    Declarar la variable IFS de slo lectura, para evitar intrusiones del tipocaballos de Troya.

    3.1.3. Parmetros de posicin.

    Los parmetros de posicin son variables especiales de BASH quecontienen los valores de los parmetros que recibe un programa o unafuncin. El nmero indica la posicin de dicho parmetro en la llamada alcdigo.

    El 1er parmetro se denota por la variable$1, el 9 por$9 y a partir del10 hay que usar la notacin${Nmero}.

    El mandato interno shift desplaza la lista de parmetros hacia laizquierda 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 parmetrosposicionales y de variables locales, donde se muestran algunas lneas deun programa para gestin de usuarios.

    grep "^$1:" /etc/passwdgrep ":$GID:" /etc/group | cut -f1 -d:

    1. Imprime la lnea del fichero de usuarios para el especificado en el1er parmetro recibido por el programa.

    2. Presenta el nombre del grupo cuyo identificador se encuentra en lavariable GID.

    3.1.4. Variables especiales.

    Las variables especiales informan sobre el estado del proceso, sontratadas y modificadas directamente por el intrprete, por lo tanto, sonde slo lectura.

    La siguiente tabla describe brevemente estas variables.

    15

  • 8/7/2019 Bash Comandos

    16/27

    Variableespecial

    Descripcin

    $$ Identificador del proceso (PID).

    $*

    Cadena con el contenido completo de los parmetros recibidospor el programa.

    $@ Como en el caso anterior, pero trata cada parmetro como unpalabra 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 argumento del comando ejecutadopreviamente.

    La construccincat "$@"se utiliza para procesar datos tanto de ficheroscomo de la entrada estndar [4].

    La 1 fila de la tabla del siguiente ejemplo muestra el cdigo de unprograma para convertir minsculas en maysculas; mientras que la 2,indica cmo puede utilizarse el programa (el texto tecleado estrepresentado 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 [ [ mayusculas datos.txt >datos.sal> mayusculas datos.sal> mayusculasEsto es una prueba de ejecucin del programa.^DESTO ES UNA PRUEBA DE EJECUCIN DEL PROGRAMA.

    Un uso comn de la variable $$ es el de asignar nombres para ficherostemporales que permiten el uso concurrente del programa, ya que alestar asociada al PID del proceso, ste valor no se repetir nunca alejecutar simultneamente varias instancias del mismo programa.

    Ejercicio 3.2: interpretar los siguientes mandatos:

    echo $0; shift; echo $0

    16

  • 8/7/2019 Bash Comandos

    17/27

    3.2. Matrices.

    Una matriz (o array) es un conjunto de valores identificados por elmismo nombre de variable, donde cada una de sus celdas cuenta con unndice que la identifica. Las matrices deben declararse mediante laclusula interna declare, antes de ser utilizadas.

    BASH soporta matrices de una nica dimensin conocidas tambin comovectores, con un nico ndice numrico, pero sin restricciones detamao ni de orden numrico o continuidad.

    Los valores de las celdas pueden asignarse de manera individual ocompuesta. Esta segunda frmula permite asignar un conjunto de valoresa 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 valorpreviamente usado.

    El uso de los caracteres especiales [@] o [*] como ndice de la matriz,supone referirse a todos los valores en su conjunto, con un significadosimilar al expresado en el apartado anterior.

    El siguiente ejemplo describe la utilizacin de matrices.

    declare a NUMEROS # Declarar la matriz.NUMEROS=( cero uno dos tres ) # Asignacin compuesta.echo ${NUMEROS[2]} # dosNUMEROS[4]="cuatro" # Asignacin simple.echo ${NUMEROS[4]} # cuatroNUMEROS=( [6]=seis siete [9]=nueve ) # celdas 6, 7 y 9.echo ${NUMEROS[7]} # siete

    Ejercicio 3.3: segn los datos de la matriz del ejemplo anterior, cul es lasalida de la siguiente orden:

    echo ${NUMEROS[*]}

    3.3. Configuracin del entorno.

    El intrprete de mandados de cada cuenta de usuario tiene un entorno deoperacin propio, en el que se incluyen una serie de variables deconfiguracin.

    El administrador del sistema asignar unas variables para el entorno deejecucin comunes a cada grupo de usuarios o a todos ellos; mientrasque cada usuario puede personalizar algunas de estas caractersticas ensu perfil de entrada, aadiendo o modificando las variables.

    Para crear el entorno global, el administrador crea un perfil de entradacomn para todos los usuarios (archivo /etc/bashrc en el caso de BASH),

    17

  • 8/7/2019 Bash Comandos

    18/27

    donde entre otros cometidos se definen las variables del sistema y seejecutan 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 basadosen el de Bourne (BSH, BASH, PDKSH, etc.), con extensin.sh, y otrospara los basados en el intrprete C (CSH, TCSH, etc.), con extensin .csh.El proceso de conexin del usuario se completa con la ejecucin del perfilde entrada personal del usuario (archivo ~/.bash_profile para BASH).Aunque el administrador debe suministrar un perfil vlido, el usuariopuede retocarlo a su conveniencia. En el siguiente captulo se presentanlas variables de entorno ms importantes usadas por BASH.

    18

  • 8/7/2019 Bash Comandos

    19/27

    4. Expresiones.

    El intrprete BASH permite utilizar una gran variedad de expresiones en

    el desarrollo de programas y en la lnea de mandatos. Las distintasexpresiones soportadas por el intrprete pueden englobarse en lassiguientes categoras:

    Expresiones aritmticas: las que dan como resultado un nmeroentero o binario.

    Expresiones condicionales: utilizadas por mandatos internos deBASH para su evaluar indicando si sta es cierta o falsa.

    Expresiones de cadenas: aquellas que tratan cadenas decaracteres (se tratarn a fondo en el Captulo 6).

    Las expresiones complejas cuentan con varios parmetros y operadores,se evalan de izquierda a derecha. Sin embargo, si una operacin estencerrada entre parntesis se considera de mayor prioridad y se ejecutaantes.

    La tabla lista los operadores utilizados en los distintos tipos deexpresiones BASH.

    Operadoresaritmticos:

    + - * / % ++ --

    Operadores decomparacin:

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

    Operadores lgicos: ! && ||

    Operadores binarios: & | ^ >

    Operadores deasignacin:

    = *= /= %= += -= = &= ^= |=

    Operadores de tipos de

    ficheros:

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

    Operadores depermisos:

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

    Operadores de fechas: -nt ot et

    Operadores decadenas:

    -z -n

    19

  • 8/7/2019 Bash Comandos

    20/27

    4.1. Expresiones aritmticas.

    Las expresiones aritmticas representan operaciones nmeros enteros obinarios (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 comprobacinde desbordamiento, esto es, ignorando los valores que sobrepasenel mximo permitido.

    La divisin por 0 genera un error que puede ser procesado.

    La prioridad y asociatividad de los operadores sigue las reglas dellenguaje C.

    La siguiente tabla describe las operaciones aritmticas enteras y binarias

    agrupadas en orden de prioridad.

    Operacin Descripcin Comentarios

    Var++

    Var--

    Post-incremento de variable.

    Post-decremento de variable.

    La variable se incrementa odecrementa en 1 despus deevaluarse su expresin.

    ++Var

    --Var

    Pre-incremento de variable.

    Pre-decremento de variable.

    La variable se incrementa odecrementa en 1 antes de

    evaluarse su expresin.

    +Expr

    -Expr

    Ms unario.

    Menos unario.

    Signo positivo o negativo de laexpresin (por defecto seconsidera positivo).

    ! Expr

    ~ Expr

    Negacin lgica.

    Negacin binaria.Negacin de la expresinlgica o negacin bit a bit.

    E1 ** E2 Exponenciacin. E1 elevado a E2 (E1 E2).

    E1 * E2

    E1 / E2

    E1 % E2

    Multiplicacin.Divisin.

    Resto.

    Operaciones de multiplicaciny divisin entre nmerosenteros.

    E1 + E2

    E1 - E2

    Suma..

    Resta.Suma y resta de enteros.

    Expr > N

    Desplazamiento binario a laizquierda.

    Desplazamiento binario a la

    derecha.

    Desplazamiento de los bits unnmero indicado de veces.

    20

  • 8/7/2019 Bash Comandos

    21/27

    E1 < E2

    E1 E2

    E1 >= E2

    Comparaciones (menor,menor o igual, mayor, mayor oigual).

    E1 = E2E1 != E2

    Igualdad.Desigualdad.

    E1 & E2 Operacin binaria Y.

    E1 ^ E2 Operacin binaria O Exclusivo.

    E1 | E2 Operacin binaria O.

    E1 && E2 Operacin lgica Y.

    E1 || E2 Operacin lgica O.

    E1 ? E2 : E3 Evaluacin lgica. Si E1=cierto, se devuelve E2;si no, E3.

    E1 = E2

    E1 Op= E2

    Asignacin normal y con pre-operacin (operadores vlidos:*=, /=, %=, +=, -=, =, &=,^=, |=).

    Asigna el valor de E2 a E1. Sies indica un operador, primerose realiza la operacin entrelas 2 expresiones y se asignael resultado (E1 = E1 Op E2).

    E1, E2 Operaciones independientes. Se ejecutan en orden.

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

    let a=5 # Asignacin a=5.let b=$a+3*9 # b=a+(3*9)=32.echo "a=$a, b=$b" # a=5, b=32let 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=3let 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 ladecimal (base por defecto). El siguiente ejemplo muestra los formatos decambio de base.

    let N=59 # Base decimal (0-9).let N=034 # Base octal (0-7), empieza por 0.let N=0x34AF # Base hexadecimal (0-9A-F), empieza por 0x.let N=[20#]G4H2 # Base 20 (especificada entre 2 y 64).

    Ejercicio 4.1: explicar la siguiente expresin.

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

    21

  • 8/7/2019 Bash Comandos

    22/27

    4.2. Expresiones condicionales.

    Las expresiones condicionales son evaluadas por los mandatos internosdel tipotest, dando como resultado un valor de cierto o de falso. Suelen

    emplearse en operaciones condicionales y bucles, aunque tambinpueden ser empleadas en rdenes compuestas.

    Existen varios tipos de expresiones condicionales segn el tipo deparmetros utilizado o su modo de operacin:

    Expresiones con ficheros, que comparan la existencia , el tipo, lospermisos o la fecha de ficheros o directorios.

    Expresiones comparativas numricas, que evalan la relacinde orden numrico entre los parmetros.

    Expresiones comparativas de cadenas, que establecen la

    relacin de orden alfabtico entre los parmetros.Todas las expresiones condicionales pueden usar el modificador denegacin (! Expr) para indicar la operacin inversa. Asimismo, puedencombinarse varias de ellas en una expresin compleja usando losoperadores lgicos Y (Expr1&&Expr2) y O (Expr1||Expr2).

    4.2.1. Expresiones de ficheros.

    Son expresiones condicionales que devuelven el valor de cierto si secumple la condicin especificada; en caso contrario da un valor de falso.Hay una gran variedad de expresiones relacionadas con ficheros ypueden agruparse en operaciones de tipos, de permisos y de comparacinde fechas.

    Conviene recordar que todo en Unix es un fichero, por eso haybastantes operadores de tipos de ficheros. La siguiente tabla lista losformatos de estas expresiones.

    Formato Condicin (cierto si...)-eFich El fichero (de cualquier tipo) existe

    -s Fich El fichero no est vaco.

    -f Fich Es un fichero normal.

    -d Fich Es un directorio.

    -b Fich Es un dispositivo de bloques.

    -c Fich Es un dispositivo de caracteres.

    -p Fich Es una tubera.

    22

  • 8/7/2019 Bash Comandos

    23/27

    -h Fich

    -L Fich

    Es un enlace simblico.

    -S Fich Es una socket de comunicaciones.

    -tDesc El descriptor est asociado a una terminal.

    F1 -efF2 Los 2 ficheros son enlaces hacia el mismo archivo.

    Las condiciones sobre permisos establecen si el usuario que realiza lacomprobacin puede ejecutar o no la operacin deseada sobre undeterminado fichero. La tabla describe estas condiciones.

    Formato Condicin (cierto si...)

    -rFich Tiene permiso de lectura.

    -wFich Tiene permiso de escritura (modificacin).

    -xFich Tiene permiso de ejecucin/acceso.

    -uFich Tiene el permiso SUID.

    -gFich Tiene el permiso SGID.

    -tFich Tiene permiso de directorio compartido o fichero en cach.

    -OFich Es el propietario del archivo.-GFich El usuario pertenece al grupo con el GID del fichero.

    Las operaciones sobre fechas descritas en la siguiente tabla establecencomparaciones entre las correspondientes a 2 ficheros.

    Formato Condicin (cierto si...)

    -NFich El fichero ha sido modificado desde al ltima lectura.F1 -ntF2 El fichero F1 es ms nuevo que el F2.

    F1 -otF2 El fichero F1 es ms antiguo que el F2.

    Vanse ejemplos extrados del fichero de configuracin/etc/rc.d/rc.sysinit.

    23

  • 8/7/2019 Bash Comandos

    24/27

    # Si /proa/mdstat y /etc/raidtab son ficheros; entonces ...if [ -f /proc/mdstat -a -f /etc/raidtab ]; then...# Si el camino representado por el contenido de la variable# $afile es un directorio; entonces ...if [ -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 losformatos para este tipo de expresiones.

    Formato Condicin (cierto si...)

    N1 -eqN2

    N1 -neN2

    N1 -ltN2

    N1 -gtN2

    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 entrecadenas de caracteres. Conviene destacar que es recomendable usarcomillas dobles para delimitar las cadenas a comparar.

    La tabla siguiente indica el formato para este tipo de expresiones.

    24

  • 8/7/2019 Bash Comandos

    25/27

    Formato Condicin (cierto si...)

    Cad1 =Cad2

    Cad1 !=Cad2Se cumple la condicin de comparacin de cadenas(respectivamente igual y distinto).

    [-n] Cad La cadena no est vaco (su longitud no es 0).

    -zCad 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 LOGNAME es una variable vaca o# tiene el valor "(none)"; entonces ...if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then

    ...# Si la variable $fastboot no tiene contenido y# la variable $ROOTFSTYPE no es "nfs"; entonces ...if [ -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

  • 8/7/2019 Bash Comandos

    26/27

    5. Entrecomillado.

    Cada uno de los caracteres especiales metacaracteres usados enBASH tienen un comportamiento especial, segn la sintaxis del lenguaje.El entrecomillado es el procedimiento utilizado para modificar oeliminar el uso normal de dicho metacaracteres. Obsrvese el siguienteejemplo.

    # 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 delcarcter que lo precede; la secuencia \\ equivale a presentar elcarcter \. Cuando aparece como ltimo carcter de la lnea, sirvepara continuar la ejecucin de una orden en la lnea siguiente.

    Comillas simples ('Cadena'): siempre conserva el valor literal decada uno de los caracteres de la cadena.

    Comillas dobles ("Cadena"): conserva el valor de literal de lacadena, excepto para los caracteres dlar ($), comilla simple (') yde escape (\$, \\, \', \", ante el fin de lnea y secuencia de escapedel tipo ANSI-C).

    El entrecomillado con formato $"Cadena" se utiliza para procesos detraduccin segn el idioma expresado por la variable LANG. Si se utiliza elvalor de idioma por defecto (C o POSIX), la cadena se trata normalmentecon 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

  • 8/7/2019 Bash Comandos

    27/27

    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 SoftwareFoundation, 2.002.

    3. Mike G, trad. G. Rodrguez Alborich: Programacin en BASH COMOde Introduccin. 2.000.

    4. M. Cooper: Advanced Bash-Scripting Guide, v2.1. LinuxDocumentation Project, 2.003.

    5. R. M. Gmez Labrador: Administracin Avanzada de Sistemas Linux(3 edicin). Secretariado de Formacin del PAS (Universidad deSevilla), 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/

    http://www.gnu.org/http://www.tldp.org/http://www.hispalinux.es/http://www.hispalinux.es/http://www.hispalinux.es/http://www.hispalinux.es/http://www.gnu.org/http://www.tldp.org/http://www.hispalinux.es/