Programacion Shell Bash

  • Upload
    juanklz

  • View
    36

  • Download
    0

Embed Size (px)

Citation preview

  • 5/28/2018 Programacion Shell Bash

    1/64

    Programacin en SHELL( Bash )

    Que es una shell ?

    El shellde Unix o tambin shell, es el termino usado en informtica para referirse a un interprete decomandos. Los comandos que aportan los intrpretes, pueden usarse a modo de guin si se escribenen ficheros e!ecutables denominados shell-scripts, de este modo, cuando el usuario necesita haceruso de "arios comandos o combinados de comandos con herramientas, escribe en un fichero detexto marcado como e!ecutable, las operaciones que posteriormente, l#nea por l#nea, el intrpretetraducir al n$cleo para que las realice.%in ser un shellestrictamente un lengua!e de programacin, al proceso de crear scriptsde shellsele denomina programacin shello en ingls,shell programmingoshell scripting.Los usuarios de Unix& similares, pueden elegir entre distintos shells'programa que se deber#a

    e!ecutar cuando inician la sesin, bash, ash, csh, (sh, )sh, tcsh*.

    El trmino shelltambin hace referencia a un programa particular, tal como el Bourne shell, sh. ElBourne shellfue el shellusado en las primeras "ersiones de Unix& se con"irti en un estndar+todos los sistemas similares a Unixtienen al menos un shellcompatible con el Bourne shell. Elprograma Bourne shellse encuentra dentro de la !erarqu#a de archi"os de Unixen/bin/sh. Enalgunos sistemas, tal como BSD,/bin/shes un Bourne shell o un equi"alente, pero en otrossistemas como muchas distribuciones de Linux,/bin/shes un enlace simblico a un shellcompatible con ms caracter#sticas 'como Bash*. PS!"especifica su shellestndar como unsubcon!unto estricto del #orn shell.

    rimeros pasos

    Uno de los primeros pasos es saber que shell'interprete de comando estamos usando*.

    $ echo $SHELL/bin/bash

    Las "ariables por con"encin se utili(a en ma&$sculas & las forma de obtener el contenido de la"ariable o me!or dicho su "alor es poniendo el s#mbolo $.

    %i queremos saber la "ersin de nuestro interprete de comandos en este caso bashe!ecutamos el

    siguiente comando -

    $ echo $B%SH&'ES!4.1.5(1)-release

    ara conocer todos los interpretes de comandos que tenemos "eremos que se guardan dentro de unarchi"o llamado shells.

    $ cat /etc/shells/bin/csh/bin/sh

    /bin/ksh/bin/tcsh/bin/dash/bin/bash

  • 5/28/2018 Programacion Shell Bash

    2/64

    %i queremos cambiar nuestro shellpor defecto a bashe!ecutamos el siguiente comando & luego"ol"emos a loguearno para que tome la nue"a configuracin.

    $ chsh -s /bin/bash

    ane!o de comodines

    Los comodines de b$squeda son signos o s#mbolos que nos a&udarn a la hora de encontrar alg$narchi"o en nuestro ordenador. /onde mas lo podemos llegar a utili(ar es con el comando ls.

    $ ls /bin/bash

    0c tenemos una tabla con los distintos comodines & su explicacin.

    *omo+,n Descripcin

    ? Uno o slo un carcter.1 2ero o ms caracteres.

    3con!unto4 Uno los caracteres de conjunto.

    35con!unto4 Un carcter que no este en conjunto.

    E!emplo de usos -

    $ ls .txt

    En el e!emplo anterior me trae cualquier archi"o que tenga como extensin txt.

    $ ls /bin/l/bin/ln /bin/ls

    El tercer comod#n permite indicar un con!unto de caracteres que son "lidos. or e!emplo l0eno1encontrara el fichero less lesssecho less2ile less3e4 lesspipe ln loa+3e4s loginno traira liss. Esdecir como primer letra si o si la continuacin puede ser e, no o& luego como bien di!imos elcomod#n '1* representa cero o ms caracteres reali(a una distributi"a.

    $ ls /bin/l0eno1/bin/less /bin/lessecho /bin/lessfile /bin/lesskey /bin/lesspipe /bin/ln /bin/loadkeys /bin/login

    El comod #n tilde

    Este comod#n es 5que se utili(a para referirse al homede los usuarios, por e!emplo 5pabloserefiere a/home/pablo.

    $ ls -a 5pablo./ ../ .bash_logout .bash_profile .bashrc

    El comod #n lla"es

    Este comod#n a comparacin de los otros, no estudia el nombre de los ficheros existentes en discopara nada, simplemente expande una palabra por cada una de las cadenas de caracteres quecontiene, por e!emplo -

  • 5/28/2018 Programacion Shell Bash

    3/64

    $ echo c6ami7ontamina78oncamion cantaminaon con

    Lo que reali(a es una distribucin c-9ami-9on,c-9ontaminaon &c-9con, al poner 78lo que hace espoder formar la palabra cones decir como luego de la 7no ha& nada puede formar otra palabra con

    on.

    6eamos un e!emplo mas comple!o que a7ade mas lla"es -

    $ echo c6a6mi7nt8a7ose8rcaminar cantar coser

    %iempre combina c-9a& luego con 6mi7nt8luego cona & lar & por ultimo combinac-9ose-9r

    %e puede usar dos puntos '..* para hacer algo similar a lo que hacen los corchetes es decir indicar un rango.or e!emplo -

    $ echo l6a..:8la lb lc ld le lf lg lh li lj

    Las lla"es deben tener al menos dos cadenas, el siguiente e!emplo "emos que esto no sucede.

    $ echo ca6a8sacaa!sa

    2omodines extendidos

    Bashpermite usar un con!unto de comodines extendidos, pero para poder usarlos debemos de

    acti"ar la opcin ext_globde Bash.

    ara fi!ar estos "alores usamos el comandoshopt 'shell option*, si e!ecutamos el comandoshopt"eremos la lista de "ariables que podemos modificar.

    $ shoptautocd offcdable_"ars offcdspell offcheckhash offcheckjobs offcheck#insi$e oncmdhist oncompat%1 offcompat%& offcompat4' offdirspell offdotglob offeecfail offepand_aliases onetdebug offetglob onetuote on

    failglob offforce_fignore onglobstar offgnu_errfmt off

  • 5/28/2018 Programacion Shell Bash

    4/64

    histappend onhistreedit offhist"erify offhostcomplete offhuponeit offinteracti"e_comments onlithist off

    login_shell offmail#arn offno_empty_cmd_completion offnocaseglob offnocasematch offnullglob off

    progcomp onprompt"ars onrestricted_shell offshift_"erbose offsourcepath on

    pg_echo off

    8odas estas "ariables son booleanas que contienen el "alor on9off, para acti"arlo usamos elcomandoshopt -s opcion& para desacti"arloshopt -u opcion.

    6emos en la tabla algunas de esa opciones con ma&or detalle de lo que hace -

    pcin Descripcin

    cdable:"ars ermite que cduse los "alores de las "ariables como nombres de directorios.

    cdspell ;gnora peque7os errores en los cambios de directorio con cd. %lo en la e!ecucininteracti"a.

    cmdhist

  • 5/28/2018 Programacion Shell Bash

    5/64

    E!emplo -

    $ export D*;/usr/share/+oc$ shopt -s c+able&8.txt$ ls carta?(0=->1).txtcarta'.tt carta1.tt carta&.tt carta%.tt carta4.tt carta5.tt carta,.tt carta.tt carta*.ttcarta+.tt

    %i queremos buscar los archi"os que solo tengan extensin *c, *h& *oreali(amos lo siguiente -

    $ touch e:emplo6c7h7o7cpp8.txt$ ls .0cho1ejemplo.c ejemplo.h ejemplo.o

    6emos que en el e!emplo anterior solamente me trae las extensiones que contengan solo un carcter'+*c, +*h& +*o*, el corchetes ,slo permite acepta un carcter. %i quiero traer los que tenganextensin *cppno se podr. En cambio con el siguiente e!emplo si podemos -

    $ touch e:emplo6c7h7o7cpp8.txt$ ls .@(cAoAhAcpp)ejemplo.c ejemplo.cpp ejemplo.h ejemplo.o

    2on elpipe'D* reali(a un or'o* que coincida con algunos de los patrones correspondientes lo queme permite a7adir patrones.

  • 5/28/2018 Programacion Shell Bash

    6/64

    El e!emplo anterior es equi"alente a -

    $ ls @(.cA.oA.hA.cpp)ejemplo.c ejemplo.cpp ejemplo.h ejemplo.o

    %i quiero listar lo que no sea con extensin +*c, +*o, +*h& +*cppreali(o la muestra con el patrn .

    $ ls (.cA.oA.hA.cpp)carta'.tt carta1.tt carta&.tt carta%.tt carta4.tt carta5.tt carta,.tt carta.tt carta*.ttcarta+.tt

    %i quiero borrar todos los archi"os excepto los que empie(an con papel0=->1.txt reali(o losiguiente -

    $ touch carta6=..>8.txt$ touch papel6=..>8.txt$ rm -< (papel?(0=->1)).txtcarta'.tt borrado

    carta1.tt borradocarta&.tt borradocarta%.tt borradocarta4.tt borradocarta5.tt borradocarta,.tt borradocarta.tt borradocarta*.tt borradocarta+.tt borrado

    2omandos internos de =ash

    =ash siempre busca los programas que e!ecutamos en los directorios indicados en la "ariable deentorno'!"#$, pero ha& ciertos comandos internos de bash que no corresponde a ning$n archi"odel disco, algunos de estos comandos son cd,chdir,alias,set oexport0 etc.

    ara saber los comandos que tenemos en bash e!ecutamos help.

    $ help$ help aliasalias alias 2-p3 2name2"alue3 ... 3 efine o muestra aliases.

    6alias7 sin argumentos muestra la lista de aliases en la forma reutili$able 6alias 89:;?@9?@9< causa ue se re"ise la siguiente palabra para sustituciCn de alias cuando se epande el alias.

    9pciones -p :uestra todos los aliases definidos en un formato reusable

    =stado de salida alias de"uel"e "erdadero a menos ue se de un 89:;

  • 5/28/2018 Programacion Shell Bash

    7/64

    2aracteres especiales & entrecomillado

    Los caracteres /,0, 1, 2, +, 3, 4, ,,, 5,6son e!emplos de caracteres especiales de =ash que &a hemos "istoen cap#tulos anteriores.

    Car7cter &escripci8n

    /irectorio home.

    F %ustitucin de comando.

    G 2omentario.

    H 6ariable.

    I roceso en bac)ground.

    + %eparador de directorios.

    1 2omod#n =a ncarcter.

    ? 2omod#n de un slo carcter.

    9 %epardor de directorios.

    ' Empe(ar un subshell.

    * 8erminar un subshell.

    J 2arcter de escape.

    K edirigir la entrada.

    M edirigir la salida.

    D ipe.

    3 Empie(a con!unto de caracteres comod#n.4 0caba con!unto de caracteres comod#n.

    N Empie(a un bloque de comando.

    O 0caba un bloque de comando.

    P Entrecomillado fuerte.

    Entrecomillado dbil.

    5 >o lgico de cdigo de terminacin.

    2aracteres de escape

    @tra forma de cambiar el significado de un carcter de escape es precederlo por 9, que es lo que se llama elcar7cter de escape.

    or e!emplo -

    $ echo C9F es una expresion cierta&E%F5 es una epresion cierta

    /onde hemos puesto el carcter de escape a los caracteres especiales para que =ash no los interprete.

    8ambin lo usamos para que poder usar los espacios a los nombres de ficheros, &a que el espacio esinterpretado por =ash como un separador de argumentos de la l#nea de comandos.

    $ echo GHola un+oI 9 e:emplo espacio.txt

  • 5/28/2018 Programacion Shell Bash

    8/64

    $ cat e:emplo espacio.txt

    Entrecomillar los entrecomilla+os

    odemos usar el carcter de escape para que no se interpreten los entrecomillados simples o dobles, es decir-

    $ echo IC9FI es una expresion cierta

    G&E%F5G es una epresion cierta

    $ echo JC9FJ es una expresion cierta7&E%F57 es una epresion cierta

    Kexto +e

  • 5/28/2018 Programacion Shell Bash

    9/64

    $ export ED!K;

  • 5/28/2018 Programacion Shell Bash

    10/64

    oashque comien(a por el texto escrito,>ashcompleta la palabra.

    W. %i ha& un directorio que comien(a por el nombre escrito,>ashcompleta el nombre de directorio

  • 5/28/2018 Programacion Shell Bash

    11/64

    seguido por una barra de separacin de nombres de directorios 9.

    X. %i ha& ms de una forma de completar la palabra el shell completa lo ms que puede & emite unpitido informado de que no la pudo terminar de completar.

    Y. 2uando>ashno puede completar una cadena 'por haber "arias posibles que empiecen igual*,podemos pulsar dos "eces el tabulador & se nos mostrar una lista con las posibilidades cadenascandidatas.

    La librer,a rea+line

    Esta librer#a permite editar l#neas de texto usando los modos emacs& %i. 0unque originalmente creada por>ash, actualmente la utili(a miles de comandos de U. Esto permite estandari(ar las combinaciones deteclas entre muchos comandos.

    Readlinese puede personali(ar usando ficheros de configuracin o bien asignado combinaciones de teclaspara la sesin.

    El fichero de configuracin

    8iene un archi"o global que debe ser colocado en

  • 5/28/2018 Programacion Shell Bash

    12/64

    este caso necesitamos usar una secuencia de escape para hacer que esta tecla llame a la funcin delete-char?dereadline.

    N Borra con la tecla DELGe05IO +elete-char

    readlinetiene una serie de "ariables, que aparecen documentadas !unto con las funciones de readline'que

    podemos consultar con la combinaciones de teclas Ctrl=x Ctrl=%*, las cuales podemos asignar un "alor en elfichero de configuracin de readlineconset.

    Una "ariable interesante de readlinees que al completar con tabulador distingan min$sculas de ma&$sculas.

    $ m3+ir 'i+eos$ c+ os aparecer -

    $ c+ 'i+eos/

    ara ello podemos a7adir la siguiente l#nea al fichero de configuracin de readline-

    N !gnora +i2erencias +e ma4usculas/minusculas alN completar con tabula+orset completion-ignore-case on

    0signacin de teclas de sesin

    %i lo que queremos es probar combinaciones de teclas que no queremos almacenar de forma permanentepodemos usar el comando bind, cu&a sintaxis es similar a la del fichero de configuracin, pero tenemos queencerrar cada asignacin entre comillas simples o dobles.

    $ bin+ GI*-x*-gIO +ump-2unctionsI

    %i queremos "er las asignaciones de teclas que ha& hechas a cada funcin de readline podemos usar elcomando -

    $ bin+ -P

    @tra forma de sacar las funciones de readline -

    $ bin+ -l

    odemos sacar todas las asignaciones de teclas en formato inputrcusando el comando -

    $ bin+ -p

    2on el comando anterior podemos en"iar la salida a un fichero para luego editarlo -

    $ bin+ -p 9 .inputrc

    odemos asignar combinaciones de teclas que e!ecuten comandos con la opcin -x-

    $ bin+ -x GI*-lIO ls -laI

    0l presionar la tecla Ctrl=le!ecutara ls -la.

  • 5/28/2018 Programacion Shell Bash

    13/64

    Los ficheros de configuracin de =ash

    2ada "e( que nos logeamos se e!ecuta el contenido del fichero

  • 5/28/2018 Programacion Shell Bash

    14/64

    Las os a&udan a configurar el entorno en el que se e!ecutan los programas. Las "ariables de entorno no puedentener espacios, & si queremos asignar un "alor con espacio debemos de entrecomillarlo, o bien preceder elespacio por un carcter de escape -

    $ BE;Jarcos PabloJ$ echo $BE

    :arcos Hablo

    $ BE;arcos Pablo$ echo $BE

    :arcos Hablo

    2omo "emos para obtener el "alor de la "ariable precede del signo ', obser"amos que las comillas o elcarcter de escape no forman parte del "alor de la "ariable una "e( que se reali(a la asignacin.

  • 5/28/2018 Programacion Shell Bash

    15/64

    ara eliminar una "ariable de entorno usamos el comando unset.

    $ unset BE

    Es con"eniente utili(ar los nombre de las "ariables en ma&$sculas por con"iccin.

    'ariables 4 entrecomilla+o

    6emos en este caso como combinar la "ariable con la salida de pantalla utili(ando el comando echo.

    $ BE;Jarcos PabloJ$ ED%D;Q$ echo GSu nombre es O $nombre 4 la e+a+ es O $e+a+IIu nombre es :arcos Hablo y la edad es %

    PersonaliRar el prompt

    odemos personali(ar nuestro prompt de =ash usando las "ariables de entorno !;D, !;, !;& !;. En la

    siguiente tabla se muestra las opciones de personali(acin que podemos usar en cualquiera de los prompt.

    Opci8n &escripci8n

    Ja El carcter 0%2;; bell '\\]*.

    J0 La hora en formato$$H.

    Jd La fecha en formatosemana mes dJa.

    J/ NformatoO >os permite personali(ar ms la fecha.

    Je El carcter de escape 0%2;; '\WW*.

    J ostname.

    Jh El nombre de la mquina hasta el primer punto.

    J! >$mero de !obs hi!os del shell.

    Jl >ombre del terminal en el que estamos traba!ando 'p.e. tt:*.

    Jn etorno de carro & nue"a l#nea.

    Jr etorno de carro.

    Js >ombre de shell.

    Jt ora en formato$$HH;;con V horas.

    J8 ora en formato anterior pero con VX horas.

    Ju >ombre de usuario.

    J" 6ersin de =ash.

    JS uta del directorio actual.

    J^ >ombre del directorio actual 'sin ruta*.

    JG >$mero de comandos e!ecutados.

    J5 >$mero histrico del comando.

    JH si somos root, o'en caso contrario.

    Jnnn 2digo de carcter a mostrar en octal.

    JJ La barra hac#a atrs.J3 Empie(a una secuencia de caracteres no imprimibles, como los

    caracteres de control de secuencias del terminal.

  • 5/28/2018 Programacion Shell Bash

    16/64

    J4 0caba una secuencia de caracteres no imprimibles.

    Un e!emplo sencillo es de poner 9Kque es el directorio donde estamos parado & esto nos a&uda siempre parasaber donde estamos parado.

    $ PS;J-9J

    J-F

    /onde 4significa que estamos en el directorio home.

    Es mu& t#pico querer saber si somos rooto cualquier otro usuario de la mquina, para lo cual se usa la opcin9'que muestra unasi somos root, o un'en cualquier otro caso.

    $ PS;J$J4K

    Es mu& com$n que accedamos a ser"idores remotos por medio dessho telnet& no sabes por medio delprompt en que ser"idor estamos, para eso podemos incorporar en la "ariables !;Dla opcin 9$que nos da el

    nombre de la mquina donde estamos situados, o la opcin 9hque nos da el nombre de la mquina slo hastael primer punto -

    $ PS;Jh$Jcentru4'

    $ PS;JH$Jcentru.orgJK

    2uando nos mo"emos en distintas tt& de la consola como "imos con la teclas"lt=FDhasta"lt=FL'desde latt& hasta la tt&_*, es con"eniente que en nuestro prompt tengamos tambin que tt:es donde estamos.

    $ PS;J0u@h@l1 $J2pabloLcentruL13 JK

    2on la opcin 9u es la que indica el nombre del usuario, 9l nos indica la tt:que estamos.

    8ambin podemos poner color a nuestro prompt, poniendo las secuencias de escape de caracteres noimprimibles tienen que encerrarse ente 9,(,& 9. ara las secuencias de escape de color, tambin debenaparecer, seguidos adems de una mmin$scula.

    or e!emplo para incluir texto a(ul en el prompt -

    $ PS;J0=0Tm10u@hO1$ J

    En este caso el color a(ul esta dado por el cdigom & en ning$n momento se retorna el color habitual, esdecir todo lo que escribamos sera de color a(ul para arreglar esto & que solo nuestro prompt sea de color a(ulal final tenemos que poner ,9(,(m9

    ' !;DMB9,9(,m9,9u@9hH9K' 9,9(,(m9B

    En la siguiente tabla tenemos los colores -

    Color C8digo Color C8digo

    >egro \+W\

  • 5/28/2018 Programacion Shell Bash

    17/64

    2&an \+W_ 2&an claro +W_

    o!o \+W o!o claro +W

    $rpura \+WY $rpura claro +WY

    arrn \+WW 0marillo +WW

  • 5/28/2018 Programacion Shell Bash

    18/64

    ariable &escripci8n

    %ELL !athdel fichero que estamos usando.

    L;>E% L#neas del terminal en caracteres.

    2@LU>% 2olumnas del terminal en caracteres.

    @E /irectorio homedel usuario.

    ^/ /irectorio actual.

    @L/^/ 0nterior directorio actual.

    U%E >ombre de usuario en la cuenta donde estamos logados.

    0lgunas "ariables se actuali(an dinmicamente, por e!emploINE;& CON;en todo momentoalmacenan en n$mero de filas & columnas de la terminal, & las usan algunos programas como el editor %i

  • 5/28/2018 Programacion Shell Bash

    19/64

    $ chmo+ ?x e:emplo.sh

    0l llamarlo de la siguiente forma, lo estamos e!ecutando en unsubshell.

    $ ./e:emplo.sh1'

    6eremos que si queremos imprimir el "alor de"no mostrara nada -

    $ echo $%

    0hora lo llamaremos con el comandosourceo .'punto* & "eremos que este se e!ecuta en elshell& no elsubshellcomo el e!emplo anterior.

    $ source e:emplo.sh1'

    $ echo $%

    1'

    o

    $ . ./e:emplo.sh1'

    $ echo $%1'

    Runciones

    0 diferencia de los scripts, se e!ecutan dentro de la memoria del propio proceso de =ash, con lo que son mseficientes que e!ecutar aparte, pero tienen el incon"eniente de que tienen que estar siempre cargadas en lamemoria del proceso =ash para poder usarse.

    Existe dos formas para definir una funcin -

    El estilo del >ourne ;hell H O el estilo del C ;hell H

    function nombre:funcionN comandos bash

    O

    nombre:funcion'*N comandos bash

    O

    >o existe diferencia entre ellos, para borrar una funcin podemos utili(ar el comando unset -fnombre_funci8n*2uando definimos una funcin se almacena como una "ariable de entorno 'con su "aloralmacenado la implementacin de la funcin*. ara e!ecutar la funcin escribimos el nombre de la funcin &los parmetros necesarios.

    $

  • 5/28/2018 Programacion Shell Bash

    20/64

    $ chmo+ ?x 2uncion.sh$ source 2uncion.sh

    $ imprimir&

    X 2omandos internos 'cd,t:pe,etc*

  • 5/28/2018 Programacion Shell Bash

    21/64

    Y %cripts & programas e!ecutables, para los cuales se sigue el orden enque se dan sus directorios en la "ariable de entorno !"#$.

    %i nos interesa conocer la procedencia de un comando podemos usar el comando interno t:pe, si le damos uncomando nos indica cual es su fuente.

    E!emplo -

    $ t4pe lsls es un alias de 6ls Scolorauto7

    $ t4pe -path cat/bin/cat

    2on la opcin -pathme de"uel"e en que ruta se encuentra el comando.

    odemos tambin pasarle la funcin de un script como la funcin que reali(amos anteriormente -

    $ t4pe imprimir&salu+oimprimir_"alor es una funciCnimprimir_"alor ()

    ?&'T echo K?!!

    2omo "imos anteriormente los alias tiene ma&or prioridad que las funciones, si declaramos un alias con elmismo nombre de la funcin & luego reali(amos un t&pe "eremos que nos muestra lo siguiente -

    $ alias imprimir&salu+o;Ils -aI$ t4pe imprimir&salu+oimprimir_saludo es un alias de 6ls -a7

    ero si queremos "er todas las definiciones e!ecutamost:pe -a -

    $ t4pe -a imprimir&salu+oimprimir_saludo es un alias de 6ls -a 7imprimir_saludo es una funciCnimprimir_saludo()

    echo OPola KBI=

    %i e!ecutamos imprimir_saludocomo tiene ma&or prioridad el aliassolo e!ecutara el ls& no la funcin.

    $ imprimir&salu+o./ ../ .bash_history ."im/ ."iminfo

    %i queremos conocer el tipo de un s#mbolo con la opcin -t, es decir esto nos de"ol"er si es un alias,Pe:Kord, function, builtin'comando internos* o file.

    E!emplo -

    $ t4pe -t ls

    alias

    $ t4pe -t rmfile

  • 5/28/2018 Programacion Shell Bash

    22/64

    $ t4pe -t c+builtin

    $ t4pe -t imprimir&salu+oalias

    =orramos el aliasanteriormente definido con el comando unalias.

    $ unalias imprimir&salu+o$ t4pe -t imprimir&salu+ofunction

    'ariables +e Shell

    or con"enio las "ariables de entorno exportadas se escriben en ma&$sculas, acordemonos que U9Linux &U>; deferencia entre min$sculas & ma&$sculas.

    Los parmetros posicionales

    %on los en encargados de recibir los argumentos de un script & los parmetros de una funcin. %us nombresson D,,, etc., con lo que para acceder a ellos utili(aremos, como normalmente, el s#mbolo'de la siguienteforma'D,',', etc. 0dems tenemos el parmetro posicional ( que contiene el nombre del script que seesta e!ecutando.

    E!emplo -

    $

  • 5/28/2018 Programacion Shell Bash

    23/64

    6ariables locales & globales

    Los parmetros son locales al script o funcin & no se puede acceder o modificar desde otra funcin. ore!emplo el siguiente script.

    $

  • 5/28/2018 Programacion Shell Bash

    24/64

    globales.

    $

  • 5/28/2018 Programacion Shell Bash

    25/64

    $ ./parametros&=.sh C T F8ombre del script ./parametros_'1sh recibe , parametros 10&0%04050,8ombre del script ./parametros_'1sh recibe , parametros 1 & % 4 5 ,

    Expansin de "ariables usando lla"es

    ealmente la forma que usamos para expandir una "ariable'%ariablees una simplificacin de la forma msgeneral'5%ariable6. La simplificacin se puede usar siempre que no existan ambigedades. La forma'5%ariable6se usa siempre que la "ariable "a&a seguida por una letra, d#gito o guin ba!o '&*, en casocontrario podemos usar la forma simplificada'%ariable.

    E!emplo -

    $ nombre;arcos$ apelli+o;usso$ echo $nombre&$apell+io

  • 5/28/2018 Programacion Shell Bash

    26/64

    HN"ariable-offset-longitudO etorna una subcadena de %ariableque empie(a en offset& tiene longitudcaracteres. El primer carcter de %ariableempie(a en la posicin (. %i seomite longitudla subcadena empie(a en offset& continua hasta el final de%ariable.

    Los dos puntos 'O* en este operador son opcionales. %i se omiten en "e( de comprobarsi existe : no es nulo

    s8lo comprueba Sue exista'aunque sea nulo*.

    E!emplo -

    '5%ariableH-%alor6se utili(a para retornar un "alor por defecto cuando el "alor de la "ariable %ariableestindefinido. Esto no modifica el contenido de %ariable.

    $ echo $6

  • 5/28/2018 Programacion Shell Bash

    27/64

    HNruta.1O 9usr9share9doc9apt9examples9sources

    HNruta.1O 9usr9share9doc9apt9examples9sources

    En la b$squeda de patrones se pueden usar tanto los comodines tradicionales, el siguiente cuadro son loscomodines extendidos-

    Operador &escripci8n

    HN"ariableGpatronO %ipatroncoincide con la primera parte del "alor de %ariable, borra la partems peque7a que coincide & retorna el resto.

    HN"ariableGGpatronO %ipatroncoincide con la primera parte del "alor de %ariable, borra la partems grande que coincide & retorna el resto.

    HN"ariablepatronO %ipatroncoincide con el final del "alor de %ariable, borra la parte mspeque7a que coincide & retorna el resto.

    HN"ariable9patron9cadenaO La parte ms grande depatronque coincide en %ariablees reempla(ada porcadena. La primera forma slo reempla(a la primera ocurrencia, & la segundaforma reempla(a todas las ocurrencias. %ipatronempie(a por debeproducirse la coincidencia al principio de %ariable, & si empie(a por Tdebeproducirse la coincidencia al final de %ariable. %i cadenaes nula se borranlas ocurrencias. En ning$n caso %ariablese modifica, slo se retorna su"alor con modificaciones.

    E!emplo -

    $ ruta;/usr/share/+oc/apt/examples/sources.list$ echo $6rutaN/usr//+oc8

    /apt/eamples/sources.list

    $ echo $6rutaY.list8/usr/share/doc/apt/eamples/sources

    $ echo $6rutaYY/examples/sources.list/8/usr/share/doc/apt

    $ echo $6ruta/usr/

  • 5/28/2018 Programacion Shell Bash

    28/64

    /usr/local/games/usr/games

    El B9nB significa salto de linea, es decir reempla(a los Hpor B9nB 'salto de linea*.

    @peradores longitud

    8iene la forma'5%ariable6donde %ariablees la "ariable cu&o "alor queremos medir.

    E!emplo -

    nombre;Jarcos Pablo ussoJ$ echo $6Nnombre81*

    Sustitucin +e coman+os

    >os permite usar la salida de un comando como si fuera el "alor de una "ariable. La sintaxis es la siguiente -

    $(coman+o)

    Las comilla UcomandoU sir"e para reali(ar la e!ecucin de un comando. 0unque en =ash mantiene estasintaxis por compatibilidad hac#a atrs, la forma recomendada es mediante el uso de parntesis, que permiteanidar sustituciones de comandos.

    E!emplo -

    $ mi+ir;$(ls $HE)$ echo $mi+ir

    8ambin podemos cargar el contenido de un archi"o a una "ariable usando'?/nombre_del_fichero.

    $ miarchi

  • 5/28/2018 Programacion Shell Bash

    29/64

    ' /usr/include1 /etc& /usr/share/doc

    % J' popd/etc /usr/share/doc J' popd

    /usr/share/doc J' popdJ

    *ontrol +e 2lu:o

    Las sentencias de control de flu!o es un denominador com$n de la ma&or#a de los lengua!es deprogramacin, incluido =ash.

    En este caso "eremos las sentencias de control de flu!o 'if, else, for, Khile, until, case&select*.

    Las sentencias condicionales

    La sentencia condicional tiene el siguiente formato -

    if condicionthen sentenciaselif condicionthen sentenciaselse sentencias

    fi

    Este lengua!e nos obliga a que las sentencias estn organi(adas con estos retornos de carro, aunque algunaspersonas prefieren poner los thenen la misma l#nea que los if, para lo cual debemos de usar el separador decomandos, que en =ash es el punto & coma 'W* as# -

    if condicion T then sentenciaselif condicion T then sentenciaselse sentencias

    fi

    Los cdigos de terminacin

    En U!"los comandos terminan de"ol"iendo un cdigo numrico al que se llama c8digo de terminaci8n'exit status* que indica si el comando tu"o xito o no.

    0unque no es obligatorio que sea as#, normalmente un cdigo de terminacin (significa que el comandotermin correctamente, & un cdigo entre D &XXcorresponde a posibles cdigos de error.

    La sentencia ifcomprueba el cdigo de terminacin de un comando en la condicin, si ste es (la condicinse e"al$a como cierta.

    E!emplo -

  • 5/28/2018 Programacion Shell Bash

    30/64

    ' %i ir*sh

    NM/bin/bash

    if cd K1WRValtan parametrosR!T then echo K1else

    echo Rirectorio K1 no "alidoRfi

    ' chmod =x ir*sh' *

  • 5/28/2018 Programacion Shell Bash

    31/64

    !

    2omo di!imos anteriormente las funciones tiene preferencia sobre los comando internos, como es en estecaso la funcin que declaramos anteriormente cd? tiene ma&or prioridad que el comando interno cd.

    ara e!ecutar el comando interno & no la funcin podemos usar el comando interno builtin, sino quedar#a enun bucle infinito llamndose a si mismo.

    builtin cd RKLR

    @bser"amos tambin que tenemos que guardar el resultado de"uelto de la anterior linea en una "ariable & alfinal retornamos el "alor, si no hacemos as# & retornamos sin guardarla en una "ariable, estar#amosde"ol"iendo el "alor de"uelto por el echo A'O&!V& -0 '!V&Y.

    local ctKW

    @peradores lgicos & cdigos de terminacin

    odemos combinar "arios cdigos de terminacin de comandos mediante los operadores lgicos and'representado con 22* or'representado con 11* & not'representado con .*.

    E!emplo -

    if cd /tmp ZZ cp archi"o.tmp KP9:=T then Qfi

    rimero e!ecuta el comando cd

  • 5/28/2018 Programacion Shell Bash

    32/64

    8est condicionales

    La sentencia iflo $nico que sabe es e"aluar cdigos de terminacin. ero no podemos "erificar si uncomando se ha e!ecutado bien.El comando interno testnos permite comprobar otras condiciones, que le pasamos como argumento, paraacabar de"ol"iendo un cdigo de terminacin. Una forma alternati"a al comando testes el operador , dentro del cual metemos la condicin a e"aluar, es decir, test cadenaD M cadenaes equi"alente a , cadenaD

    M cadena . Los espacios entre corchetes & los operados, o entre los operandos & el operador decomparacin Mson obligatorios. 2on lo que es coherente con la sintaxis de ifque hemos "isto en el apartadoanterior.

    Usando los testcondicionalespodemos e"aluar atributos de un fichero 'si existe, que tipo de fichero es, quepermisos tiene, etc*, comparar dos ficheros para "er cual de ellos es ms reciente, comparar cadenas, eincluso comparar los n$meros que almacenan las cadenas 'comparacin numrica*.

    2omparacin de cadenas

    Operador erdadero si ***

    str strV Las cadenas son iguales.

    str 5 strV Las cadenas son distintas.

    str K strV strDes menor lexicogrficamente astr.

    str M strV strDes ma&or lexicogrficamente astr.

    An str strDes no nula & tiene longitud ma&or a cero.

    A( str strDes nula 'tiene longitud cero*.

    E!emplo -

    ' %i cadenas*sh

    G59bin9bash

    if 2 -$ K1 3T then echo R\adena nula.R eit 1fi

    if 2 -$ K& 3T then echo R\adena nula.R eit 1

    fi

    if 22 K1 K& 33T then echo RIon iguales las cadenas.Relif 22 K1 F K& 33T then echo R@a primer cadena es mas grande ue la segunda cadena.Relse echo R@a segunda cadena es mas grande ue la primer cadena.Rfi

    ' chmod =x cadenas*sh

    ' *

  • 5/28/2018 Programacion Shell Bash

    33/64

    ' *

  • 5/28/2018 Programacion Shell Bash

    34/64

    de condicin con"iene recordar dos reglas -

    Los parntesis dentro de expresiones condicionales deben ir precedidos por el carcter deescape J 'para e"itar que se interpreten como una sustitucin de comandos*.

    Los parntesis, al igual que los corchetes, deben de estar separados por un espacio.

    El e!emplo anterior se puede tambin escribir de la siguiente manera -

    if 2 ]( K"alor_producto_1! -le K"alor_producto_&! ]) -a ]( K"alor_producto_1! -le 1' ]) 3then echo R=l producto ingresado es menor o igual al producto& y menor o igual a 1'Rfi

    2omprobar atributos de ficheros

    El tercer tipo de operadores de comparacin nos permiten comparar atributos de fichero. Existen VVoperadores de este tipo.

    Operador erdadero si ***

    Aa archi%o archi%oexiste.

    Ab archi%o archi%oexiste & es un dispositi"o de bloque.

    Ac archi%o archi%oexiste & es un dispositi"o de carcter.

    Ad archi%o archi%oexiste & es un directorio.

    Ae archi%o archi%oexiste 'equi"alente a -a*.

    Af archi%o archi%oexiste & en un archi"o regular.

    Ag archi%o archi%oexiste & tiene acti"o el bit desetgid.

    A< archi%o archi%oexiste & es pose#do por el grupoI& efecti%o.

    Ah archi%o archi%oexiste & es un enlace simblico.

    A) archi%o archi%oexiste & tiene elsticP: bitacti"ado.

    AL archi%o archi%oexiste & es un enlace simblico.

    A> archi%o archi%oexiste & fue modificado desde la $ltima lectura.

    A@ archi%o archi%oexiste & es pose#do por el user ;/ efecti"o.

    Ap archi%o archi%oexiste & es un pipe o named pipe.

    Ar archi%o archi%oexiste & podemos leerlo.

    As archi%o archi%oexiste & no est "ac#o.

    A% archi%o archi%oexiste & es unsocPet.

    AS archi%o archi%oexiste & tenemos permiso de escritura.

    Ax archi%o archi%oexiste & tenemos permiso de escritura, o de b$squeda sies un directorio.

    archi%oDAnt archi%o La fecha de modificacin de archi%oDms moderna que '>eSer8han* la de archi%o.

    archi%oDAot archi%o La fecha de modificacin de archi%oDms antigua que '@lder8han* la de archi%o.

    archi%oDAef archi%o archi%oD& archi%oson el mismo archi"o 'Equal Rile*.

  • 5/28/2018 Programacion Shell Bash

    35/64

    E!emplo -

    ' %i archi%o_(D*sh

    NM/bin/bash

    if 2 -$ RK1R 3

    then echo RVorma de uso R echo RR echo RK' nombre_archi"o[directorioR echo RR eit 1fi

    if 2 -d RK1R 3then echo R=s un directorioR

    fi

    if 2 -@ RK1R 3then echo R=s un enlace simbClicoRfi

    if 2 -# RK1R 3then echo R iene permiso de escrituraRfi

    if 2 - RK1R 3then echo R iene permiso de ejecucionRfi

    ' chmod =x archi%o_(D*sh' *

  • 5/28/2018 Programacion Shell Bash

    36/64

    %i se omite in lista, se recorre el contenido de'@, pero aunque "a&amos a recorrer esta "ariable, escon"eniente declararla expl#citamente.

    E!emplo -

    for planeta in :ercury >enus ^erra :arte upiter Iaturnodo

    echo Kplanetadone

    La lista del bucle forpuede contener comodines. or e!emplo, el siguiente bucle muestra informacindetallada de todos los archi"os que contiene un directorio actual -

    for archi"os in Edo ls -l OKarchi"osGdone

    ara recorrer los argumentos recibidos por el script, lo correcto es utili(ar '@Z entrecomillado, tanto'+como'@sin entrecomillar interpretan mal los argumentos con espacios, & '+Z entrecomillado considera unslo elemento a todos los argumentos.

    E!emplo -

    ' %i argumentos*sh

    for arg in OKEGdo echo R=lemento KargRdone

    for arg in OKLGdo echo R=lemento KargRdone

    ' chmod =x argumentos*sh' *

  • 5/28/2018 Programacion Shell Bash

    37/64

    hecho si omitimos in listatambin se usa por defecto'@. Lo que genera la sentencia es un men$ con loselementos de lista, donde asigna un n$mero. El "alor elegido se almacena en "ariable, & el n$mero elegidoen la "ariableRE![. Una "e( elegida una opcin por parte del usuario, se e!ecuta el cuerpo de la sentencia& el proceso se repite en un bucle infinito.

    El bucle se puede abandonar usando la sentencia breaP, se usa para abandonar un bucle, se puede usar tantoen el caso deselect, como tambin en los bucles for, Khile& until.

    ' %i select*sh

    options1Roption1 option& uitRecho opciones Koptions1select opt in Koptions1 T do echo Kopt if 2 RKoptRRuitR 3T then eit fidone

    ' chmod =x select*sh' *

  • 5/28/2018 Programacion Shell Bash

    38/64

    pciones +e la l,nea +e coman+os7 expresiones aritmZticas 4 arra4s

    0 lo largo de este tema aprenderemos a reali(ar dos operaciones frecuentes en la programacin de scripts- Laprimera es recibir opciones 'precedidas por un guin* en la l#nea de comandos. La segunda es aprender areali(ar operaciones aritmticas con las "ariables, de esta forma superaremos la limitacin de que estbamosteniendo, de que todas nuestras "ariables slo conten#an cadenas de caracteres.

    @pciones de la l#nea de comandos

    Es mu& t#pico que los comandos U>; tengan el formato -

    comando 2-opciones3 argumentos

    Las opciones suelen preceder a los argumentos & tienen un guin delante & una abre"iatura del significado dela opcion, mientras que se ponen dos guiones cuando indicamos la opcin completa es decir -

    ' ls -R

    o

    ' ls --recursi%e

    %upongamos el siguiente e!emplo donde le pasamos argumentos -

    ./hacer -o hola mun+o.txt

    H\ H HV HW

    El problema est en que normalmente las opciones son opcionalesZ, es decir, pueden darse o no, con lo queel script que procesa la opcin anterior deber#a tener la forma -

    if 2 K1 -o 3T then =jecuta la operaciCn con K& y K%else=jecuta la operaciCn con K1 y K&fi

    En consecuencia, cuando el n$mero de opciones crece, la programacin de script se "uel"e engorrosa.

    La sentencia shift

    Esta sentencia nos permite solucionar este problema.

    shift 2n3

    /onde nes el n$mero de despla(amiento a la i(quierda que queremos hacer con los argumentos. %i se omitenpor defecto "ale . En el e!emplo anterior si e!ecutamos el comandoshift D,'Dpasar a ser hola*txt &'pasa a ser mundo*txt, & la opcin se pierde.

    if 2 K1 -o 3T then Hrocesa -o shiftfi

    =jecuta la operaciCn con K1 y K&

    El siguiente e!emplo muestra me!or el uso deshift, donde "eremos que recibe tres parmetros posibles .

  • 5/28/2018 Programacion Shell Bash

    39/64

    #hile 2 -n RK(echo K1 [ grep 7`-7)R 3do case K1 in -a) echo R>alor -aR TT -b) echo R>alor -bR

    TT -c) echo R>alor -cR TT E) echo Rforma de uso K' 2-a3 2-b3 2-c3 args...R eit 1 TT esac shiftdone

    echo R?rgumentos R

    La condicin del bucle busca la expresin regular B\-B significa cualquier cosa que empiece '\* por un guin'-*, cada "e( que procesamos una opcin e!ecutamosshiftpara despla(ar una "e( los argumentos.

    8ambin puede ser que cada parmetro tenga su propio argumento, por e!emplo que la opcin Ab recibe acontinuacin un argumento. En ese caso deber#amos modificar el bucle anterior para leer este argumento -

    #hile 2 -n RK(echo K1 [ grep 7`-7)R 3do case K1 in -a) echo R>alor -aR TT

    -b) echo R>alor -b K&R shift TT -c) echo R>alor -cR TT E) echo Rforma de uso K' 2-a3 2-b argumento3 2-c3 args...R eit 1 TT esac shiftdone

    echo R?rgumentos R

    En este caso'es el argumento de la opcin -b & reali(amos unshiftpara que pase a la prxima opcin,esto lo hace siempre & cuando pasemos como opcin -b.

    El comando interno getopts

    getoptsnos permite procesar opciones de l#nea de comandos ms cmodamente, el problema de esto es quesolo permite una sola letra, es decir -a& no AAacti%o. 0demsgetoptsnos permite procesar opciones cuandoestn agrupadas 'p.e. -abcen "e( de -a -b -c* & sus argumentos de opciones cuando estos no estn separadosde la opcin por un espacio '-bargen "e( de -b argumento

  • 5/28/2018 Programacion Shell Bash

    40/64

    argumento se precede por dos puntos '-*. El argumento de la opcin lo podemos leerconsultando la "ariable de entorno O!#"RG. El comandogetoptscoge una de las opcionesde la l#nea de comandos & la almacena en una "ariable cu&o nombre se da comosegundoargumento. ientras que el comando encuentra opciones de"uel"e el cdigo de terminacin\, cuando no encuentra ms opciones de"uel"e el cdigo de terminacin .

    O!#"RG son los argumentos que se pasan.

    O!#IN& es el numero del primer argumento a procesar.

    #hile getopts OabcG optdo case Kopt in -a) echo R>alor -aR TT -b) echo R>alor -b K9H^?alor -cR TT

    E) echo Rforma de uso K' 2-a3 2-b argumento3 2-c3 args...R eit 1 TT esacdoneshift K((K9H^U8 -1))echo R?rgumentos R

    @bser"amos que no hace falta que ponemosshiftdentro del bucle &a quegetoptses lo suficientementeinteligente como para de"ol"ernos cada "e( una opcin distinta. Lo que s# hemos hecho al final del bucle esdespla(ar tantas "eces como argumentos con opciones ha&amos encontrado. ara esogetoptsalmacena en la"ariable de entorno O!#IN&el n$mero del primer argumento a procesar.

    6E

    'ariables con tipo

    asta ahora las "ariables slo pod#an contener cadenas de caracteres, despus se introdu!o la posibilidad deasignar atributos a las "ariables que indican, por e!emplo que son enteras o de slo lectura. ara fi!ar losatributos de las "ariables tenemos el comando interno declare, el cual tiene la siguiente sintaxis-

    declare 2-afVir3 2-p3 name2"alue3 Q

    La siguiente tabla muestra las opciones dada por este comando, para acti"ar un atributo se precede la opcinpor un guin -, con lo que para desacti"ar un atributo decidieron preceder la opcin por un =.

    Opci8n &escripci8n

    Aa La "ariable es de tipo arra&.

    Af ostrar el nombre e implementacin de las funciones.

    AR ostrar slo el nombre de las funciones.

    Ai La "ariable es de tipo entero.

    Ar La "ariable es de slo lectura.

    Ax Exporta la "ariable 'equi"alente a export*.

    %i solo escribimos el comando declaresin ning$n argumento "eremos que nos muestra todas las "ariables de

  • 5/28/2018 Programacion Shell Bash

    41/64

    entorno.

    ' declare;?IP/bin/bash;?IP9H^Icheck#insi$ecmdhistepand_aliasesetglobetuoteforce_fignorehistappendinteracti"e_commentsprogcompprompt"arssource

    path

    ;?IP_?@U?I=I();?IP_?

  • 5/28/2018 Programacion Shell Bash

    42/64

    ' resultadoM'%arD+'%ar' echo 'resultado&'

    ara saber que tipo es la "ariable que esta declarada con el comando declareutili(amos la opcin -p.

    ' declare -p resultado

    declare -i resultadoR&'R

    La opcin -x es equi"alente a usar el comando exportsobre la "ariable, ambas son formas de exportar una"ariable de entorno.

    La opcin -rdeclara a la "ariable como de slo lectura, con lo que a partir de ese momento no podremosmodificar ni e!ecutar unsetsobre ella.

    ' declare -r resultado' resultadoM'%arD+(bash resultado "ariable de sClo lectura

    Existe otro comando interno llamado readonl:que nos permite declarar "ariables de slo lectura, pero quetiene ms opciones que declare -r. 2on readonl: -pnos muestra todas las "ariables de slo lectura -

    ' readonl: -pdeclare -r;?IP9H^IRcheck#insi$ecmdhistepand_aliasesetglobetuoteforce_fignorehistappendinteracti"e_commentsprogcompprompt"arssourcepathRdeclare -ir ;?IPHURRdeclare -r ;?IP_\9:H@= U98R/etc/bash_completionRdeclare -r ;?IP_\9:H@=^U98_\9:H?^_U

  • 5/28/2018 Programacion Shell Bash

    43/64

    Expresiones aritmZticas

    Las expresiones aritmticas "an encerradas entre' ??&, tambin podemos encerrarlas ente' ,&, pero estforma est desestimada por =ash con lo que no se recomienda usarla.

    E!emplo -

    ' echo ]'?? LX - '?date =TQ dias para el D de &iciembre]

    >os permite usar los operadores relacionales 'K, M, K, M, , 5* & lgicos de 2 '5, II, DD* interpretando,al igual que 2, el como cierto & el \ como falso.

    El comando interno let

    >os permite asignar el resultado de una expresn aritmtica a una "ariable. 8iene la siguiente sintaxis -

    let "arepresion

    expresiones cualquier expresin aritmtica & no necesita estar encerrada entre H''...**. La diferencia con elcomando declare -i, no crea una "ariable de tipo entero, sino una "ariable de tipo cadena de caracteresnormal.

    E!emplo -

    ' let aM+' declare -p adeclare S aG1&G

    ' echo 'a1&

    Sentencias +e control +e 2lu:o aritmZticas

    ueden usarse en las distintas sentencias de control de flu!o, en cu&o caso la expresin "a entre dobleparntesis, pero sin el'.

    if ((epresiCn aritmtica))T then cuerpofi

    @ el Khilearitmtico tendr#a la forma -

    #hile ((epresiCn aritmtica))

    do cuerpodone

    E!emplo -

    Este programa genera un n$mero aleatorio de \ a , & nos pregunta hasta que acertemos, o fallemos \"eces. %e utili(a la "ariable'R"N&O la cual cada "e$ ue se lee de"uel"e un nDmero distinto.

    ' %i obtener*sh

    let intentos1'let solucionK

  • 5/28/2018 Programacion Shell Bash

    44/64

    read -p OUndiue un numero O numero if ((numerosolucion))T then echo O=celente has ganado...G eit elif ((numerosolucion))T then echo O=s mayorG else

    echo O=s menorG fidoneecho OHerdiste por superar los 1' intentos.G

    ' chmod =x obtener*sh' *iernesR 253Rue"esR 2,3RIabadoR 23RomingoR)7

    >o hace falta suministrar los elementos en orden, ni suministrarlos todos, los #ndices donde no colocamos un"alor, simplemente "aldrn cadena nulaZ.

    ' COORE;M?,XMRoQo "ul >lanco Negro arron' declare -p COORE;declare -a \9@9

  • 5/28/2018 Programacion Shell Bash

    45/64

    Rargumentos.shR 243Rclientes.ttR 253Rcond&.shR 2,3Rcond.shR 23Rconfig.confR 2*3Rdespla$a_parametros.shR 2+3Rdu-.shR 21'3Reje&.shR 2113Reje.shR 21&3Rentrada.shR 21%3Restado_archi"o.shR 2143Rfuncion_'1.shR 2153Rfuncion_'&.shR 21,3Rfuncion.shR 213Rget_modulos.shR 21*3Rimprimir.shR 21+3Rir.shR 2&'3Rocupa.shR 2&13Rparametros_'1.shR2&&3Rpiladir.shR 2&%3Rselect.shR 2&43Rshift.shR 2&53Rsolucion.shR 2&,3Rtojpg.shR 2&3Rtomar_archi"o.shR 2&*3R"er_cd.shR 2&+3R"er.shR 2%'3R.shR)7

    ara acceder a los elementos usamos el operador corchete , para indicar el #ndice del elemento a acceder, &en este caso es obligatorio encerrar entre lla"es 5 6la "ariable -

    ' echo '5I;#"&O,X6cond&.sh

    %i no indicamos el #ndice de elemento, por defecto nos trae el elemento de #ndice (.

    ' echo 'I;#"&Oarchi"o_'1.sh

    0hora "eremos la forma que no ha& que hacer para indicar un elemento determinado, por esa misma ra(nha& que ponerlo entre lla"es -

    ' echo 'I;#"&O,X@UI^?9253

    @tra forma de declarar el arra:es introducir "alores independientemente -

    ' ",MCasa' ",(M"%ion' ",DM#ren' declare -p "

    declare -a ?7(2'3R?"ionR 213R^renR 2&3R\asaR)7

    odemos usar los #ndices especiales +& @, los cuales retornan todos los elementos del arra:de la mismaforma que lo hacen los parmetros posicionales. 2uando no estn encerrados entre comillas dobles ambosde"uel"en una cadena con los elementos separados por espacio, pero cuando se encierran entre comillasdobles @de"uel"e una cadena con los elementos separados por espacio, & +de"uel"e una cadena con loselementos separados por el "alor deIF;.

    ' IF;M' echo '5",+6?"ion ren \asa

    ' echo '5",@6?"ion ren \asa

    ' echo A'5",@6Y?"ion ren \asa

    ' echo A'5",+6Y?"ion0^ren0\asa

    8ambin podemos mostrar su contenido con un bucle for.

    for datos in K?2E3!do echo Kdatosdone

  • 5/28/2018 Programacion Shell Bash

    46/64

    Los elementos de un arra:a lo que no se asigna "alor tienen una cadena nula, con lo que el bucle anteriorslo imprimir#a los elementos que existan en el arra: ".

    odemos consultar la longitud de un arra:usando la forma'5arra:,@6.

    ' echo '5",@6%

    nos de"uel"e slo el n$mero de posiciones ocupadas.

    /e la siguiente forma si le indicamos un #ndice nos dar la longitud del contenido del #ndice.

    ' echo '5",D6^ren

    ' echo '5",D64

    %i queremos saber que elementos no son nulos en un arra:podemos usar la forma'5.arra:,@6, esto estapermitido a partir de la "ersin W.\ de =ash.

    ' echo '5.",D6\ V

    %i asignamos un arra:compuesto a otro arra:, se pierden los "alores existentes, & se asignan los nue"os"alores.

    ' echo '5",@6?"ion ren \asa

    ' "M?$ola A`ue talY "dios' declare -p "declare -a ?7(2'3RPolaR 213Rue talR 2&3R?diosR)7

    odemos borrar un elemento del arra& -

    ' unset ",

    ' echo '5",@6declare -a ?7(2'3RPolaR 213Rue talR )7

    @ bien podemos borrar todo el arra& -

    ' unset "' declare -p "bash declare ? no se encontrC

    or $ltimo "amos a comentar que algunas de las "ariables de entorno de =ash son arra:s. or e!emplo>";$_ER;INFOes un arra:de slo lectura con informacin sobre la instancia actual de =ash -

    ' declare -p >";_ER;INFOdeclare -ar ;?IP_>=

  • 5/28/2018 Programacion Shell Bash

    47/64

    ' ls -l' declare -p !I!E;#"#;declare -a HUH=I^?^BI7(2'3R'R)7

    ' lsx' declare -p !I!E;#"#;declare -a HUH=I^?^BI7(2'3R1&R)7

    ' ls -l 1 more' declare -p !I!E;#"#;declare -a HUH=I^?^BI7(2'3R'R 213R'R)7

    e+irecciones

    >osotros anteriormente &a "imos este tema los principales operadores de redireccin que son - 0, /, 00,0&1, pero esta parte abarca otro grupo de comandos que muchas "eces aparecen relacionados con problemascomple!os de redireccin.

    En la siguiente tabla explicamos todos estos operadores -

    Operador &escripci8n

    cmd D cmdV ipe+ 8oma la salida estndar de cmdD& la en"#a a la entrada estndar de cmd.

    Mfichero edirige la salida estndar del programa al fichero.

    Kfichero edirige el contenido de ficheroa la entrada estndar del programa.

    MMfichero edirige la salida estndar del programa al fichero. 07ade esta a ficherosi ste &aexiste.

    MDfichero edirige la salida estndar del programa al fichero. %obrescribe a ste incluso si laopcin noclobberest acti"ada.

    KMfichero Usa a ficherotanto para la entrada estndar como para la salida estndar.

    nKMfichero Usa a ficherotanto para la entrada estndar como para la salida del descriptor defichero n.

    KKetiqueta Ruer(a a que la entrada a un comando sea lastdinhasta encontrar etiSueta. Esto sellama here document.

    KKKtexto En"#an textoa la entrada estndar del comando, es una "ariante de los heredocumentson los here string.

    nMfichero En"#a el "alor del descriptor de fichero nal fichero.

    nMMfichero En"#a el "alor del descriptor de fichero nal fichero. 07ade al final del fichero si

    ste existe.

    nMDfichero En"#a el "alor del descriptor de fichero nal fichero. %obrescribe a ste incluso si laopcin noclobberest acti"ada.

    nMI Enla(a la salida estndar en el descriptor de ficheron.

    nKI Enla(a la entrada estndar en el descriptor de ficheron.

    nMIm Enla(a el descriptor de salida men el descriptor de ficheron.

    nKIm Enla(a el descriptor de entrada men el descriptor de ficheron.

    IMfichero edirige la salida estndar & la salida de error estndar al fichero.

    KIA 2ierra la entrada estndar.MIA 2ierra la salida estndar.

    nMIA 2ierra el descriptor de salida n.

  • 5/28/2018 Programacion Shell Bash

    48/64

    nKIA 2ierra el descriptor de entrada n.

    E!emplos -

    En este e!emplo si no existe el archi"o lo crea de!ndolo en \ b&tes & si existe lo pisa de!ndolo tambin en \b&tes.

    ' 0 nue%o*txt

    En bash existe la opcin noclobberque por defecto no est acti"a ' & se puede acti"ar con el comandoset -onoclobber* que hace que si intentamos sobrescribir un fichero con el operador 0'redirigir a un ficheroexistente* el shell produ(ca un error & no nos de!e e!ecutar esta operacin. odemos for(ar que sesobrescriban los ficheros, incluso con esta opcin acti"ada, con el operador 01.

    Los descriptores de fichero

    emos "isto en cap#tulos anteriores que tenemos tres descriptores principales que el (para la entradaestndar 'stderr*, el Dpara la salida estndar 'stdout*, & elpara la salida de errores estndar 'stderr*.

    >os quedan los n$meros delal )para abrir descriptores adicionales, el descriptor Xpuede dar problemas &aque cuando el shell e!ecuta un subshell el subproceso hereda este descriptor. Esto se hace as# porque a "eceses $til asignar un n$mero de descriptor adicional a los descriptores estndar como si fueran una copiaadicional de este enlace. @tras "eces resulta $til asignar un n$mero de descriptor adicional a un fichero alque luego nos "amos a referir por su descriptor.

    El operador n0m2 enla(a el descriptor nen el descriptor de salida m.

    ' ls -: 00 resultado*logls in"alid option -- 7y7

    Hruebe 6ls --help7 para mAs informaciCn.

    ' ls -: 00 resultado*log 02D

    El resultado de la linea ilegal la en"#a porstdout'D*, en "e( destderr'*. %i lo hubiramos e!ecutado al re"ses decir ls D02 lo que habr#amos hecho es en"iar el listado de directorios 'stdout* a la salida de erroresestndar 'stderr*.

    El operador n/2menla(a el descriptor nen el descriptor de entrada m.

    ' cat / cla%e*h (/2

    Enla(a el descriptor de entradacon el fichero cla%e*h, & luego cambiastdinpara que en "e( de leer de

    teclado, lea del descriptor de fichero , con lo que el contenido de cla%e*hact$a como entrada al comandocat.

    @tro e!emplo es -

    ' ls 0mis*ficheros D02

    0signa el descriptor de fichero de salidaal ficheromis*ficheros, & despus enla(a la salida estndar con eldescriptor, con lo que la salida de ls"a al fichero mis*ficheros.

    8ambin podemos usar el operador n/0ficheropara que nsea a la "e( un descriptor de entrada & de salidapara fichero.

    ' cat clientes*txtuan

    Hedro

  • 5/28/2018 Programacion Shell Bash

    49/64

    ?na

    ' sort /0clientes*txt (/2 D02' cat clientes*txtuan

    Hedro?na

    ?nauan

    Hedro

    @bser"amos que los clientes ordenados no sobreescriben a los existentes, sino que se escriben acontinuacin. Esto se debe a que al leerlos, el puntero a fichero se ha colocado al final, & cuando despusescribimos estamos escribiendo al final de ste.

    El operador n/0ficherose puede abre"iar como /0fichero, en cu&o casostdinse con"ierte en un descriptorde fichero de entrada9salida con fichero como fuente & destino. Es decir, el comando anterior se podr#a haberescrito comosort /0cleintes*txt D02(. El final del comando D02(se usa para questdoutse en"#a astdin'el

    fichero clientes*txt*.

    a& "eces que queremos redirigir ambas salidas -gcc +*c D0errores*log 0errores*loguna forma mas fcilde abre"iar esto esgcc +*c 20errores*log.

    El comando exec

    Este comando nos permite cambiar las entradas & salidas de un con!unto de comandos 'de todos los que see!ecutan a partir de l*.

    ' %i exec*sh

    eec ,Z' N =nla$a el descriptor , a stdin.N =sto se hace para sal"ar stdin

    eec data-file N

  • 5/28/2018 Programacion Shell Bash

    50/64

    Esto se puede entre otras cosas utili(ar en una conexin de un ser"idor ftp por e!emplo -

    ' %i conexion_ftp*sh

    N Icript ue sube un fichero a un ser"idor de V^HN

  • 5/28/2018 Programacion Shell Bash

    51/64

    AE /esacti"a la interpretacin de caracteres precedidos por el carcter de escape.Es la opcin por defecto.

    An @mite el carcter Jn al final de la l#nea 'es equi"alente a la secuencia deescape Jc*.

    La siguiente tabla muestra las secuencias de escape que acepta echo 'cuando se le pasa la opcin Ae*. ara

    que estas tengan xito deben de encerrarse entre comillas simples o dobles, &a que sino el carcter deescape J es interpretado por el shell & no por echo.

    ;ecuencia de escape &escripci8n

    Ja roduce un sonido poomZ 'alert*.

    Jb =orra hac#a atrs 'bac)space*.

    Jc @mite el Jn al final 'es equi"alente a la opcin An*. /ebecolocarse al final de la l#nea.

    Jf 2ambio de pgina de impresora 'formfeed*.

    Jn 2ambio de l#nea.Jr etorno de carro.

    Jt 8abulador.

    El siguiente e!emplo repite un bucle de \ a , con la opcin 9rlo que hace es retorna el cursor en el terminalsin introducir un cambio de l#nea 'como lo hace el 9n*.

    K for ((i'Ti1'Ti))F doF echo -n RHrocesado KiRF sleep 1

    F echo -ne R]rRF done

    El comando interno printf

    2on el comandoprintfpodemos formatear la salida por pantalla mientras que con echono nos de!a.

    ' printf A$ola undoYPola :undo

    printfpor defecto interpreta las secuencias de escape.

    ' printf A$ola undo9nYPola :undo

    El formato de este comando es mu& parecido al de la funcinprintf? del lengua!e C.

    printf cadenaformato 2argumentos3

    En la siguiente tabla describimos los formatos que podemos utili(ar los cuales empie(an por T.

    Especificador &escripci8n

    c ;mprime el primer carcter de una "ariable cadena.

    d ;mprime un n$mero decimal.

    i ;gual que d 'integer*.

  • 5/28/2018 Programacion Shell Bash

    52/64

    e Rormato exponencialb*precisione,=-e

    E Rormato exponencialb*precisione,=-e

    f >$mero en coma flotante b*precision

    g El que menos ocupa entre e & f

    < El que menos ocupa entre E & f

    o @ctal sin signo

    s 2adena 'string*

    b ;nterpreta las secuencias de escape del argumento cadena

    q Escribe el argumento cadena de forma que pueda ser usado como entrada aotro comando

    u >$mero sin signo 'unsigned*

    x exadecimal con letras en min$scula

    exadecimal con letras en ma&$scu7a

    literal

    E!emplo -

    ' nM(' nombreMarcos' printf AEl cliente Td es Ts9nY 'n 'nombre=l cliente %' es :arcos

    ' printf A1TD(s19nY $ola[ Pola[

    %i queremos indicar un mximo para la cadena debemos de usar el campo precisi8n-

    ' printf A1T-D(*D(s19nY Aarcos !abloY[:arcos Hab[

    El flag se usa para indicar que queremos alienar a la i(quierda -

    ' printf A1T-D(s19nY $ola[Pola [

    /os "ariantes de s son b & q. El especificador de formato b hace que se interpreten las secuencias de

    escape de los argumentos. Es decir -

    ' printf ATs9nY A$ola 9n"diosYPola ]n?dios

    ' printf ATb9nY A$ola 9n"diosYPola?dios

    La siguiente tabla muestra los flags de los especificadores de formato para n$meros.

    Flag &escripci8n

    B receder por B a los n$meros positi"os.

    Espacio receder por un espacio a los n$meros positi"os.

  • 5/28/2018 Programacion Shell Bash

    53/64

    \ ellenar con (Ps a la i(quierda.

    G receder por (a los n$meros en octal To& por (xa los n$meros enhexadecimal Tx& T.

    E!emplo -

    ' printf A1T=D(d19nY XL[ 5,[

    ' printf A1T(D(d19nY XL[''''''''5,[

    ' printf A1Tx19nY XL[%*[

    ' printf A1Tx19nY XL['%*[

    El comando interno read

    La sintaxis de este comando es -

    read "ar1 "ar& Q

    Esta sentencia lee una l#nea de la entrada estndar & la parte en palabras separadas por el s#mbolo que indiquela "ariableIF;'por defecto espacio o tabulador*.

    ' read %arD %ar %ar=sto es una prueba

    ' echo '%arD=sto

    ' echo '%ares

    ' echo '%aruna prueba

    %i omitimos las "ariables, la l#nea entera se asigna a la "ariableRE![.

    El uso de readrompe esta forma de programar, con lo que se recomienda usarlo con moderacin. 0 lo me!orresulta ms con"eniente pedir un dato como argumento que pedir al usuario que lo introdu(ca con read.

    Las principales opciones del comando read-

    Opci8n &escripci8n

    Aa ermite leer las palabras como elementos de un arra&.

    Ad ermite indicar un delimitador de fin de l#nea.

    Ae 0cti"a las teclas de edicin de readline.

    An max ermite leer como mximo maxcaracteres.

    Ap ermite indicar un texto de prompt.

    At timeout ermite indicar un timeoutpara la operacin de lectura.

  • 5/28/2018 Programacion Shell Bash

    54/64

    E!emplos -

    ' read -a frasePola mundo nue"o

    ' declare -p frasedeclare -a frase7(2'3RPolaR 213RmundoR 2&3Rnue"oR)7

    La opcin -ees recomendable usarla en general siempre, &a que permite que se puedan usar todas lascombinaciones de teclas de readlineen el prompt de read.

    La opcin -nnos permite especificar un n$mero mximo de caracteres a leer. %i se intentan escribir mscaracteres que los indicados en esta opcin simplemente se acaba la operacin de read.

    La opcin -pnos permite aportar un texto de prompt al comando que se imprime antes de pedir el dato-

    ' read -p ACual es tu nombre H\ual es tu nombrearcos

    La opcin -tnos permite dar un tiempo mximo en segundos para el prompt, momento a partir del cual secontinua con el script. Esto es especialmente $til para los scripts de instalacin, donde a "eces eladministrador no est presente esperando a que la instalacin acabe.

    ' read -t D( -p ACual es tu nombre H\ual es tu nombre

    Los blo[ues +e coman+os

    En el siguiente script "eremos que estamos cambiando la entrada estndar para que readlea la entrada.

    ' %i idgrupo*sh

    function idgrupo UVI #hile read nombre asterisco U resto do if 2 K1 Knombre 3T then echo R8ombre rupo KnombreR echo RU rupo KUR echo R

  • 5/28/2018 Programacion Shell Bash

    55/64

    ' %i idgrupo*sh

    function idgrupo UVI #hile read nombre asterisco U resto do

    if 2 K1 Knombre 3T then echo R8ombre rupo KnombreR echo RU rupo KUR echo R

  • 5/28/2018 Programacion Shell Bash

    56/64

    bloque de comandos tiene redirigida su entrada estndar para leer de

  • 5/28/2018 Programacion Shell Bash

    57/64

    *ombnaciones +e teclas [ue en

  • 5/28/2018 Programacion Shell Bash

    58/64

    fijatrap#hile truedo sleep ,'T echo O\ambio de minutoGdone

    ;gnorar se7ales

    %i lo que queremos es ignorar una se7al, simplemente tenemos que pasar una cadena "ac#a 'Z PP* en elargumento cmda trap.

    En el prximo e!emplo "eremos que queremos ignorar la se7al ;IG$!'hangup*, la cual recibe un procesocuando su padre termina 'p.e. el shell* & produce que el proceso hi!o tambin termine.

    function ignorarhuptrap OG PBH

    e"al OKLGtrap S PBH!

    ' ignorarhup du -h

  • 5/28/2018 Programacion Shell Bash

    59/64

    El comando interno Kaittambin puede recibir como argumento el ;/ o el n$mero de !ob del preoceso al quequeremos esperar.

    E!emplo -

    fuenteK1shift

    for destino in OKLGdo cp Kfuente Kdestino Zdone#ait

    Esta solucin espera que todos acaben con Kait.

    Subshells

    @tra forma de comunicacin entre procesos, mediantesubshell & elshellpadre. Lossubshellson parecidos

    a los bloques de comandos, donde tambin podemos redirigir su entrada & salida estndar, slo que ahora seencierran los comandos entre parntesis & elsubshell,a diferencia del bloque de comandos, se e!ecuta en unproceso aparte.

    (for ((i'Ti+Ti))do echo Kidone

    ) [ sort -r

    La principal diferencia entre unsubshell& un bloque de comandos es que el primero se e!ecuta en un

    proceso aparte en un proceso aparte, con lo que es menos eficiente, pero a cambio no modifica "ariables delshell actual, con lo que existe ma&or encapsulacin. or e!emplo, si "amos a fi!ar un trap, lo podemos fi!aren unsubshellpara no afectar al resto del script.

    2uando e!ecutamos unsubshellse hereda del proceso padre, es decir -

    El directorio actual.

    Las "ariables de entorno exportadas.

    Entrada & salida estndar, como as# los errores.

    >o se hereda -

    Las "ariables no exportadas.

    Los traps de se7ales.

    La sustitucin +e procesos

    Existen dos operadores de sustitucin de procesos- /?comandoque asigna la salida estndar del comando aun fichero 'named pipe* de slo lectura, & 0?comandoque asigna la salida del comando a un named pipe deslo escritura.

    E!emplo -

    ' grep ApassKdY /?ls -l

  • 5/28/2018 Programacion Shell Bash

    60/64

    ealmente la sustitucin de comandos lo que nos de"uel"e es el nombre del fichero donde se ha depositadola salida estndar del comando -

    ' echo /?ls -la/de"/fd/,%

    Depurar scripts

    La tcnica ms bsica de depuracin, que seguramente &a cono(ca, es llenar el scripts de echo que muestrancomo e"oluciona el programa. El ob!eti"o de este tema que pueda usar ms & me!ores tcnicas a la hora dedepurar sus scripts.

    6amos a di"idirlo en dos partes, la primera "eremos como se usan ests tcnicas & en la segunda parte"eremos paso a paso como construir un depurador de scripts con =as.

    @pciones de =ash para depuracin

    El shell tiene una serie de opciones para la depuracin las cuales, o bien se pasan como argumentos al lan(arbash, o bien se acti"an con el comandoset -o opcion. %i usamosset -o opcion estamos acti"ando la opcin,si usamosset =o opcionla estamos desacti"ando. Es decir, al re"s de lo que parece.

    Opci8n de set Opci8n de bash &escripci8n

    noexec An >o e!ecuta los comandos, slo comprueba su sintaxis.

    "erbose A" ;mprime los comandos antes de e!ecutarlos.

    xtrace Ax ;mprime los comandos a interpretar & las distintasexpansiones que se reali(an antes de e!ecutarlo.

    La opcinxtracenos muestra tanto el comando a e!ecutar, como la expansin de las sustituciones deparmetros, de las sustituciones de comandos, & todas las dems sustituciones que se realicen.

    E!emplo -

    ' %i lsfecha*shfunction @istaVechals -lad [ grep OK1G [ cut -c54-!

    ls -lad K(@istaVecha OK1G)

    ' bash -x lsfecha B) "ugB @istaVecha 7+ ?ug7 ls -lad :akefile auello lsfecha grep 7+ ?ug7 cut -c54- ls -lad auello-r#r-r- 1 pablo pablo *' &+ ?ug 1,4' auello

    2ada s#mbolo B al principio de una l#nea indica un ni"el de expansin, este s#mbolo es usado por el prompt!;. or e!emplo -

    ' export !;MBxtrace-0B' bash -x lsfecha B) "ugBtrace-F@istaVecha 7+ ?ug7

  • 5/28/2018 Programacion Shell Bash

    61/64

    trace-Fls -lad :akefile auello lsfechatrace-Fgrep 7+ ?ug7trace-Fcut -c54-trace-Fls -lad auello-r#r-r- 1 pablo pablo *' &+ ?ug 1,4' auello

    odemos personali(ar aun ms el prompt poniendo "ariables en ste. or e!emplo, la "ariable especial

    'INENOnos permite sabe la l#nea del script que estamos e!ecutando.

    ' export !;MB'(H'INENOHB' bash -x lsfecha B) "ugBllsfecha1&@istaVecha 7+ ?ug7llsfecha+ls -lad :akefile auello lsfechallsfecha+grep 7+ ?ug7llsfecha+cut -c54-lsfecha1&ls -lad auello-r#r-r- 1 pablo pablo *' &+ ?ug 1,4' auello

    La opcin noexecsir"e para que =ash no e!ecute los comandos, slo lea los comandos & compruebe susintaxis. %in embargo una "e( que acti"a esta opcin conset -o noexec&a no podr "ol"er a desacti"arla, &aque el comandoset =o noexecser parseado pero no e!ecutado por =ash.

    ' bash -n lsfecha B) "ugB

    ]a3e signals

    Las faPe signals'falsas se7ales* son un mecanismo mu& potente de a&uda a la depuracin. %e trata dese7ales producidas por =ash, & no por un programa o suceso externo al shell.

    ;eal &escripci8n

    %;

  • 5/28/2018 Programacion Shell Bash

    62/64

    La se7al se lan(a independientemente de como acabe el script- or e!ecutar la $ltima l#nea, o por encontrarun exit.

    La se7al %;G, la se7al ;IGRE#RNno es heredada por las funciones. /e nue"o podemos hacerque una funcin herede esta se7al, declarando a la funcin con declare -t, o bien acti"ando la opcinset -ofunctrace.

    Un +epura+or Bash

    Existe un un depurador en bash llamado bashdb la forma de instalarlo es la siguiente -

    ' apt-get install bashdb

  • 5/28/2018 Programacion Shell Bash

    63/64

    E!emplo -

    ' %i eQemplo*sh

    NM/bin/bash

    echo R=sto es un ejemploR

    for i in 6se 1 1'6Tdoecho Kidone

    ' chmod =x eQemplo*sh' bashdb --debugger eQemplo*sh

    bash Ihell ebugger0 release 4.'-'.4

    \opyright &''&0 &''%0 &''40 &'',0 &''0 &''*0 &''+

  • 5/28/2018 Programacion Shell Bash

    64/64

    run 6ol"er a e!ecutar.