Shell Script Guion

Embed Size (px)

Citation preview

  • 7/26/2019 Shell Script Guion

    1/48

    LINUX: Guiones Shell (Shell scripts)

  • 7/26/2019 Shell Script Guion

    2/48

    2

    ndice

    1.Concepto de SHELL en Linux 42.Funcionamiento del Shell 6

    3.Variables y parmetros 63.1. Variables . . . . . . . . . . . . . . .............................. 63.2. Parmetros . . . . . . . . . . . . . .............................. 83.3. Reglas de evaluacin de variables .............................. 93.4. Arrays . . . . . . . . . . . . . . . .............................. 11

    4. Caracteres especiales y de entrecomillado 124.1. Sustitucin de rdenes.................................... 14

    5.Estructuras de control 145.1.IF y CASE . . . ........................................ 145.2.WHILE y UNTIL ....................................... 155.3.FOR . . . . . . . ........................................ 175.4.SELECT . . . . . ........................................ 175.5. BREAK y CONTINUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    6.Generacin de nombres de ficheros 20

    7.Entrada/salida estndar y redireccin 21

    8.Tuberas o Filtros 21

    9.rdenes internas de Bash 23

    10.Evaluacin aritmtica 25

    11.La ordentest 2711.1. Ejemplos de uso . . . . . . . . . ............................... 29

    12. rdenes simples, listas de rdenes y rdenes compuestas 3112.1. rdenes simples . . ...................................... 3112.2. Listas de rdenes . ...................................... 3112.3. rdenes compuestas..................................... 31

    13. Funciones 3213.1. Ejemplo de funciones ..................................... 3213.2. Ejemplo de funciones con parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    14. Depuracin 33

  • 7/26/2019 Shell Script Guion

    3/48

    15. Ejemplos de guiones shell 32

    16. Ejercicios propuestos 43

    17. Bibliografa 48

  • 7/26/2019 Shell Script Guion

    4/48

    1. Concepto de SHELL enLinux

    Unshelles un intrprete de rdenes, y unintrprete de rdeneses el programa que recibe loque se escribe en la terminal y lo convierte en instrucciones para el sistema operativo.Bsicamente permite a los usuarios comunicarse con el sistema operativo y darle rdenes. Enotras palabras, el objetivo de cualquier intrprete de rdenes es ejecutar los programas que elusuario teclea en el prompt del mismo.Elpromptes una indicacin que muestra el intrprete para anunciar que espera una orden

    del usuario. Cuando el usuario escribe una orden, el intrprete la ejecuta. En dicha orden, puedehaber programasinternosoexternos. Los programas internos son aquellos que vienenincorporados en el propio intrprete, como, por ejemplo,echo,cd, okill. Mientras que losexternos son programas separados, un ejemplo son todos los programas que residen en losdirectorios/bin,/usr/bin, etc., comols,cat, ocp.En el mundo UNIX/Linux existen tres grandes familias de shells:sh,cshyksh. Se

    diferencian entre s,bsicamente,en la sintaxis de sus rdenes y en lainteraccincon el usuario.En la siguiente tabla se muestran las tres grandes familias de shells, con el nombrecorrespondiente y posibles clones de cada uno:

    Tipo de Shell Shell estndar Clones libresAT&T Bourne shellsh ash, bash, bash2Berkeley C shell csh tcshAT&T Korn shell ksh pdksh, zshOtros interpretes esh, gush, nwsh

    Por defecto, cada usuario tiene asignado un shell, establecido en el momento de creacin desu cuenta, y que se guarda en el fichero/etc/passwd. En los laboratorios de prcticas paraconsultar ese fichero se puede ejecutar la ordenypcat passwd. El shell asignado a un usuario sepuede cambiar de dos maneras: editando manualmente dicho fichero (que tiene que serrealizado por el admi- nistrador del sistema), o bien con el programachsh(que lo puede ejecutarel propio usuario). Los shells estn en el directorio/bin. Por ejemplo, para hacer que el shell pordefecto sea/bin/bashse ejecutara:

    chsh -s /bin/bash

    Una de las principales caractersticas del shell es que puede programarse usando ficheros detexto que contienen rdenes que interpretar en la ejecucin de los mismos. Estos ficheros detexto se llamanscripts,shell scriptsoguiones shells. Una vez creados, estos guiones shells

    pueden ser ejecutados tantas veces como se desee, realizando las operaciones que seprogramaron. El shell ofrece construcciones y facilidades para hacer ms sencilla suprogramacin. La programacin shell en UNIX/Linux es, en cierto sentido, equivalente a creararchivos .BAT en MS-DOS, con la diferencia de que en UNIX/Linux es mucho ms potente.

    Una definicin de guiones shells podra ser la dada a continuacin:

    Es unficherode texto ejecutable que contiene rdenes ejecutables por el shell.

  • 7/26/2019 Shell Script Guion

    5/48

    Un guin shell puede incluircomentarios, para ello se utiliza el carcter#al inicio del textoque formar el comentario. En un guin shell se puede indicar el tipo de shell con el que se debede interpretar o ejecutar, indicando en la primera lnea del mismo lo siguiente:

    #!/bin/bash

    En este caso el carcter # del principio de la lnea no es un comentario.

    La programacin de shell es una de las herramientas ms apreciadas por todos los administra-dores y muchos usuarios de UNIX/Linux ya que permite automatizar tareas complejas, rdenesrepetitivas y ejecutarlas con una sola llamada al script, o hacerlo automticamente a horas escogi-das sin intervencin de personas. A continuacin se muestran una serie de ejemplos de distintastareas que se suelen automatizar con scripts:

    Tareas administrativas: algunas partes de los sistemas UNIX son guiones shell. Para poderentenderlosymodificarloses necesario tener alguna nocin sobre laprogramacinde

    scripts.Tareas tediosas que slo se van a ejecutar una o dos veces, no importa el rendimiento delprograma resultante pero s conviene que su programacin sea rpida.

    Hacer que varios programas funcionen como un conjunto de forma sencilla.

    Pueden ser un buen mtodo para desarrollar prototipos de aplicaciones ms complejas queposteriormente se implementarn en lenguajes ms potentes.

    Conocer a fondo el shell aumenta tremendamente la rapidez y productividad a la hora deutilizarlo, incluso sin hacer uso de guiones shell.

    Los guiones shells pueden utilizar un sin nmero de herramientas como:

    Comandos del sistema UNIX/Linux, por ejemplols,cut, etc.

    Funciones internas del shell, por ejemploecho,let, etc.

    Lenguaje de programacin del shell, por ejemploif/then/else/fi,etc.

    Programas y/o lenguajes de procesamiento en lnea, por ejemploawk,sed,Perl.

    Programas propios del usuario escritos en cualquier lenguaje.

    Si un guin shell se queda pequeo para lo que queremos hacer, existen otros lenguajes inter-pretados mucho ms potentes comoPerl,TCLoPython.

    El intrprete de rdenes seleccionado para realizar estas prcticas es elBourne-Again Shell,cuyo ejecutable es/bin/bash. El resto del contenido de este documento est centrado en este intr-prete de rdenes

  • 7/26/2019 Shell Script Guion

    6/48

    2. Funcionamiento delShell

    Supongamos que tenemos el siguiente guin shell:

    #!/bin/bashcleardate

    al ejecutarse el proceso que se sigue es el siguiente:

    1. El shell/bin/bashhace unfork.

    2. El proceso padre espera mientras no termina el nuevo hijo.

    3. El proceso hijo hace unforky unexecpara ejecutar la ordenclear, a continuacin ejecuta unwaitpara esperar a que termine la ejecucin declear.

    4.Una vez que ha terminado la ordenclear, el proceso hijo repite los mismos pasos pero estavez ejecutando la ordendate.

    5. Si quedasen rdenes por ejecutar se seguira el mismo procedimiento.

    6. Cuando finaliza el proceso hijo, hace que el padre se despierte.

    3. Variables yparmetros

    3.1. Variables

    Cada shell tiene unas variables ligadas a l, a las que el usuario puede aadir tantas como

    desee. Para dar un valor a una variable se usa:variable=valor

    donde variable es el nombre de la misma. Es interesante destacar que no puede haber un es-pacio entre el nombre de la variable, el signo = y el valor. Por otra parte, si se desea que el valorcontenga espacios, es necesario utilizar comillas.Para obtener el valor de una variable hay que ante ponerle a su nombre el carcter $. Por

    ejemplo, para visualizar el valor de una variable:

    echo $variable

    Un ejemplo del uso de las variables sera:

    $ mils="ls -l" # Se crea una nueva variable$ mils # No hace nada, buscar el ejecutable

    # mils, que no existe$ $mils # jecutar la orden "ls -l"$ echo $mils # uestra el contenido de la variable

    # mils, ie, "ls -l"

  • 7/26/2019 Shell Script Guion

    7/48

    Las variables se dividen en dos tipos:

    Variables locales: son aqullas que no son heredadas por los procesos hijos del shell actual(cuando se realiza unfork).

    Variables de entorno: Estas variables son heredadas por los procesos hijos cuando seejecuta unfork.

    La ordenexportconvierte una variable local en variable de entorno:

    $ exort mils # onvierte la variable mils en# variable de entorno

    $ exort var=valor # rea la variable, le asi%na "valor"# & la exorta a la ve'

    La ordensetmuestra todas las variables (locales y de entorno).La ordenenvmuestra slo las variables de entorno.

    Con la ordenunsetse pueden restaurar o eliminar variables o funciones. Por ejemplo, la si-guiente instruccin elimina el valor de la variablemils:

    $ unset mils

    Adems de las variables que puede definir el programador, un shell tienedefinidas,pordefec- to, una serie de variables, las ms importantes son:

    PS1: prompt primario. El siguiente ejemplomodificael prompt, utilizando colores, elnombre del usuario aparece en color verde, y el resto en negro:

    (S)=*+,..+.012m,u,..+.12m3,h 4 5 $*

    PS2: prompt secundario.

    LOGNAME: nombre del usuario.

    HOME: directorio de trabajo (home) del usuario actual, es el argumento que la ordencdtoma por defecto.

    PATH: caminos usados para ejecutar rdenes o programas. El directorio actual no estinclui- do en la bsqueda por defecto (en MS_DOS s) y si se desea debe formar parte de lavariable PATH. Por ejemplo:

    $ (678=/bin9/home/mio9/usr/bin/99$ (678=$(6789/usr/sbin9

    PWD: directorio activo.

    TERM: el tipo de la terminal actual.

  • 7/26/2019 Shell Script Guion

    8/48

    SHELL: shell actual.

    IFS: elSeparador Interno de Campoque se emplea para la divisin de palabras tras la expan-sin y para dividir lneas en palabras con la orden internaread. El valor predeterminado es.

    Las siguientes variables son muy tiles al programar los guiones shells:

    $?: esta variable contiene el valor de salida de la ltima orden ejecutada. Es til para sabersi una orden ha finalizado con xito o ha tenido problemas. Un 0 indica que no ha habidoerrores, otro valor indica que s ha habido errores.

    $!:identificadorde proceso de la ltima orden ejecutada en segundo plano.

    $$: el identificador de proceso (PID) de este shell, til para incluirlo en nombres de ficherospara hacerlos nicos.

    $-: las opciones actuales suministradas para esta invocacin del shell.

    $*: todos los argumentos del shell comenzando por el$1. Cuando la expansin ocurre entrecomillas dobles, seexpandea una sola palabra con el valor de cadaparmetro separadoporel primer carcter de la variable especialIFS. Esto es, $* es equivalente a$1c$2c.. ..,donde c es el primer carcter del valor de la variableIFS. SiIFSno est definida, losparmetros se separan porespacios.SiIFSes la cadena vaca, losparmetrosse juntan sinningn separador.

    $@:igual que el anterior, excepto cuando va entrecomillado. Cuando la expansin ocurredentro de comillas dobles, cada parmetro se expande a una palabra separada. Esto es,$@es equivalente a $1$2...

    3.2. ParmetrosComo cualquier programa, un guin shell puede recibir parmetros en la lnea de rdenes

    para tratarlos durante su ejecucin. Los parmetros recibidos se guardan en una serie devariables que el script puede consultar cuando lo necesite. Los nombres de estas variables son:

    $) $0 $. $:); $:)); $:)0;

    La variable$0contiene el nombre con el que se ha invocado al script, es decir el nombre delprograma.

    $1contiene el primer parmetro.

    $2contiene el segundo parmetro.. ..

    A continuacin se muestra un sencillo ejemplo de un guin shell que muestra los cuatro pri-meros parmetros recibidos:

    mailto:$@:mailto:$@:mailto:$@:
  • 7/26/2019 Shell Script Guion

    9/48

    #!/bin/bashecho l nombre del ro%rama es $echo l rimer armetro recibido es $)echo l se%undo armetro recibido es$0 echo l tercer armetro recibido es$. echo l cuarto armetro recibido es$1

    La ordenshiftmueve todos los parmetros una posicin a la izquierda, esto hace que el conte-nido del parmetro$1desaparezca, y sea reemplazado por el contenido de$2,$2es reemplazadopor$3, etc.La variable$#contiene el nmero de parmetros que ha recibido el script. Como se indic

    anteriormente$*o$@contienen todos los parmetros recibidos. La variable$@es til cuandoqueremos pasar a otros programas algunos de los parmetros que nos han pasado.Segn todo esto, un ejemplo sencillo de guin shell que muestra el nombre del ejecutable, el

    nmero total de parmetros, todos los parmetros y los cuatro primeros parmetros es el

    siguiente:#!/bin/bashecho l nombre del ro%rama es $echo l ntecho l se%undo armetro recibido es$) shi>techo l tercer armetro recibido es $)echo l cuarto armetro recibido es $0

    3.3. Reglas de evaluacin de variables

    A continuacin se describen las reglas que gobiernan la evaluacin de las variables del guinshell:

    $var: significa el valor de la variable o nada si la variable no est definida. Por ejemplo:

    echo $>echa

    muestra el contenido de la variable fecha, si existe. En caso de que no est definida no

    muestra nada.${var}: igual que el anterior excepto que las llaves contienen el nombre de la variable a sersustituida.

    ${var-thing}: el valor de var si est definida, si no thing.

    ${var=thing}: valor de var si est definida, si no thing y el valor de var pasa a ser thing.

  • 7/26/2019 Shell Script Guion

    10/48

    ${var?message}: si definida, $var; si no, imprime el mensaje en el terminal del shell. Si elmen- saje esta vaco imprime uno estndar.

    ${var+thing}: thing si $var est definida, si nonada.El siguiente ejemplo muestra cmo podemos usar una variable, asignndole un valor en caso

    de que no est definida. Esto es muy til para trabajar con variables numricas que no sabemos siestn o no definidas.

    $ echo l valor de var) es $:var);# No est de>inida, no imrimir nada

    $ echo l valor de la variable es $:var)=?;# 6l no estar de>inida, le asi%na el valor ?

    $ echo Su nuevo valor es $var)# Su valor es ?

    Pero si lo que queremos es usar un valor por defecto, en caso de que la variable no estdefinida, pero sin inicializar la variable, se puede utilizar el siguiente ejemplo:

    $ echo l valor de var) es $:var);# No est de>inida, no imrimir nada

    $ echo l valor de la variable es $:var)-?;# 6l no estar de>inida, utili'a el valor ?

    $ echo l valor es $var)# Su valor si%ue siendo nulo, no se ha de>inido

    Por otro lado, si lo que queremos es usar el valor de la variable, y en caso de que no estdefinida, imprimir un mensaje, podemos usar lo siguiente:

    $ echo l valor de var) es $:var);# No est de>inida, no imrimir nada

    $ echo l valor de la variable es $:var)@ No est de>inida;# 6l no estar de>inida, se muestra en antalla el mensaje

    $ echo l valor es $var)

    # Su valor si%ue siendo nulo, no se ha de>inido

    Este ltimo ejemplo nos muestra cmo utilizar un valor por defecto si una variable estdefini- da, o nada, sino est definida:

    $ var)=1 # Ae asi%na el valor 1$ echo l valor de var) es $:var);# l valor mostado ser 1

  • 7/26/2019 Shell Script Guion

    11/48

    $ echo l valor de la variable es $:var)B?;# 6l estar de>inida, se utili'a el valor ?

    $ echo l valor es $var)# Su valor si%ue siendo 1

    3.4. Arrays

    La shell permite que se trabaje con arrays (o listas) monodimensionales.Un array es unacolec- cin de elementos todos del mismo tipo, dotados de un nombre, y que se almacenan enposiciones contiguas de memoria. El primer elemento del array est numerado con el 0. No hayun tamao lmite para un array, y la asignacin de valores se puede hacer de forma alterna. Lasintaxis para declarar un array es la siguiente:

    nombreCarra&=Dval) val0 val. E #rea e iniciali'a un arra&nombreCarra&+x5=valor #6si%na un valor al elemento x

    Para acceder a un elemento de la lista se utiliza la siguiente sintaxis:

    $:nombreCarra&+x5; # (ara acceder al elemento x$:nombreCarra&+5; # (ara consultar todos los elementos$:nombreCarra&+35; # (ara consultar todos los elementos

    La diferencia entre usar * y@es que${nombre_array[*]}expande los elementos del array comosi fueran una nica palabra, mientras que${nombre_array[@]}se expande para formar cadaelemento del array una palabra distinta.

    Si al referenciar a un array no se utiliza subndice se considera que se est referenciando a suprimer elemento.

    Para conocer el tamao en bytes del array se utiliza#${nombre_array[x]},donde x puede ser un

    subndice, o bien los caracteres * @.

    Es interesante destacar la diferencia entre ejecutar las siguientes rdenes:

    $ aux=FlsF$ aux)=DFlsFE

    En el primer caso, la variableauxcontiene la salida delscomo una secuencia de caracteres. Mien-tras que en el segundo caso, al haber utilizado los parntesis,aux1es un array, y cada entradaest formada por los nombres de fichero devueltos por la ordenls. Supongamos que el directorioactual tenemos los siguientes ficheros: a.latex, b.latex, c.latex, d.latex, e.latex f.latex, observe elresultado de ejecutar las rdenes anteriores:

    $ lsalatex blatex clatex dlatex elatex >latex

    $ aux=FlsF$ echo $auxalatex blatex clatex dlatex elatex >latex

    $ echo $:aux+5;alatex blatex clatex dlatex elatex >latex

  • 7/26/2019 Shell Script Guion

    12/48

    $ aux)=DFlsFE$ echo $:aux)+5;alatex

    4. Caracteres especiales y deentrecomilladoEl entrecomillado se emplea para quitar el significado especial para el shell de ciertos meta

    caracteres o palabras. Puede emplearse para que caracteres especiales no se traten de forma espe-cial, para que palabras reservadas no sean reconocidas como tales, y para evitar la expansin deparmetros.Los meta caracteres (un meta carcter es uno de los siguientes caracteres | & ; ( )< >

    espacio tab) tienen un significado especial para el shell y deben ser protegidos o entrecomilladossi quie- ren representarse a s mismos. Hay 3 mecanismos deproteccin: elcarcter de escape,comillas simplesycomillas dobles.Unabarra inclinada inversa no entrecomillada(\)es elcarcter de escape, (no confundir

    con el cdigo ASCII cuyo valor es 27 en decimal o 33 en octal), el cual preserva el valor literaldel siguiente carcter que lo acompaa, con la excepcin de.Si aparece un par\y la barra invertida no est ella misma entre comillas, el\se tratacomo una continuacin de lnea (esto es, se quita del flujo de entrada y no se tiene en cuenta). Porejemplo:

    $ ls G -l

    s lo mismo que ejecutar "ls -l"

    Encerrar caracteres entrecomillas simplespreserva el valor literal de cada carcter entre las

    comillas. Una comilla simple no puede estar entre comillas simples, ni siquiera precedida de unabarra invertida.

    $ echo *caracteres eseciales9 $, H, F, ", D, E,,I,J,G,*caracteres eseciales9 $, H, F, ", D, E,,I,J,G,

    Encerrar caracteres entrecomillas doblespreserva el valor literal de todos los caracteres, conla excepcin de $, , y\.Los caracteres $ y mantienen su significado especial dentro de comillasdobles. La barra invertida mantiene susignificadoespecial solamente cuando est seguida poruno de los siguientes caracteres: $, , ", o.Una comilla doble puede serentrecomillada entre otras comillas dobles precedindola de una barra invertida. Por ejemplo:

    $ echo "caracteres eseciales9 $, H, F, ", D,E,,I,J,G," caracteres eseciales9 $, H, F, ", D,E,,I,J,G,

    Los parmetros especiales $* y $@ tienen un significado especial cuando estn entre comillasdobles, (vase el apartado de Variables y parmetros).Las palabras de la forma $cadena se tratan de forma especial. La palabra se expande a

    cadena, con los caracteres protegidos por barra invertida reemplazados segn especifica el

  • 7/26/2019 Shell Script Guion

    13/48

    estndar AN- SI/ISO de C. Las secuencias de escape con barra invertida, si estn presentes, sedescodificancomo sigue:

    \a:alerta (campana)

    \b:espacio-atrs

    \e:un carcter de escape (ESC)

    \f:nueva pgina

    \n:nueva lnea

    \r:retorno de carro

    \t:tabulacin horizontal

    \v:tabulacin vertical

    \\:barra invertida

    \nnn:el carcter cuyo cdigo es el valor octal nnn (de uno a tres dgitos)

    \xnnn:el carcter cuyo cdigo es el valor hexadecimal nnn

    El resultado traducido es entrecomillado con comillas simples, como si el signo de dlar nohubiera estado presente.A continuacin se muestra, de forma resumida, elsignificadode estos caracteres especiales:

    \ : elimina elsignificado especial del siguientecarcter

    $ : muestra el valor de la variable que le prosiga. La variable se puede meter entre llaves si

    enlaza con ms caracteres. Por ejemplo:$ echo $:var;ee

    Dentro de las comillas simples todos los caracteres soninterpretados literalmente,ninguno de los caracteres especiales conserva susignificadodentro de ellas, eliminando elsignificado especial de todo lo que va en medio.

    En general los caracteres especiales que hay en su interior no son interpretados, con laexcepcin de\, y $.

    4.1. Sustitucin de rdenes

    Poner una cadena entrecomillas invertidas, o bien entre parntesis precedida de un signo $,supone ejecutar su contenido como una orden y sustituir su salida, forzando al shell a ejecutarantes lo que va entre las comillas. La sintaxis es:

    FordenFK$DordenE

    Este proceso se conoce comosustitucin de rdenes. A continuacin se muestran variosejem- plos:

  • 7/26/2019 Shell Script Guion

    14/48

    $ aux=Fls -laiF # jecuta ls -lai & desuLs lo asi%na a aux$ echo $aux # uestra el contenido de aux$ >echa=$DdateE # jecuta date & almacena el valor en >echa$ echo $>echa # uestra el contenido de >echa

    Hay que tener en cuenta que el shell antes de ejecutar una orden, trata el significado especialde los caracteres especiales y deentrecomillado,as como los de generacin de nombres defichero.

    Por ejemplo:

    $ var=Fls -alF # (rimero ejecuta & lue%o le asi%na el valor$ echo $var # uestra el contenido de la variable$ echo FdateF # (rimero se ejecuta date & lue%o echo

    5. Estructuras decontrol5.1. IF y CASE

    En un guin shell se pueden introducir condiciones, de forma que determinadas rdenes slose ejecuten cuando se cumplan unas condiciones concretas. Para ello se utilizan las rdenesifycase, con la siguiente sintaxis:

    i> + exresiKn 5 #DNo tiene orque ser un testEthen

    Krdenes a ejecutar si se cumle lacondiciKn eli> +exresiKn5

    thenelseKrdenes a ejecutar si no se cumle la condiciKn

    >i

    # Del bloque eli> & sus Krdenes son ocionalesE

    Krdenes a ejecutar en caso contrario# Del bloque else & sus Krdenes son ocionales

    La expresin a evaluar porifpuede ser o untesto bien otras expresiones, como una lista de r-

    denes (usando su valor de retorno), una variable o una expresinaritmtica, bsicamentecualquierorden que devuelva un cdigo en$?.

    Un ejemplo del funcionamiento de la ordenifes:

    i> %re -q main raccthen

    else >i

  • 7/26/2019 Shell Script Guion

    15/48

    echoencontradala alabraclave main

    echo no encontrada la alabra clave main

  • 7/26/2019 Shell Script Guion

    16/48

    La sintaxis de la ordencase:

    case $var inv)E # jemlo +Ss5+Mi5E

    v0Iv.E E # aso or de>ectoesac

    Las expresiones regulares que hay en v1, v2 y v3 siguen el mismo patrn que los comodinesde los ficheros. Un ejemplo de su funcionamiento podra ser:

    case $var in)E echo Aa variable var es un uno0E echo Aa variable var es un dosE echo Aa variable var no es ni un uno ni un dos

    esac

    En el apartado Ejemplos de guiones shell se pueden encontrar ms ejemplos del uso deestas dos estructuras de control.

    5.2. WHILE yUNTIL

    Tambin es posible ejecutar bloques de rdenes de forma iterativa dependiendo de unacondi- cin. La comprobacin puede ser al principio o al final (whileountilrespectivamente). Lasintaxis es:

    hile + exresiKn 5 # ientras la exresiKn sea cierta do

    done

    until + exresiKn 5 # ientras la exresiKn sea >alsa do

    done

    Un ejemplo del funcionamiento de ambos sera:

    # uestra todos los armetroshile + ! -' $) 5do

    done

    echo (armetro9 $)

    shi>t

    # l si%uiente tambiLn muestra todos losarmetros until + -' $) 5do

  • 7/26/2019 Shell Script Guion

    17/48

    doneecho $)shi>t

  • 7/26/2019 Shell Script Guion

    18/48

    En el apartado Ejemplos de guiones shell se pueden encontrar otros ejemplos del uso de estasdos estructuras de control.

    5.3. FOR

    Con la ordenforse ejecutan bloques de rdenes, permitiendo que en cada iteracin una deter-minada variable tome un valor distinto. La sintaxis es la siguiente:

    >or var in listado

    $var

    done

    Por ejemplo:

    >or i in ) . Odo

    done

    echo i navorito es $i# D$i valdrPa ) en la rimera iteraciKn, . en# la se%unda & O en la terceraE

    5.4. SELECT

    La sintaxis de la ordenselectes:

    select name + in ord 5 do

    done

    list

    selectgenera una lista de items al expandir la lista word, presentando en la pantalla estalista de items precedidos cada uno de un nmero. A continuacin se presenta un promptpidiendo que se introduzca una de las entradas. Y se lee de la entrada estndar la opcin elegida.Si la respuesta dada es uno de los nmeros de la lista presentada, entonces la variable nametoma el valor de esa opcin, y se ejecuta con ella la lista de rdenes indicada. Si la respuesta es

    vaca, se vuelve a presentar la lista, y si es EOF se finaliza. Adems el nmero de opcinseleccionada se almacena en la variableREPLY.La lista de rdenes se ejecuta despus de cada seleccin, mientras no se termine, bien con

    break, bien con EOF. El valor de salida deselectser igual a valor de la ltima orden ejecutada.

  • 7/26/2019 Shell Script Guion

    19/48

    Un ejemplo sera el siguiente:

    select resuesta in "Qer contenido directorio actual" "Salir"

    do

    echo 8a seleccionado la ociKn9$resuesta case $R(A in)E ls 0E breaTesac

    done

    En pantalla aparecera:

    )E Qer contenido directorio actual

    0E Salir#@

  • 7/26/2019 Shell Script Guion

    20/48

    Si se selecciona la primera opcin, 1, se mostrara el mensaje: Ha seleccionado la opcin: Vercontenido directorio actual, y se ejecutara la ordenlsen el directorio actual, y volvera a pedir lasiguiente eleccin.

    Si por el contrario se pulsase un 2,seleccionandola segunda opcin, aparecera el mensaje:Ha seleccionado la opcin:Salir, y saldra delselect.

    5.5. BREAK y CONTINUE

    Las rdenesbreakycontinuesirven para interrumpir la ejecucin secuencial del cuerpo delbucle.

    breaktransfiere el control a la orden que sigue adone, haciendo que el bucle termine antes detiempo.continuetransfiereel control adone,haciendoque se evale de nuevo lacondicin,

    prosiguiendo el bucle.

    En ambos casos, las rdenes del cuerpo del bucle siguientes a estas sentencias, no se ejecutan.Lo normal es que formen parte de una sentencia condicional, comoif.Un par de ejemplos de su uso es:

    # uestra todos los armetros, si encuentra una ">">inali'a hile + $# -%t 5do

    i> + $) = ">" 5then

    breaT>i

    done

    echo (armetro9 $)shi>t

    # uestra todos los armetros, si encuentra una ">"# se lo salta & contin + $) = ">" 5then

    shi>t

    continue

    done

    >iecho (armetro9 $)shi>t

  • 7/26/2019 Shell Script Guion

    21/48

    6. Generacin de nombres de ficheros

    Cuando se le indica al shell el nombre de un fichero algunos caracteres tienen un significadoespecial. Estos caracteres son interpretados por el shell antes de proceder a ejecutar lo que se leha indicado. Son los siguientes caracteres:

    ? : cualquier carcter excepto el .inicial.

    * : 0..n caracteres (excepto el . inicial).

    [ ]: clase de caracteres. Cualquier carcter de esa clase.

    [! ]: clase de caracteres negada. Todos los caracteres excepto los de la clase.

    [U]: niega la expresin que le sigue.

    { } : contiene varias expresiones separadas por comas y corresponde a cualquiera de ellas.

    7. Entrada/salida estndar yredireccin

    La filosofa de UNIX/Linux es en extremo modular. Se prefieren las herramientas pequeascon tareas puntuales a las meta-herramientas que realizan todo. Para hacer el modelo completoes necesario proveer el medio para ensamblar estas herramientas en estructuras ms complejas.Esto se realiza por medio del redireccionamiento de las entradas y las salidas.Todos los programas tienen por defecto unaentrada estndar(teclado) y dos salidas: la

    salida estndar(pantalla) y lasalida de error(pantalla). En ellos se puede sustituir la entrada,salida y error por otro dispositivo. Con esto se consigue que los datos de entrada para eseprograma se lean de un archivo, y los de salida (estndar o error) vayan a otro archivo.Esas entrada, salida y error estndar se asocian a los programas mediante tres ficheros con los

    cuales se comunican con otros procesos y con el usuario. Estos tres ficheros son:

    stdin: entrada estndar, a travs de este descriptor de fichero los programas reciben datosde entrada.Normalmentestdinest asociado a la entrada de la terminal en la que estcorriendo el programa, es decir, alteclado. Cada descriptor de fichero tiene asignado unnmero con el cual podemos referirnos a l dentro de un script, en el caso destdines el 0.OJO! dentro de un programa en C no es lo mismo usarstdinque el descriptor 0.

    stdout: salida estndar, es el descriptor de fichero en el que se escriben los mensajes que

    imprime un programa. Normalmente estos mensajes aparecen en la terminal para que loslea el usuario. Su descriptor de fichero es el nmero 1.

    stderr: salida de error, es el descriptor de fichero al que se escriben los mensajes de errorque imprime el programa. Normalmente coincide constdout. Tiene como descriptor defichero el nmero 2.

  • 7/26/2019 Shell Script Guion

    22/48

    Estos tres descriptores de fichero puedenredireccionarse,consiguiendo comunicar unosproce- sos con otros, de forma que trabajen como una unidad, haciendo cada uno una tareaespecializada, o simplemente almacenando los datos de salida en un fichero determinado, orecibiendo los da- tos de entrada de un fichero concreto. Hay varios operadores pararedireccionar la entrada y las salidas de un programa de distintas maneras:

    > : redireccionastdouta un fichero, si el fichero existe lo sobrescribe:

    ho G usuariostxt less usuariostxt

    >> : redireccionastdouta un fichero, si el fichero existe aade los datos al final del mismo.

    2 > : redirecciona la salida de error al fichero que se indique:

    >ind / -t&e d -exec cat :; 0Gerrorestxt

    2 >> : la misma idea que el anterior, pero si el fichero ya existe, los datos se aaden al finaldel mismo, no borrando el contenido que ya tiene.

    n>&m: redirecciona el descriptor de fichero n al descriptor de fichero m, en caso de que nse omita, se sobrentiende un 1 (stdout):

    $ cat >ile directorio Gsalidatxt 0GH)# Redirecciona stderr a stdout, & Lsta al >ichero salidatxt

    < : lee la entrada estndar de un fichero:

    $ %re cadena J >icherotxt# busca "cadena" dentro de un >ichero

    | : redirecciona la salida de una orden a la entrada de otra orden: (vase el apartado de Tu-beras o filtros).

    ho I %re ilar

    8. Tuberas oFiltros

    En la lnea de rdenes la integracin entre diferentes programas se realiza mediante la

    interco- nexin de las entradas y salidas a travs de pipes o tuberas.Una tubera o pipe es una combinacin de varias rdenes que se ejecutan simultneamente,

    donde el resultado de la primera se enva a la entrada de la siguiente. Es como si se hiciese unaredireccin de la salida estndar de la primera orden, dirigida hacia la entrada estndar de lasegunda. Esta tarea se realiza por medio del carcter barra vertical|.Por ejemplo si se quieren ver, poco a poco, todos los archivos que hay en el directorio/usr/bin,

    se ejecuta lo siguiente:

  • 7/26/2019 Shell Script Guion

    23/48

    $ ls /usr/bin I more

    De este modo, la salida del programals(listado de todos los archivos del directorio/usr/bin)ir al programamore(modo paginado, es decir, muestra una pantalla y espera a que pulsemosuna tecla para mostrar la siguiente).Dentro de esta estructura se han construido una serie de programas conocidos como filtros

    los cuales realizan procesos bsicos sobre textos, son los siguientes:

    Filtros Funcinsort fichero Ordena las lneas de un texto.

    ls| sort # Ordena las lneas obtenidas de la orden lscut Corta secciones de una lnea

    cut -cn1-n2 #Corta desde el carcter n1 a n2cut -fn1-n2 -dX #Corta del campo n1 al n2, donde X es el delimitador

    grep Busca en la entrada que se le especifica lneas que concuerden o coincidancon el patrn dado.grep [-inv] patrn fichero # i ignora maysculas, n con nolnea, v inversogrep -q patrn fichero # verifica si encuentra el patrn o no, sin mostrar# las lneas que coinciden.

    od Convierte archivos a forma octal u otras.paste Une lneas de diferentes archivos.tac Concatena e imprime archivos invertidos.tee Lee la entrada estndar y escribe en la salida estndar y en los ficheros

    que se le indicanorden 1| tee fichero| orden2

    #recibe los resultados de orden1, los escribe en fichero y los pasa a orden2tr Traduce o borra caracteres.

    tr c1 c2 # traduce el carcter c1 por el c2tr -s c # traduce 1 ms apariciones de c por una sola aparicinEsta orden es muy til para aplicar antes de cut.

    uniq Elimina lneas repetidas.cat bd.txt| uniq #Elimina lneas repetidas de bd.txt

    wc [-wlc] Cuenta bytes, palabras y lneas.

    A continuacin se muestran algunos ejemplos del uso de estos programas junto con las tube-ras.

    La siguiente orden cuenta cuantos ficheros hay en el directorio actual:

    $ ls I c -l

    Esta orden muestra el nmero de directorios que hay en el directorio actual:

    $ ls -l I %re Ud I c -l

  • 7/26/2019 Shell Script Guion

    24/48

    Usando las rdeneswho,sort,uniqycutpodemos saber qu usuarios estn trabajando en elsistema en este momento, el listado se muestra ordenado:

    $ ho I cut ->) -d " "I sort I uniq

    La siguiente orden elimina todos los espacios en blanco del fichero basura.txt, lo guardaen otro fichero llamadobasura.sinblancos,y lo muestra por pantalla:

    $ cat basuratxt I tr -s " " I tee basurasinblancos

    Esta ltima orden obtiene el identificador de todos los procesos ejecutados por el usuariopilar, y los muestra en una nica lnea:

    $ s aux I%re Uilar Itr -s " " Icut ->0 -d " " Itr "n" " "

    Algunos filtros han llegado a ser tan complejos que son en s un lenguaje de procesamientode texto, de bsqueda de patrones, de construccin de scripts, y muchas otras posibilidades.Entre ellos podemos mencionar herramientas tradicionales en UNIX/Linux comoawkysedyotras ms modernas comoPerl.

    9. rdenes internas deBash

    Una orden interna del shell es una orden que el intrprete implementa y que ejecuta sinllamar a programas externos. Por ejemplo,echoes una orden interna de bash y cuando se llama

    desde un script no se ejecuta el fichero/bin/echo. Algunos de las rdenes internas ms utilizadasson:

    echo: enva una cadena a la salida estndar, normalmente la consola o una tubera. Porejem- plo:

    echo l valor de la variable es $auxvar

    read: lee una cadena de la entrada estndar y la asigna a una variable, permitiendo obtenerentrada de datos por teclado en la ejecucin de un guin shell:

    echo -n "Mntrodu'ca un valor ara var)9" read var)echo "var) = $var)"

    La ordenreadpuede leer varias variables a la vez. Tambin se puede combinar el uso dereadconecho, para mostrar un prompt que indique que es lo que se est pidiendo. Hay unaserie de caracteres especiales para usar enechoy que permiten posicionar el cursor en unsitio determinado:

  • 7/26/2019 Shell Script Guion

    25/48

    \b:retrocede una posicin (sin borrar)

    \f: alimentacin de pgina

    \n:salto de lnea \t:tabulador

    Para queechoreconozca estos caracteres es necesario utilizar la opcin -e y utilizarcomillas dobles:

    $ echo -e "8ola t VcKmo ests@"hola como ests

    cd: cambia de directorio

    pwd: devuelve el nombre del directorio actual, equivale a leer el valor de la variable $PWD.pushd/popd/dirs: estas rdenes son muy tiles cuando un script tiene que navegar porun rbol de directorios:

    pushd: apila un directorio en la pila de directorios.

    popd: lo desapila y cambia a ese directorio.

    dirs: muestra el contenido de la pila.

    let arg[arg]:cada arg es una expresin aritmtica a ser evaluada:

    $ let a=$bBO

    Si el ltimo arg se evala a 0, let devuelve 1; si no, devuelve 0.

    test: permite evaluar si una expresin es verdadera o falsa, vase el apartado La ordentest.

    export: hace que el valor de una variable est disponible para todos los procesos hijos delshell.

    [.|source]nombre_fichero argumentos: lee y ejecuta rdenes desde nombre_fichero en el entor-no actual del shell y devuelve el estado de salida de la ltima orden ejecutada desde nom-

    bre_fichero.Si se suministran argumentos, se convierten en los parmetros cuando seejecuta nombre_fichero. Cuando se ejecuta un guin shell precedindolo de . osource, nose crea un shell hijo para ejecutarlo, por lo que cualquier modificacin en las variables deentorno permanece al finalizar la ejecucin, as como las nuevas variables creadas.

    exit: finaliza la ejecucin del guin, recibe como argumento un entero que ser el valor deretorno. Este valor lo recoger el proceso que ha llamado al guin shell.

    fg: reanuda la ejecucin de un proceso parado, o bien devuelve un proceso que estabaejecu- tndose en segundo plano al primer plano.

  • 7/26/2019 Shell Script Guion

    26/48

    bg: lleva a segundo plano un proceso de primer plano o bien un proceso suspendido.

    wait: detiene la ejecucin hasta que los procesos que hay en segundo plano terminan.

    trueyfalse: devuelven 0 y 1 siempre, respectivamente.

    Nota: El valor 0 se corresponde contrue, y cualquier valor distinto de 0 confalse.

    10. Evaluacinaritmtica

    El shell permite que se evalen expresiones aritmticas, bajo ciertas circunstancias. La evalua-cin se hace con enteros largos sin comprobacin de desbordamiento, aunque la divisin por 0 seatrapa y se seala como un error. La lista siguiente de operadores se agrupa en niveles de opera-dores de igual precedencia, se listan en orden de precedencia decreciente.

    -,+ Menos y ms unariosW Negacin lgica y de bits** Exponenciacin*,/,% Multiplicacin, divisin, resto+, - Adicin, sustraccin Desplazamientos de bits a izquierda y derecha= , Comparacin==,!= Igualdad y desigualdad& Y de bits (AND)U O exclusivo de bits (XOR)| O inclusivo de bits (OR)&& Y lgico (AND)|| O lgico (OR)expre?expre:expre Evaluacin condicional=, +=, -=, *=,/=,%=,

    &=,U=,|==

    Asignacin: simple, despus de la suma, de la resta,de la multiplicacin, de la divisin, del resto,del AND bit a bit, del XOR bit a bit, del OR bit a bit,del desplazamiento a la izquierda bit a bity del desplazamiento a la derecha bit a bit.

    Por ejemplo, la siguiente orden muestra en pantalla el valor 64

    $ echo $DD0XEE

    Se permite que las variables del shell acten como operandos: se realiza la expansin de pa-rmetro antes de la evaluacin de la expresin. El valor de un parmetro se fuerza a un enterolargo dentro de una expresin. Una variable no necesita tener activado su atributo de entero paraemplearse en una expresin.

  • 7/26/2019 Shell Script Guion

    27/48

    Las constantes con un 0 inicial se interpretan como nmeros octales. Un 0x 0X inicial denotaun nmero en hexadecimal. De otro modo, los nmeros toman la forma[base#]n,donde base esun nmero en base 10 entre 2 y 64 que representa la base aritmtica, y n es un nmero en esa

    base. Si base se omite, entonces se emplea la base 10. Por ejemplo:

    $ let a=X#)B)$ echo el valor de a es $a

    l valor de a es O

    Los operadores se evalan en orden de precedencia. Las subexpresiones entre parntesis seevalan primero y pueden sustituir a las reglas de precedencia anteriores.Existen tres maneras de realizar operacionesaritmticas:

    1.Conlet lista_expresiones, como se ha dicho anteriormente, se pueden evaluar las expresionesaritmticas dadas como argumentos. Es interesante destacar que esta orden no es estndar,

    sino que es especfico delbash. A continuacin se muestra un ejemplo de su uso:

    $ let a=XBO$ echo l resultado de la suma es $al resultado de la suma es9 ).

    $ let b=OY?$ echo l resto de la divisiKn es9 $bl resto de la divisiKn es9 0

    $ let c=0#))I0#)

    $ echo l valor de c es $cl valor de c es O

    2.La ordenexprsirve para evaluar expresiones aritmticas. Puede incluir los siguientes opera-dores:\(,\),\*,\\,\+,\-,donde el carcter\se introduce para quitar elsignificadoespecial que pueda tener el carcter siguiente. Por ejemplo:

    $ exr ) D ? B 0 EO

    $ i=Fexr $i - )F #restar ) a la variable i

    3.Mediante$(( expresin ))tambin se pueden evaluar expresiones. Varios ejemplos de su usoseran:

    $ echo l resultado de la suma es $DDXBOEE l resultado de la suma es9 ).

  • 7/26/2019 Shell Script Guion

    28/48

    $ echo l resto de la divisiKn es9 $DDOY?EE l resto de la divisiKn es9 0

    $ echo l valor es $DD0#))I0#)EEl valor de c es O

    11. La ordentest

    testes una orden que permite evaluar si una expresin es verdadera o falsa. Los tests no slooperan sobre los valores de las variables, tambin permiten conocer, por ejemplo, laspropiedades de un fichero.Principalmente se usan en la estructuraif/then/else/fipara determinar qu parte del script se va

    a ejecutar. Unifpuede evaluar, adems de untest, otras expresiones, como una lista de rdenes

    (usando su valor de retorno), una variable o una expresinaritmtica, bsicamentecualquierorden que devuelva un cdigo en$?.La sintaxis detestpuede ser una de las dos que se muestran a continuacin:

    test exresiKn+ exresiKn 5

    OJO! Los espacios en blanco entre la expresin y los corchetes sonnecesarios. La expresin puede incluir operadores de comparacin como lossiguientes:

    Paranmeros:arg1 OP arg2, donde OP puede ser uno de los siguientes:

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

    Es importante destacar que en las comparaciones con nmeros si utilizamos una variabley no est definida, saldr un mensaje de error. El siguiente ejemplo, al no estar la variablee definida, mostrar un mensaje de error indicando que se ha encontrado un operador

    inesperado.

    i> + $e -eq ) 5then

    echo Qale )else

    echo No vale )>i

  • 7/26/2019 Shell Script Guion

    29/48

    Por el contrario, en el siguiente ejemplo, a la variable e se le asigna un valor si no estdefinida, por lo que s funcionara:

    i> + $:e=; -eq ) 5then

    echo Qale )else

    echo No vale )>i

    Paracaracteres alfabticosocadenas:

    -z cadena Verdad si la longitud de cadena es cero.

    -n cadenacadena

    Verdad si la longitud de cadena no es cero.

    cadena1== cadena2 Verdad si las cadenas son iguales. Se puede emplear=en vez de==.

    cadena1 != cadena2 Verdad si las cadenas no son iguales.cadena1< cadena2 Verdad si cadena1 se ordenalexicogrficamenteantes

    de cadena2 en la localizacin en curso.cadena1> cadena2 Verdad si cadena1 se clasificalexicogrficamentedespus

    de cadena2 en la localizacin en curso.

    En expresin se pueden incluiroperaciones conficheros,entre otras:

    -e fichero El fichero existe.-r fichero El fichero existe y tengo permiso de lectura.-w fichero El fichero existe y tengo permiso de escritura.-x fichero El fichero existe y tengo permiso de ejecucin.-f fichero El fichero existe y es regular.-s fichero El fichero existe y es de tamao mayor a cero.-d fichero El fichero existe y es un directorio.

    Adems se pueden incluiroperadores lgicosyparntesis:

    -o OR-a AND! NOT\( Parntesis izquierdo\) Parntesis derecho

  • 7/26/2019 Shell Script Guion

    30/48

    11.1. Ejemplos de uso

    Uno de los usos ms comunes de la variable $#, es validar el nmero de argumentos

    necesarios en un programa shell. Por ejemplo:

    i> test $# -ne 0then

    echo "se necesitan dos ar%umentos"exit

    >i

    El siguiente ejemplo comprueba el valor del primer parmetro posicional. Si es un fichero (-f) se visualiza su contenido; sino, entonces se comprueba si es un directorio y si es as cambia aldirectorio y muestra su contenido. En otro caso,echomuestra un mensaje de error.

    i> test -> "$)" # V es un >ichero @then

    more $)eli> test -d "$)" # V es un directorio @then

    Dcd $)ls -lImoreEelse # no es ni >ichero ni directorio

    echo "$) no es >ichero ni directorio">i

    Comparando dos cadenas:

    #! /bin/bashS)=*cadena*S0=*adena*i> + $S)!=$S0 5then

    echo "S)D*$S)*E no es i%ual aS0D*$S0*E" >ii> + $S)=$S) 5then

    echo "S)D*$S)*E es i%ual a

    S)D*$S)*E" >i

    En determinadas versiones, esto no es buena idea, porque si$S1o$S2son vacos, aparecerun error sintctico. En este caso, es mejor:x$)=x$0oZ$)[=Z$0[.

  • 7/26/2019 Shell Script Guion

    31/48

    12. rdenes simples, listas de rdenes y rdenescompuestas

    12.1. rdenes simples

    Una orden simple es una secuencia de asignaciones opcionales de variables seguida por pala-

    bras separadas por blancos y redirecciones, y terminadas por un operador de control. La primerapalabra especifica la orden a ser ejecutada. Las palabras restantes se pasan como argumentos ala orden pedida. Por ejemplo, si tenemos un shell script llamadoprograma, podemos ejecutar lasiguiente orden:

    $ a=\ ro%rama

    La secuencia de ejecucin que se sigue es: se asigna el valor a la variablea, que se exporta aprograma, i.e.,programava a utilizar la variableacon el valor 9.

    El valor devuelto de una orden simple es su estado de salida, 128+n si la orden haterminado

    debido a la seal n.

    Unoperador de controles uno de los siguientes smbolos:& && ; ;; ( ) |

    12.2. Listas de rdenes

    Una lista es una secuencia de una o ms rdenes separadas por uno de los operadores;,&,&&, o||,y terminada opcionalmente por uno de;,&, o.De estos operadores de listas, && y|| tienen igual precedencia, seguidos por ; y &, que tienen

    igual precedencia.Si una orden se termina mediante el operador de control &, el shell ejecuta la orden en

    segundo plano en un subshell. El shell no espera a que la orden acabe, y el estado devuelto es 0.

    Las rdenes separadas por un ; se ejecutan secuencialmente; el shell espera que cada ordentermine. El estado devuelto es el estado de salida de la ltima orden ejecutada.Los operadores de control && y|| denotan listasY(AND) yO(OR) respectivamente. Una lista

    Ytiene la forma:

    orden) HH orden0

    orden2se ejecuta si y slo siorden1devuelve un estado de salida 0.Una listaOtiene la forma:

    orden) II orden0

    orden2se ejecuta si y slo siorden1devuelve un estado de salida distinto de 0.El estado de salida de las listasYyOes el de la ltima orden ejecutada en la lista.Dos ejemplos del funcionamiento de estas listas de rdenes son:

    test -e racc II echo l >ichero noexiste test -e racc HH echo l >icherosP existe

  • 7/26/2019 Shell Script Guion

    32/48

    La ordentest -e ficherodevuelve verdad si el fichero existe. Cuando no existe devuelve un 1, yla listaOtendra efecto, pero no laY. Cuando el fichero existe, devuelve 0, y la listaYtendraefecto, pero no laO.Otros ejemplos de uso son:

    slee ) II echo 8ola # echo no saca nada enantalla slee ) HH echo 8ola # echo muestra enantalla 8ola

    Un ejemplo de lista de rdenes encadenadas con ; es:

    ls -l cat racc date

    Primero ejecuta la ordenls -l, a continuacin muestra en pantalla el fichero prac.c (cat prac.c),y por ltimo muestra la fecha (date).El siguiente ejemplo muestra el uso del operador de control & en una lista:

    ls -l H cat racc H date H

    En este caso, ejecuta las tres rdenes en segundo plano.

    12.3. rdenes compuestas

    Las rdenes se pueden agrupar formando rdenes compuestas:

    { c1 ; ... ; cn; }: las n rdenes se ejecutan simplemente en el entorno del shell en curso, sincrear un shell nuevo. Esto se conocen como unaorden de grupo.

    ( c1 ; ... ; cn ): las n rdenes se ejecutan en un nuevo shell hijo, se hace unfork.

    OJO! Es necesario dejar los espacios en blanco entre las rdenes y las llaves o los parntesis.Para ver de forma clara la diferencia entre estas dos opciones lo mejor es estudiar qu sucede

    con el siguiente ejemplo:

    Ejemplo#!/bin/bashcd/usr{ cd bin; ls; }pwd

    #!/bin/bashcd/usr( cd bin; ls )pwd

    Resultado1.- Entrar al directorio/usr2.- Listado del directorio/usr/bin

    1.- Entrar al directorio/usr2.- Listado del directorio/usr/bin

    Ambos grupos de rdenes se utilizan para procesar la salida de varios procesos como una

    sola. Por ejemplo:

    $ D echo bb echo ca echo aa echo a E Isort aaabbca

  • 7/26/2019 Shell Script Guion

    33/48

    13. Funciones

    Como en casi todo lenguaje deprogramacin,se pueden utilizar funciones para agrupartrozos de cdigo de una manera ms lgica, o practicar la recursin.Declarar una funcin es slo cuestin de escribir:

    >unction miC>unc: miCcKdi%o ;

    Llamar a la funcin es como llamar a otro programa, slo hay que escribir su nombre.

    13.1. Ejemplo de funciones

    #! /bin/bash

    # Se de>ine la >unciKn

    salir >unction salir :exit;

    # Se de>ine la >unciKnhola >unction hola :

    echo ]8ola!;

    hola # Se llama a la >unciKnhola salir # Se llama a la

    >unciKn salir echo eteteTenga en cuenta que una funcin no necesita ser declarada en un orden especfico.Cuando ejecute el script se dar cuenta de que: primero se llama a la funcin hola, luego ala

    funcinsalir, y el programa nunca llega a la lnea echo petete.

    13.2. Ejemplo de funciones con parmetros

    #!/bin/bash>unction salir:

    exit;

    >unction e :echo $)

    ;

    Este script es casi idntico al anterior. La diferencia principal es la funcin e, que imprimeel primer argumento que recibe. Los argumentos, dentro de las funciones, son tratados de lamisma manera que los argumentos suministrados al script. (Vase el apartado Variables y

    parmetros).

    14. Depuracin

    Una buena idea para depurar los programas es la opcin-xen la primera lnea:

  • 7/26/2019 Shell Script Guion

    34/48

    #!/bin/bash -x

    Como consecuencia, durante la ejecucin se va mostrando cada lnea del guin despus desustituir las variables por su valor, pero antes de ejecutarla.Otra posibilidad es utilizar la opcin-vque muestra cada lnea como aparece en el script

    (tal como est en el fichero), antes de ejecutarla:#!/bin/bash -v

    Otra opcin es llamar al programa usando el ejecutable bash. Por ejemplo, si nuestroprograma se llamaprac1, se podra invocar como:

    $ bash -xrac) K

    $ bash -v rac)

    Ambas opciones pueden ser utilizadas de forma conjunta:

    #!/bin/bash-xv K$ bash -xv rac)

    15. Ejemplos de guionesshell

    1.El siguiente programallamar, muestra su nmero PID y despus llama a un programalla- madonum, a travs de la orden (.). Cuandonumtermina su ejecucin, la orden (.)devuelve el control al programa que lo llam, el cual muestra el mensaje.

    Guinllamar

    echo "$ (M^ = $$" numecho "se ejecuta esta lPnea"

    Guin numecho "num (M^ = $$"

    Como vemos, la orden (.) ejecuta un proceso como parte del proceso que se est ejecutando(llamarynumtienen el mismo nmero de proceso). Cuando el nuevo programa termina laejecucin, el proceso actual contina ejecutando el programa original. El programanumno

    necesita permiso de ejecucin.2.Programa que copia un fichero en otro, controlando que el nmero de argumento sea exac-tamente dos.

    i> + $# != 0 5then

    echo "utilice9 coia +desde5+hasta5" exit )

    >idesde=$)hasta=$0

    i> + -> "$hasta" 5then

    echo "$hasta &a existe, V desea sobreescribirloDs/nE@" read resuesta

    i> + "$resuesta" != "s" 5then

  • 7/26/2019 Shell Script Guion

    35/48

    echo "$desde no coiado"exit

    >i>ic $desde $hasta

    3.Programa que imprime el pantalla el contenido de un fichero de datos, o el contenido detodos los ficheros de un directorio.

    i> test -> "$)"then

    r $)Ilesseli> test -d "$)"then

    else

    >i

    cd $) r Iless

    echo "$) no es un >ichero ni un directorio"

  • 7/26/2019 Shell Script Guion

    36/48

    4.Programa que evala la extensin de un fichero. Si sta se corresponde con txt, copia elfichero al directorioW/coias. Si es otra la extensin o no hace nada o presenta unmensaje.

    case $) intxtE

    c $) W/coias/$)

    doc I baTE# 7an sKlo como ejemlo de otras extensiones

    E

    esac

    echo "$) extensiKn desconocida"

  • 7/26/2019 Shell Script Guion

    37/48

    5.Programa que borra con confirmacin todos los ficheros indicados comoargumentos en la lnea de rdenes.

    #!/bin/bashhile test "$)" != "" dorm -i $) shi>t

    done

    6.Programa que hace mltiples copias de ficheros a pares. En cada iteracindesaparecen el primer y segundo argumento.

    hile test "$0"!= "" do

    echo $) $0 c#$) $0 shi>t shi>t

    donei> test "$)"!= "" then

    echo "$9 el n

  • 7/26/2019 Shell Script Guion

    38/48

    8. Ejemplo de un men:

    hile truedo

    clear

    echo "

    read i

    Qer directorio actual+)5oiar >icheros+05ditar >icheros+.5Mmrimir >ichero+15Salir del men

  • 7/26/2019 Shell Script Guion

    39/48

    case $i in)E ls -lImore read '

    0E echo "Mntrodu'ca +desde5 +hasta5" read

    x &c $x $&read x

    .E echo "VNombre de >ichero a editar@" readxvi $x

    1E echo "VNombre de >ichero a imrimir@" readx

    lr $x

    ?E clear breaT

    esacdone

    Este mismo ejercicio podra ser resuelto utilizando la ordenselect:

    select ocion in "Qer directorio actual" "oiar >icheros" "ditar >icheros"

    "Mmrimir >ichero" "Salir del men

  • 7/26/2019 Shell Script Guion

    40/48

    rint> "Mntrodu'ca un n

  • 7/26/2019 Shell Script Guion

    41/48

    12. Escribir un guin shell llamadoverque para cada argumento que reciba realice una de lassiguientes operaciones:

    si es un directorio ha de listar los ficheros que contiene,

    si es un fichero regular lo tiene que mostrar por pantalla,en otro caso, que indique que no es ni un fichero ni un directorio.

    #!/bin/bash>or >ich in $do

    i> + -d $>ich 5then

    echo "usando ls"ls $>ich

    eli> + -> $>ich 5

    thencat $>ich

    elseecho $>ich no es ni un >ichero ni un directorio

    >idone

    13.Escribir un guin shell que soliciteconfirmacinsi va a sobrescribir un fichero cuando seuse la ordencp.

    #!/bin/bash

    i> + -> $0 5then

    echo "$0 existe V_uieres sobreescribirlo@Ds/nE" read sni> + $sn = "N" -o $sn = "n" 5then

    exit >i

    >ic $) $0

    14. Supongamos que queremos cambiar el sufijo de todos los archivos *.tex a .latex. Haciendomv *.tex *.latexno funciona, (por qu?), pero s con un guin shell.

    #!/bin/bash>or > in texdo

    done

    nuevo=$Dbasename $> texElatexmv $> $nuevo

    15.Hacer un programa que ponga el atributo de ejecutable a los archivos pasados como argu-mento.

    >or >ich in $3do

    i> test -> $>ichthen

  • 7/26/2019 Shell Script Guion

    42/48

    >idone

    chmod uBx $>ich

  • 7/26/2019 Shell Script Guion

    43/48

    16. Ejerciciospropuestos

    1.Haga un shell script llamadopriultque devuelva los argumentos primero y ltimo que

    se le han pasado. Si se llama con:

    riult hola quL tal ests

    debe responder:

    l rimer ar%umento es holal

  • 7/26/2019 Shell Script Guion

    44/48

    ? ) =?

    Mejore el shell script para que se verifique que slo se le ha pasado un argumento y queste es un nmero vlido entre 0 y 10.

    6.Haga un shell script llamadocuenta_tiposque devuelva el nmero de ficheros de cada tipoque hay en un directorio, as como los nombres de estos ficheros. Tendr un nicoargumento (opcional) que ser el directorio a explorar. Si se omite el directorio seconsiderarque se trata del directorio actual. Devolver 0 (xito) si se ha llamado de formacorrecta y 1 (error) en caso contrario. La salida ser de esta forma:

    Aa clasi>icaciKn de >icheros del directorio es9 8a& t >icheros de texto9 ), 0, t8a& dv >icheros de disositivo9 ), 0, dv8a& d directorios9 ), 0, d8a& e >icheros ejecutables9 ), 0, e

    (Pista: usar la ordenfile)

    7.Cree un shell script llamadoinstalaral que se le pasarn dos argumentos: fichero y directo-rio. El shell script debe copiar el fichero al directorio indicado. Adems debe modificar suspermisos de ejecucin de forma que est permitido al dueo y al grupo del fichero yprohibi- do al resto de usuarios. Antes de hacer la copia debe verificar los argumentospasados, si se tiene permiso para hacer la copia, si el fichero es de texto o ejecutable, etc.Devolver 0 (xito) si todo ha ido bien y 1 (error) en caso contrario.

    8. Cree un shell script llamadoinfosisque muestre la siguienteinformacin:

    Un saludo de bienvenida del tipo:8ola usuario uuu, est usted conectado en el terminal ttt

    donde uuu y ttt son, respectivamente, el nombre de usuario y el terminal desde elque se ejecuta la orden.

    La fecha y la hora actuales, usando para ello el ejercicio nmero

    3. Una lista con los usuarios conectados.

    Una lista de los procesos del usuario que se estn ejecutando en ese momento.

  • 7/26/2019 Shell Script Guion

    45/48

    9. Cree un guin shell llamadoinfouserque reciba un nico parmetro (el login de un usuario)y que muestre la siguiente informacin:

    Login.Nombre completo del usuario.

    Directorio home.

    Shell que utiliza.

    Una lnea que indique si el usuario est actualmente conectado o no.

    Procesos pertenecientes a dicho usuario. La informacin a mostrar para cada procesodebe ser el PID y la lnea de rdenes que dio lugar a la creacin de dicho proceso.

    El guin debecomprobar:

    Si las opciones y parmetros son correctos.Si el usuario que se pasa como parmetro existe o no.

    Adems, debe permitir las siguientes opciones:

    -p: slo muestra informacin de procesos.

    -u: muestra toda la informacin excepto la referente a los procesos.

    help:muestra informacin de ayuda (lo que hace el guin, su sintaxis y significadode opciones y parmetros).

    Los cdigos de retorno deben ser:

    0: xito.

    1: no se ha respetado la sintaxis de la orden.

    2: usuario no existe.

    Nota: parte de lainformacindel usuario se puede obtener delfichero/etc/passwd, en lassalas de prcticas ejecutando la ordenypcat passwd. Pueden ser de utilidad las rdenesgetoptsyfinger.

    10.Cree un shell script llamadobustr, al que se le pase como parmetro una cadena y una listade 0 a n nombres de fichero. El shell script debe devolvernos los nombres de los archivosque contienen en su interior la cadena especificada. Para evitar errores slo se har con losarchivos que sean regulares y sobre los que tengamos permiso de lectura. Por ejemplo:

    bustr cadena >ichero) >ichero0 >ichero .

    devolvera:

    Aa cadena "cadena" se ha encontrado en los si%uientes >icheros9>ichero0>ichero.

    Cmo podra llamar abustrpara que hiciera la bsqueda en todos los ficheros a partir deun directorio dado e incluyendo subdirectorios? Pistabustr cadena ....

    11. Construir un guin shell en Linux con la siguiente sintaxis

    di>>d +-i5 directorio) +directorio05

    Funcin: debe mirar todos los nombres de fichero contenidos en eldirectorio1y en eldirectorio2(a excepcin de los nombres de directorios) y mostrar las diferencias, es

  • 7/26/2019 Shell Script Guion

    46/48

    decir, mostrar el nombre de aquellos ficheros que aparecen en uno de los directoriospero no en el otro, indicando para cada uno de ellos el directorio en el que seencuentra.

    Parmetros:directorio1ydirectorio2: directorios entre los que se hace la comparacin. Sise omitedirectorio2(que es opcional) se entender que queremos comparardirectorio1con el directorio en el que nos encontremos al ejecutardiffd.Opciones:-i: invierte el funcionamiento dediffdhaciendo que muestre los nombres deaquellos ficheros que se encuentran en los dos directorios (es obvio que en este caso nohay que indicar el directorio en el que aparece el fichero, pues aparece en ambos).

    12.En RedHat se utiliza el formato de paquetesRPMque facilita la administracin de los mis-mos: instalacin, eliminacin,verificacinde integridad, dependencias, etc. El programa uti-lizado para llevar a cabo dicha administracin se llamarpm. Cree un guin shell llamadoestadopaquetesque reciba como parmetro un directorio y que, para cada uno de lospaque- tes que existan en ese directorio (si existen), indique su estado que puede ser uno delos 4 siguientes:

    No instalado

    InstaladoA actualizar (cuando la versin instalada del paquete es ms antigua que la que tiene elpaquete)A borrar? (cuando la versin instalada del paquete es ms reciente que la que tiene elpaquete).

    El directorio pasado como parmetro es opcional y, si no se indica, se asumir el directorioactual. Supondremos que el formato del nombre del fichero del paquete es:

    nombreaquete-versiKn-revisiKnarquitecturarm

    El nombre del paquete puede tener guiones por lo que habr que controlar esto. Un ejem-plo de paquete esman-pages-es-0.7a -1.noarch.rpm. No tendremos en cuenta los paquetes concdigo fuente, es decir, aquellos de extensin src.rpm.

    13.Hacer un guin shell llamadomirm que mueva aldirectorioW/borradoslosficheros(nun- ca directorios) que se le indiquen como parmetros. Este guin shell vieneacompaado por otro guin llamadolimpiezadque se debe ejecutar en segundo plano yque cada 10 segundos compruebe si tiene que borrar ficheros del directorioW/borradosen funcin del espacio ocupado en disco. Ambos guiones shell hacen uso de la variable deentornoMINLIBREque indica el mnimo espacio en disco que debe quedar. De tal manera

    que una condicin que de- ben cumplir ambos guiones es que, tras su ejecucin, el espaciolibre en disco (en bloques de1K) debe ser igual o superior aMINLIBRE. En el caso de que, para cumplir dicha condicin,haya que borrar ficheros deW/borrados, se seguir una polticaFIFO.

    Nota: basta con que ambos guiones funcionen para la particin en la que se encuentra eldirectorio personal del usuario.

    Adems, ambos guiones deben hacer uso del ficheroW/listaborradosque guardar,slo para cada fichero presente enW/borrados, su ruta de acceso original.

    Mejora: debe permitirse el borrado de ficheros con igual nombre.

    14.Como complemento del ejercicio anterior, hacer un guin shell llamadorecuperarque seuti- lizar para recuperar ficheros borrados. Si se le pasa un nico parmetro se entenderque se trata de un patrn y entonces mostrar todos los ficheros deW/borradosquecumplan dicho patrn. Si se le pasan dos parmetros, el primero se entender como antespero el se- gundo debe ser el nombre de un directorio y, en este caso, se recuperarn todoslos ficheros borrados que cumplan el patrn y se dejarn en el directorio indicado comosegundo par- metro.

  • 7/26/2019 Shell Script Guion

    47/48

    Adems, este guin debe implementar tambin la opcin -oque recuperartodos los ficheros que cumplany los copiar a su posicin original, segn lo indi-cado por el ficheroW/listaborrados. Si el directorio original ya no existe, debe crearsesiempre que se tenga permiso.

    Mejora: debe permitirse la recuperacin de ficheros con igual nombre.15.Cree un shell script llamadoagendaal que se le pasar un argumento (opcional), que ser

    el nombre de fichero que se usar para almacenar la informacin (si se omite el argumento,el fichero seragenda.dat, crendose en blanco si no existe). Cada lnea del fichero tendr elsiguiente formato:

    nombre9localidad9saldo9telL>ono

    Cuando se ejecute el shell script mostrar un prompt para poder introducir las distintas op-ciones disponibles:

    6`N^6 DMntrodu'ca ociKn *h* ara a&udaE GG

    Las opciones que debe soportar son:

    h: mostrar ayuda de todas las opciones.q: para salir de la agenda.

    l: listar el fichero de la agenda en columnas:

    ----------------- 6`N^6 -----------------------------Nombre Aocalidad Saldo 7elL>ono-------- ---------- ------- --------guan Rui' arta%ena ).1 \X2?OOX?

    gaime AKe' la%a \? \?01)1??6na artPne' adrid \1? \)1XO2\21

    on: ordenar la agenda por nombre ascendentemente. La ordenacin no se mostrar yquedar en el fichero. Para ver la ordenacin habr que ejecutarldespus.

    os: ordenar la agenda por saldo descendentemente (ojo!, numricamente). La ordena-cin no se mostrar y quedar en el fichero. Para ver la ordenacin habr que ejecutarldespus.

    a: aadir una lnea. Para ello el shell script debe preguntar por el nombre, localidad,saldo y telfono, comprobando que ninguno de los campos quede en blanco. Una vez

    introducidos todos los datos de una nueva lnea, debe aadirse al final del fichero dela agenda. Como mejora, antes de introducir la nueva lnea se puede comprobar queno existe ninguna otra con el mismo nombre de persona.

    b: borrar una lnea. Para ello el shell script debe preguntar el nombre exacto de la per-sona correspondiente. Una vez introducido ste se debe eliminar la lnea o lneas quetengan ese nombre exactamente (pueden ser varias si en el punto anterior se permitenlneas con el mismo nombre). Antes de proceder con el borrado debe pedir confirma-cin.

    17. Bibliografa

    Pgina de manual del intrprete de rdenes bash.

    Introduccin a la programacin de scripts de shell con Bash. Guillermo Ontan Ledesma

    Programacin en BASH - COMO de introduccin. Mike G. Traducido por GabrielRodrguezAlberich

  • 7/26/2019 Shell Script Guion

    48/48

    CURSO DE LINUX Versin 2.0. Gmez, Ahijado, Flores.