You are on page 1of 125

COMANDOS SHELL Y PROGRAMACIN EN LA SHELL DEL BASH

SISTEMAS OPERATIVOS I.T. INFORMTICA DE GESTIN

NDICE

ndicedeContenidos
1.REPASOCONCEPTOSBSICOSDEUNIX/LINUX.................................................................1 1.1.Elsistemadeficheros...............................................................................................................1 1.1.1.Movindonosporelsistemadeficheros............................................................................2 1.2.Manipulacin...........................................................................................................................3 1.3.Laayudadelsistema................................................................................................................3 1.4.Patrones(metacaracteresdesustitucin).................................................................................4 1.4.1.Igualandouncarctersimplecon?...................................................................................5 1.4.2.Igualandoceroomscaracterescon*..............................................................................5 1.4.3.Igualandoceroomscaracterescon[].............................................................................6 1.4.4.Abreviandonombredearchivoscon{}............................................................................6 1.5.Bsqueda..................................................................................................................................7 1.6.Tiposycontenidosdeficheros................................................................................................7 1.7.Permisos...................................................................................................................................9 1.7.1.Resumendecomandos....................................................................................................11 2.COMANDOSSHELLI................................................................................................................12 2.1.ElsistemaOperativoLinux....................................................................................................12 2.1.1.EstructuraeInterfacesdeLinux......................................................................................13 2.2.Losinterpretesderdenes.....................................................................................................14 2.3.Unasesindetrabajo.............................................................................................................16 2.3.1.Elsistemadearchivos......................................................................................................17 2.3.2.Elshelldeentrada...........................................................................................................18 2.4.Losprocesos.........................................................................................................................19 2.4.1.Algunasherramientasparavigilarprocesos....................................................................20 2.4.2.Metacaracteressintcticos...............................................................................................21 2.4.3.rdenesparaelcontroldetrabajos.................................................................................26 2.5.Metacaracteresdeentrada/salidaodedireccin...................................................................29 2.6.Empaquetadoycompresindearchivoscontarygzip.........................................................34 2.7.Ejercicios...............................................................................................................................38 3.COMANDOSSHELLII...............................................................................................................42 3.1.Historiaderdenes................................................................................................................42 3.2.Autocompletarconeltabulador............................................................................................46 3.3.Metacaracteres.......................................................................................................................46 3.3.1.Metacaracteressintcticos...............................................................................................47 3.3.2.Metacaracteresdenombredearchivos...........................................................................47 3.3.3.Metacaracteresdecitacin..............................................................................................48 3.3.4.Metacaracteresdeentrada/salidaodedireccin.............................................................50 3.3.5.Metacaracteresdeexpansin/sustitucin........................................................................50
I

NDICE

3.4.Losalias.................................................................................................................................51 3.4.1.Definicinyeliminacindealias....................................................................................51 3.4.2.Listarladefinicindelosaliasexistentes......................................................................52 3.4.3.Renombraroredefinirunaordenexistente....................................................................52 3.4.4.Crearunanuevaorden...................................................................................................52 3.5.Variables................................................................................................................................53 3.5.1.Variablesdeentornoyvariableslocales..........................................................................53 3.5.2.Creacindevariables.....................................................................................................54 3.5.3.Personalizarelprompt....................................................................................................56 3.5.4.Variablesdeentornointernas..........................................................................................58 3.5.5.Exportarvariables...........................................................................................................59 3.6.Scripts....................................................................................................................................59 3.6.1.Primerospasosconscripts..............................................................................................60 3.6.2.Variableenlosscripts.....................................................................................................62 3.6.3.Pasodeargumentosalosscripts.....................................................................................64 3.7.Ejercicios...............................................................................................................................68 4.PROGRAMACINBASHI.........................................................................................................71 4.1.Variablescontipo...................................................................................................................71 4.2.Expresionesaritmticas.........................................................................................................73 4.2.1.Expansindelshell$((expresin))..................................................................................74 4.2.2.SimilitudconlasexpresionesaritmticasC...................................................................75 4.2.3.Elcomandointernolet....................................................................................................75 4.3.Lassentenciascondicionales.................................................................................................76 4.3.1.Lassentenciasif,elifyelse.............................................................................................76 4.3.2.Loscdigosdeterminacin............................................................................................77 4.3.3.Lasentenciaexit..............................................................................................................78 4.3.4.Operadoreslgicosycdigosdeterminacin................................................................78 4.3.5.Testcondicionales...........................................................................................................79 4.3.6.Ifaritmtico....................................................................................................................85 4.4.Elbuclefor............................................................................................................................85 4.5.Bucleswhileyuntil...............................................................................................................88 4.6.Entradaysalidadetexto........................................................................................................90 4.6.1.Elcomandointernoecho.................................................................................................90 4.6.2.Elcomandointernoprintf...............................................................................................92 4.6.3.Elcomandointernoread.................................................................................................95 4.7.Ejercicios...............................................................................................................................97 5.PROGRAMACINBASHII........................................................................................................99 5.1.Lasentenciacase....................................................................................................................99 5.2.Lasentenciaselect...............................................................................................................100 5.3.Lasentenciashift.................................................................................................................102
II

NDICE

5.4.Listas(Arrays).....................................................................................................................103 5.5.Funciones.............................................................................................................................108 5.6.Operadoresdecadena..........................................................................................................110 5.6.1.Operadoresdesustitucin..............................................................................................110 5.6.2.Operadoresdebsquedadepatrones............................................................................114 5.6.3.Eloperadorlongitud......................................................................................................117 5.7.Sustitucindecomandos......................................................................................................117 5.8.LosficherosdeconfiguracindeBash................................................................................118 5.9.Ejercicios.............................................................................................................................120

III

1.- REPASO CONCEPTOS BSICOS DE UNIX/LINUX

1. REPASOCONCEPTOSBSICOSDEUNIX/LINUX
1.1. Elsistemadeficheros
Todosistemaoperativonecesitaguardarmultituddearchivos:desdelosdelaconfiguracindel sistema,losdelog,losdelosusuarios,etc.Engeneral,cadasistemaoperativoutilizasupropio sistema de ficheros, caracterizndolo en muchos aspectos como pueden ser el rendimiento, seguridad,fiabilidad,etc. Loprimeroquedebemostenerclaroesquetodoelsistemadeficherospartedeunamismaraz, alacualnosreferiremosconelcarcter'/'.Eselorigendetodoelsistemadeficherosysloexiste una. Para organizar los ficheros adecuadamente, el sistema proporciona lo que llamaremos directorios(ocarpetas),dentrodelascualespodemosponerarchivosymsdirectorios.Deesta formaconseguimosunaorganizacinjerrquicacomolaquevemosenlasiguientefigura:

Figura1.1:Sistemadearchivos

1.1.- El sistema de ficheros

Elcomandobsicoparacrearundirectorioesmkdir.Porsuparte,siqueremoscrearunarchivo sepuedeutilizarcualquiereditordetexto,comosevermsadelante.

1.1.1. Movindonosporelsistemadeficheros
Para movernos por la estructura de directorios debemos utilizar los comandos para listar contenidos y cambiar de carpeta. Si queremos ver lo que hay en el directorio donde estemos situadospodemoslistarloscontenidosutilizandoelcomandols.Debemostenerencuentaquepor defecto el comando nonos muestra losarchivos queempiezan por unpunto.Paracambiar de directoriopodemosutilizarelcomando cd.Sinolepasamosningnparmetro,pordefectonos situarennuestrodirectoriohome;silepasamoscomoargumentos..,nossituareneldirectorio superior. Generalmente, se le suele indicar dnde queremos ir, pasndolo de forma absoluta o relativa.Deformarelativasignificaquepartiremosdeldirectoriodondeestemosenelmomentode ejecutar el comando. Por ejemplo, si estamos en el directorio /Directorio1/Directorio1_1/ y queremosiral/Directorio3/,deberamosintroducirelsiguientecomando:cd../../Directorio3. Deformaabsolutasiemprepartimosdelaraz,demaneraqueelcomandoqueutilizaramosparael ejemploanteriorsera:cd/Directorio3.Parasaberenqudirectorioestamospodemosutilizarel comandopwd.
1. Visualiceelcaminocompletodeldirectorioactual. 2.Visualicelosficherosdeldirectorioactual. 3.Cree la siguiente estructura de directorios dentro de su directoriohome. /curso0607 /pract1/pract2/pract3

1.2.- Manipulacin

1.2. Manipulacin
Ahora que ya sabemos movernos correctamente por la jerarqua de directorios tambin necesitamossabercmocopiar,eliminarymanipularcorrectamenteotrosaspectosdelosficheros. Elcomandormeselqueseencargadeeliminarlosarchivosqueleindiquemos.Paraeliminarun directorio,podemosutilizarelcomandormdir,aunquesloloborrarcuandosteestvaco.Para copiararchivosdeunlugaraotrotenemoselcomando cp,conelcualsiempredebemosindicarleel ficheroodirectorioorigenyellugaronombrededestino,aunqueseaeneldirectorioactual.Sien lugardecopiarlosarchivosqueremosmoverlosdesitiopodemosutilizarelcomando mv.Este comandotambinseutilizapararenombrararchivos.
4.Crea en el directorio pract2 un archivo que se llame apuntes.txtyotroquesellamaejercicios.txt 5.Escribealmenos5lneasencadauno 6.Copiaelficheroapuntes.txteneldirectoriopract3 7. Muevaelficheroejercicios.txtaldirectoriopract1 8.Borraelarchivoapuntes.txtdeldirectoriopract2 9.Borraeldirectoriopract2 10.Cmbialeelnombrealficheroapuntes.txpornotas.txt

1.3. Laayudadelsistema
Todosloscomandosqueveremostienenmultituddeopcionesyparmetrosdiferentesquenos permitenmanipularlosdelaformaquequeramos.Desdeelprincipiosetuvomuyencuentaquees imprescindible contar con una buena documentacin para todos ellos. Igualmente, toda esta informacin tambin es necesaria para los ficheros de configuracin del sistema, las nuevas aplicacionesqueutilizamos,etc.Esporestoqueelmismosistemaincorporaunmecanismode manuales con el que podemos consultar casi todos los aspectos de los programas, utilidades, comandosyconfiguracionesexistentes.Elcomandomsutilizadoesel man,quenosenseael manual del programa que le indiquemos como parmetro. Por defecto esta documentacin es mostradautilizandoelprogramaless,conelcualpodemosdesplazarnoshaciaadelanteyhaciaatrs conlasteclasdeAVPGyREPG,buscarunapalabraconelcarcter/seguidodelapalabray
3

1.3.- La ayuda del sistema

qparasalir. Sihaymsdeunmanualdisponibleparaunamismapalabra,podemosespecificarlopasndole el nmero correspondiente de la seccin deseada antes de la palabra, por ejemplo man 3 printf. Como los otros comandos, man tambin tiene multitud de opciones diferentes documentadasensupropiomanualmanman.Unadeestasopcionesquenospuedeirmuybien en las ocasiones que no sepamos exactamente el programa que estamos buscando es k' (el comandoaproposhacecasiexactamentelomismo).Conmankseguidodeunapalabraque haga referenciaalaaccinquequeramosrealizarse buscar por entretodoslosmanuales del sistemaysemostrarnlosqueensudescripcinonombreaparezcalapalabraindicada.Deesta forma,podemosencontrartodolosqueramossintenerquerecurriraningnlibrooreferencia externaalsistema. Sielmanualnonosproporcionatodalainformacinquenecesitemostambinpodemosusarel comandoinfo,queeslomismoqueelmanualperoanmsextendido.Silonicoquequeremoses tenerunabrevereferenciadeloquehaceundeterminadoprogramapodemosutilizarelcomando whatis.
11.Pidaayudasobreloscomandosmarcadosennegrita 12.Busquecomandosquepermitancomparar(cmp).

1.4. Patrones(metacaracteresdesustitucin)
Unmecanismomuytilquenosproporcionaelsistemasonlospatterns(patrones).Hastaahora hemos visto como aplicar ciertas operaciones sobre un determinado archivo. Cuando estamos manipulandounsistema,enmuchoscasosnosinteresar aplicaralgunadelasoperacionesque hemos visto pero sobre un grupo grande de ficheros. Los patrones nos permitirn aplicar las operacionesquequeramosespecificando,enunasolainstruccin,variosficherosquecumplancon unaseriedecaractersticasespecificadas.Debemosverloscomoplantillasdenombres,quenos permitenhacerreferenciadeformaabreviadaaunaseriedearchivoscuyosnombressiguenun patrn.LaTabla1.1muestraestosmetacaracteres.

1.4.- Patrones (metacaracteres de sustitucin)

Metacaracter ? * []

Descripcindelafuncin Comodnacualquiercarctersimple Igualacualquiersecuenciadeceroomscaracteres Designauncarcterorangodecaracteresque,comounaclase, sonigualadosporunsimplecarcter.Paraindicarunrango, mostramoselprimeryelltimocarcterseparadosporunguin ().Conelsmbolo!indicamosnegacin. Abreviarconjuntosdepalabrasquecompartenpartescomunes Seusaparaabreviarelcaminoabsoluto(path)deldirectorio home
Tabla1.1:Patrones

{} ~

1.4.1. Igualandouncarctersimplecon?
Esmuyfrecuentecreararchivosconalgnpatrncomopartedesunombre.Porejemplo,para realizarunasprcticas,nombramoscadaarchivocomopractica_1.txt,practica_2.txt,practica_3.txt, etc.Siquisiramosobtenerinformacindelosarchivosconls,podramosdarlasrdenes:

$ls lpr actica_1 .txt practica_ 2.txt p racti ca_3.t xt rwrr1mluquemluque3Oct119:44practica_1.txt rwrr1mluquemluque3Oct119:44practica_2.txt rwrr1mluquemluque3Oct119:44practica_3.txt

$ls lpr actica_?. txt #Formamscompacta;cada?igualauncarcter. rwrr1mluquemluque3Oct119:44practica_1.txt rwrr1mluquemluque3Oct119:44practica_2.txt rwrr1mluquemluque3Oct119:44practica_3.txt

1.4.2. Igualandoceroomscaracterescon*
El carcter especial * iguala cero o ms caracteres. Por ejemplo, los archivos listados
5

1.4.- Patrones (metacaracteres de sustitucin)

anteriormente,podemosverlosusandolacadenadeigualacinpractica_*:
$lsl p ractic a_* rwrr1mluquemluque3Oct119:44practica_1.txt rwrr1mluquemluque3Oct119:44practica_2.txt rwrr1mluquemluque3Oct119:44practica_3.txt

RecordadqueenLinuxnoexisteelconceptodenombreyextensinalahoradenombrar archivos.Elpuntoesuncarctermspermitidoenelnombredeunarchivo.

1.4.3. Igualandoceroomscaracterescon[]
Loscorchetesdefinenunalista,oclasedecaracteres,quesepuedenigualarconunslocarcter. Acontinuacin,ilustramosalgunasformasdecaracterizargruposdearchivos: [AZ]* *[aeiou] tema.*[13579] tema.0[13] [AZaz][09]* Igualatodoslosarchivosquecomienzanconunaletramayscula. Igualacualquierarchivoquefinaliceconunavocal. Igualalostemasquefinalizanconunnmeroimpar Igualatema.01,tema.02,tema.03. Iguala los archivos que comienzan con una letra (mayscula o minscula),seguidadeundgito,yceroomscaracteres. [!AZ]* Igualalosarchivosquenocomiencenporunaletramayscula

13.Sitateentuhome 14.Listartodoslosarchivosqueempiecenpors, 15.Listartodoslosarchivosquecontenganunaa 16.Listartodoslosarchivosqueempiecenpora'opor``b''y quecontengancualquierotracadena.

1.4.4. Abreviandonombredearchivoscon{}
Elusodelasllaves({}),solasocombinadasconlosanteriorescaracteresespeciales(?,*,[]),nos
6

1.4.- Patrones (metacaracteres de sustitucin)

vanapermitirformasexpresionesdenombresdearchivosmscomplejas.Lasllavescontienenuna listadeunoomscaracteresseparadosporcomas.Cada temdelalistaseutilizaenturnopara expandirunnombredearchivoqueigualalaexpresincompletaenlaqueestninmersaslasllaves. Porejemplo, a{f,e,d}b seexpandeen afb,aeb y adb,enesteordenexactamente.Las llavessepuedenutilizarmsdeunavezenunaexpresin.Laexpresin s{a,e,i,o,u}{n,t}se expandeensan,sen,sin,son,sun,sat,set,sit,sotysut.

1.5. Bsqueda
Otrotipodeoperacinmuy tileslabsquedadeficheros.Tenemosvarioscomandosquenos permiten realizarbsquedasdediferentestipossobretodoslosficheros delsistema. find es el comando ms verstil para realizar esta accin. locate es otro comando pero, a diferencia del anterior, utilizaunabasededatosinternaqueseactualizaperidicamenteynospermitehacer bsquedasbastantemsrpidas.Paraacabarconloscomandosdebsqueda, whereisestorientado alabsquedadelosarchivosbinarios(losejecutables),deayudaolosdecdigofuentedeun determinadoprograma.
17.Busca todos los archivosqueempiecenpormeneldirectorio /usr/bin 18.Buscalalocalizacindelcomandols

1.6. Tiposycontenidosdeficheros
Utilizarlaextensinparadeterminareltipodeunarchivonoesunsistemamuyeficazyaque cualquierapuedecambiarlaygenerarconfusionesyerroresenelsistema. Losarchivosquetenemosennuestrosistemapuedenserdemuchostiposdiferentes:ejecutables, detexto,dedatos,etc.Adiferenciadeotrossistemas,queutilizanlaextensindelarchivopara determinar de qu tipo son, GNU/Linux utiliza un sistema denominado de magic numbers, determinandoconunnmeromgicoeltipodeficherosegnsusdatos.Elcomando file noslo indica.

1.6.- Tipos y contenidos de ficheros

$/tm p/pr ueb a$f ile* practica_1.txt:ASCIItext practica_2.txt:ASCIItext practica_3.txt:ASCIItext 14.Miradequetiposonlosarchivoscontenidoseneldirectorio pract3 15.Averigua de que tipo son los archivos que empiezan por m en /usr/bin

Sinecesitamosverelcontenidodeunfichero,unodeloscomandosmsbsicosesel cat. Pasndoleelnombre/sdelarchivo/squequeramosver,sencillamentesemuestraporpantalla.


$/tmp/prueba$catpractica_1.txt p1

Paraficherosmuyextensosnosirnmuchomejorloscomandos less o more,quepermiten desplazarnosporelficherodeformaprogresiva.Sieltipodeficheroesbinarioyqueremosverqu contienepodemosutilizarloscomandoshexdumpuodparaverelcontenidodeformahexadecimal uotrasrepresentaciones.


16.Visualizaelcontenidosdelarchivopracticas.txt

Otrotipodecomandomuy tilsonlosquenosbuscanunciertopatrnenelcontenidodelos ficheros.Conelcomandogreplepodemospasarcomosegundoparmetroelnombredelarchivoy comoprimeroelpatternquequeramosbuscar.


greppr intf *.c Buscalapalabraprintfentodosl

losarchivosacabadosen.c

$gr ep p*.txt practica_1.txt:p1 practica_2.txt:p2 practica_3.txt:p3

1.6.- Tipos y contenidos de ficheros

Con cut podemossepararencamposelcontenidodecadalneadelficheroespecificandoqu carctereselseparador,muytilentareasdeadministracindelsistemaparasuautomatizacin.De igualforma,conpastepodemosconcatenarlalneasdediferentesficheros.Tambinpodemoscoger undeterminadonmerodelneasdelprincipioofindeunarchivoconloscomandosheady tail respectivamente.Con wc podemoscontarelnmerodelneasopalabras,lamximalongitudde lneadeunfichero,etc.
17.Buscalaslabamaenelficheroapuntes.txt 18.Visualizalasprimeraslineasdelficheroasignatura.txt 19.Visualizalasultimaslneasdelficheroapuntes.txt

Finalmente,paraacabarconestaseccindemanipulacindeficheroslonicoquenosfaltapor ver es cmo comparardiferentesarchivos. Igualqueconlasotrasoperaciones,tenemosvarios comandos que nos permiten hacerlo. diff, cmp y comm realizan comparaciones de diferentes formasymtodosenlosficherosquelesindiquemos.

1.7. Permisos
Encualquiersistemaoperativomultiusuarionecesitamosquelosficherosqueguardamosen nuestro disco puedan tener una serie de propiedades que nos permitan verlos, modificarlos o ejecutarlosparalosusuariosquenosotrosdefinamos.Aunquehayvariasalternativasparahaceresto UNIXutilizaelsistemaclsico,quecombinadocontodoslosmecanismosdegestindeusuariosy grupos nos permite cualquier configuracin posible. La idea es definir, para cada fichero o directorio,aqu usuarioygrupoperteneceyqu permisostieneparacadaunodeellosyparael restodeusuariosdelsistema.Ejecutando``lsl''veremoscomoporcadaarchivodeldirectorio dondeestemosapareceunalneaparecidaalasiguiente:
rwxrxrx1user1grupo1128931Feb192000gpl.txt

Losprimerosdiezcaracteres(empezandoporlaizquierda)nosindicanlospermisosdelfichero delasiguienteforma: Carcter1:estaentradanosindicasiesunficherooundirectorio.Encasodeserunfichero


9

1.7.- Permisos

apareceelcarcter,mientrasqueporlosdirectoriosapareceunad'. Caracteres2,3,4:nosindican,respectivamente,lospermisosdelectura,escriturayejecucin para el propietario del fichero. En caso de no tener el permiso correspondiente activado encontramoselcarcter``''ysino``r'',``w''o``x''segnsilopodemosleer(Read),escribir(Write) oejecutar(eXecute). Caracteres5,6,7:estoscaracterestienenexactamenteelmismosignificadoqueanteriormente pero haciendo referenciaalospermisos dadosparalosusuariosdelgrupoalquepertenece el fichero. Caracteres8,9,10:igualqueenelcasoanteriorperoparatodoslosotrosusuariosdelsistema.
20.Determinequepermisostienenlosarchivosdelosdirectorios pract1,pract2,pract3

Para cambiarlospermisosdeundeterminadoarchivopodemosutilizarelcomando chmod. Debemos tener en cuenta que slo el propietario del archivo (o el root) puede cambiar estos permisosyaquesinotodoelmecanismonotendraningnsentido.Lospermisosseindicanconun nmerodetrescifrascomprendidoentreel000yel777,dondecadaunadelascifrascodificalos permisos (lectura, escritura y ejecucin) asociados al propietario del archivo, al grupo al que perteneceelarchivoyalrestodeusuarios,respectivamente.Algunosejemplos
744=111100100=rwxrr 777=111111111=rwxrwxrwx 654=110101100=rwrxr

Paracambiarelpropietariodeunfichero,existeelcomando chown,queslopuedeutilizarel rootporrazonesdeseguridad.Paracambiarelgrupodeundeterminadoarchivosepuedeutilizarel comandochgrp.Comopodemossuponer,cuandounusuariocreaunnuevoarchivo,elsistemapone comopropietarioelusuarioquelohacreadoypertenecientealgrupoprimariodelmismousuario. Lospermisosqueseponenpordefectoalcrearunnuevoarchivolospodemosconfigurarconel comandoumask.

10

1.7.- Permisos

1.7.1. Resumendecomandos
EnlaTabla1.2sepuedenverlamayoradeloscomandosmencionadosanteriormente.

Comando apropos cat cd cmp,diff cp chgrp chmod chown file find grep head info less

Descripcin informasobreuncomando visualizaelcontenidodeun fichero cambiadedirectorio comparaficheros copiaarchivos cambiaelgrupodeunarchivo cambialospermisosdeun archivoodirectorio cambiaelpropietariodeun archivo indicaeltipodefichero bsquedadeficheros buscaunpatrnenunfichero visualizanlineasdelcomienzo delfichero idemmanperomsextenso igualacat

Comando locate ls man mdkir more mv pwd rm rmdir tail umask wc whatis whereis

Descripcin bsquedadeficheros listaelcontenidodeundirectorio enseaelmanualsobreun comando creaundirectorio igualacat muevearchivos muestraeldirectorioenquenos encontramos borraarchivos borradirectorios visualizanlineasdelfinaldel fichero cambialospermisospordefecto deunarchivoalsercreado cuentalneas/palabras brevereferenciasobreun comando bsquedadearchivosbinarios

Tabla1.2:Comandosmsusuales

11

2.- COMANDOS SHELL I

2. COMANDOSSHELLI
2.1. ElsistemaOperativoLinux
Linuxesun Unixlibre,esdecir,unsistemaoperativo,comoelWindowsoelMSDOS(sin embargo,adiferenciadeestosyotrossistemasoperativospropietarios,hasidodesarrolladopor milesdeusuariosdecomputadoresatravsdelmundo,yladesventajadeestosesqueloquetedan esloquetuobtienes,dichodeotraformanoexisteposibilidadderealizarmodificacionesnide sabercomoserealizdichosistema),quefuecreadoinicialmentecomounhobbieporunestudiante joven,LinusTorvalds,enlauniversidaddeHelsinkienFinlandia,conasistenciaporungrupode hackersatravsdeInternet.LinuxtenaunintersenMinix,unsistemapequeooabreviadodel UNIX(desarrolladoporAndyTanenbaum);ydecididoadesarrollarunsistemaqueexcedi los estndaresdeMinix.Querallevaracabounsistemaoperativoqueaprovechaselaarquitecturade 32bitsparamultitareayeliminarlabarrerasdeldireccionamientodememoria. Torvaldsempezescribiendoelncleodelproyectoenensamblador,yluegocomenz aaadir cdigoenC,locualincrementlavelocidaddedesarrollo,ehizoqueempezaraatomarseenserio suidea. Comenzsutrabajoen1991cuandorealizlaversin0.02,lacualnosedioaconocerporqueni siquieratenadriversdedisquete,ademsdellevarunsistemadealmacenamientodearchivosmuy defectuoso.Trabajconstantementehasta1994enquelaversin1.0delncleo(KERNEL)deLinux seconcret.Actualmente,laversincompletamenteequipadaesla2.6.18.1(versindeoctubrede 2006),yeldesarrollocontina(sepuedenconsultarenkernel.org). LinuxtienetodaslasprestacionesquesepuedenesperardeunUnixmodernoycompletamente desarrollado: multitarea real, memoria virtual, bibliotecas compartidas, carga de sistemas a demanda,compartimiento,manejodebidodelamemoriaysoportederedesTCP/IP. LapartecentraldeLinux(conocidacomoncleookernel)sedistribuyeatravsdelaLicencia PblicaGeneralGNU,loquebsicamentesignificaquepuedesercopiadolibremente,cambiadoy
12

2.1.- El sistema Operativo Linux

distribuido, pero no es posible imponer restricciones adicionales a los productos obtenidos y, adicionalmente,sedebedejarelcdigofuentedisponible,delamismaformaqueestdisponibleel cdigodeLinux.AncuandoLinuxtengaregistrodeCopyright,ynoseaestrictamentededominio pblico,lalicenciatieneporobjetoasegurarqueLinuxsigasiendogratuitoyalavezestndar. Por su naturaleza Linux se distribuye libremente y puede ser obtenido y utilizado sin restriccionesporcualquierpersona,organizacinoempresasqueaslodesee,sinnecesidaddeque tenga que firmar ningn documento ni inscribirse como usuario. Por todo ello, es muy difcil establecer quienesson losprincipalesusuariosdeLinux.Noobstantesesabequeactualmente LinuxestsiendoutilizadoampliamenteensoportarserviciosenInternet,loutilizanUniversidades alrededor del todo el mundo para sus redes y sus clases, lo utilizan empresas productoras de equipamientoindustrialparavendercomosoftwaredeapoyoasumaquinaria,loutilizancadenasde supermercados,estacionesdeservicioymuchasinstitucionesdelgobiernoymilitaresdevarios pases.Obviamente,tambinesutilizadopormilesdeusuariosensuscomputadorespersonales.El apoyomsgrande,sinduda,hasidoInternetyaqueatravsdeellasehapodidodemostrarquese puedecrearunsistemaoperativoparatodoslosusuariossinlanecesidaddefineslucrativos.

Linuxtieneunamascotaoficial,elpinginodeLinux,quefueseleccionadoporLinusTorvalds pararepresentarlaimagenqueseasociaalsistemaoperativoquelcre. BsicamentepodemosdecirquehoyLinuxesunsistemamuycompleto.ElproyectodeLinus Torvaldsannohaterminado,ysepiensaquenuncaseterminarporstacontinuaevolucindela Informtica.

2.1.1. EstructuraeInterfacesdeLinux
Comomuchossistemas,Linuxpuedeversecomounapirmide(Figura2.1).Enlabasetenemos elhardware,ysobre l,elsistemaoperativo.Sufuncinescontrolarelhardwareysuministrarla interfazdellamadasalsistemaatodoslosprogramas.Estainterfazpermitealosusuarioscreary gestionar procesos, archivos, y otros recursos. Como las llamadas al sistema deben hacerse en
13

2.1.- El sistema Operativo Linux

ensamblador,elsistemadisponedeunabibliotecaestndarparafacilitarlalabordelprogramador,y quepuedeserinvocadadesdeunprogramaenC.Ademsdelsistemaoperativoylabibliotecade llamadas alsistema,Linuxsuministraun grannmero deprogramasestndares.Entreestos se incluyeintrpretesderdenes,compiladores,editores,yutilidadesdemanipulacindearchivos.

Figura2.1:LascapasdelsistemaUNIX

Elobjetivodenuestrasprcticasesaprenderamanejarlainterfazdeusuariomedianteelusode rdenesyshell.

2.2. Losinterpretesderdenes
Unintrpretede rdenes,oshellenlaterminologaLinux,est construidocomounprograma normaldeusuario.Estotienelaenormeventajadequepodemoscambiardeintrpretede rdenes segnnuestrasnecesidadesopreferencias.Existendiferentesshells:elBourneAgainShell(bash), elTCshell(tcsh),yelZshell.EstosshellsnosonexclusivosdeLinux,sedistribuyenlibrementey puedencompilarseencualquiersistemaUNIX.Podemosverlosshelldelosquedisponenuestro sistemamirandoenelarchivo/etc/shells. Elshellesunprogramaquebsicamenterealizalassiguientestareas:
for(;;){ imprimeindicadorderdenes; leelalneadeordenes; analizalalneadeordenes(arg0,arg1,...,>,<,|,&,...); preparaentornosegnloqueapareceenlneadeordenes; creaunprocesoparaejecutarorden;
14

2.2.- Los interpretes de rdenes

if(estamosenelprocesohijo){ ejecutalaordendadaenarg0; else/*eselprocesopadre*/ if(lneaordenesnoapareceelsmbolo&) esperahastaquefinaliceelhijo; } }

Cadashell,ademsdeejecutarlasrdenesdeLINUX,tienesuspropias rdenesyvariables,lo queloconvierteenunlenguajedeprogramacin.Laventajaquepresentafrenteaotroslenguajeses sualtaproductividad,unatareaescritaenellenguajedelshellsueletenermenoscdigoquesiest escritaenunlenguajecomoC. RespectoacuandoutilizarelshellycuandoutilizarotrolenguajedeprogramacincomoC, indicarcomorecomendacingeneralquedebemosutilizarelshellcuandonecesitemoshaceralgo conmuchosarchivos,odebamosdehacerlamismatarearepetitivamente.Nodeberamosusarel shellcuandolatareaseamuycompleja,requieragraneficiencia,necesitedeunentornohardware diferente,orequieradiferentesherramientassoftware. Respecto alas rdenes,enelbash(elquenosotrosvamosautilizarenprcticas)podemos encontrarlossiguientestipos: 1.Alias:sonabreviacionesparardenesexistentesquesedefinendentrodelamemoriadel shell. 2.Ordenesempotradas:rutinasimplementadasinternamenteenelshell. 3.Programasejecutables:programasqueresidenendisco. Cuandoelshellest preparadoparaejecutarunaorden,evalaeltipodeordensegnelorden queapareceenlalistaanterior:compruebasiesunalias;sino,siesunaordenempotrada;ypor ltimo,unprogramaejecutable(eneste ltimocasolaeficienciaesmenorpueshayqueaccedera discoparalocalizarelejecutabledelaorden).Portanto,sitenemosunaliasconelmismonombre queunprogramaejecutable,primeroejecutaraelalias.

15

2.2.- Los interpretes de rdenes

Lospropiosshellsecomportancomounaorden,esdecirsepuedenejecutar.
Miradequeshellsdisponeelsistemayentraenalgunadeellas. Entrarenunashell=nombredelashell(lasshellseencuentran en/bin/) Salirdeunashell=exit,oCtrl+D

2.3. Unasesindetrabajo
Cuandoarrancamoselsistema,trasmuchosmensajesdeinicializacin,apareceunapantalla grficaquenospedirlassiguienteinformacin
login:i62xxxx password:

En este momento, el programa /bin/login verifica nuestra identidad comprobando el primer campodelarchivo/etc/passwdquecontienenuestronombreusuario.Sinuestronombreestaall, compara el passworddado,opalabracalve,conlaformaencriptadadelmismoquehayen el archivo/etc/shadow.Unavezverificado,elprogramaloginestableceelentornodetrabajoquese pasar alshell,esdecir,seasignanalasvariablesHOME,SHELL,USER,yLOGNAMElos valoresextradosdelarchivo/etc/passwd.Despus,secreaelshelldeentradaologinshell,conlo quepodemosiniciarlasesindetrabajo. Lapalabraclavedebemantenerseensecretoparanuestraproteccinycambiarseconcierta frecuencia(almenosdosvecesalao).Podemoscambiarlaclavedeaccesoconlaordenpasswd. Unavezenelsistema,disponemosdeunmanualenlneaparaconsultarlasintaxisyopciones de sus rdenes, e incluso algunos ejemplos de como se utiliza. El manual en lnea se puede consultarconlaordenman,cuyasintaxises:
man[opciones][seccin]orden

Porejemplo,siqueremosverquehaceycualessonlasopcionesdelaorden ls,quelistael contenidodeundirectorio,podemosejecutar

16

2.3.- Una sesin de trabajo

manls

Slocomentarlaopcink quemuestralasseccionesqueestnrelacionadasconunapalabra clave.Estaesmuytilcuandosabemosloquequeremoshacerperonoconocemoslaordenquelo hace.Laordenaproposrealizalamismafuncin.


mank<palabraclave> apropos<palabraclave>

Buscalaspginasdeayudarelacionadasconlosprogramasshell

2.3.1. Elsistemadearchivos

Figura2.2:ElsistemadearchivosdeLinux

Unodeloselementosdelsistemaconelqueinteraccionamosmuyfrecuentementeeselsistema dearchivos.EnLinux,todoslosarchivosestnalmacenadosenunajerarquaconestructurade rbol,queconstadearchivosydirectorios,similaraldeWindows.Enlapartemsaltadel rbol, esteldirectorioraz,queserepresentaconun/,delcuelgantodoslosdirectoriosyarchivosdel sistema.Cuandoelnombredeunarchivocomienzapor/,estamosindicandoqueesunnombrede archivoabsoluto(cuelgadeldirectorioraz).Cuandoencontramoselsmbolo/entreelnombrede unarchivoodirectorio,steseutilizasimplementecomoseparador.


17

2.3.- Una sesin de trabajo

Los directorios que aparecen en un sistema Linux pueden variar de unas instalaciones, y versiones, a otras, pero casi siempre encontraremos algunos directorios comunes a todos los sistemas.LamayoradelossistemassiguenelestndarFHSquedeterminadondedebencolarselos ficherossegnsutipoyuso.Porejemplo,ydeformasimplista:
/binDirectorioconprogramasejecutablesdelsistema /bootImagendelsistema /devDirectoriodedispositivos /etcDirectoriodearchivosdeconfiguracin /homeDelcuelganlosdirectoriosdelosusuarios /libBibliotecasdeprogramacinestndares /sbinOrdenesdeadministracindelsistema /tmpDirectorioparaarchivostemporales /usrDirectoriodeprogramas /usr/binDirectoriodeprogramasejecutablesdeaplicacin /usr/X11ArchivosdelsistemadeventanasX /usr/libArchivosdeconfiguracindepaquetesybibliotecas /usr/local/binOrdenesaadidaslocalmente /usr/manPginasdemanualenlneadesistema /usr/src/linuxArchivosfuentesdelkerneldeLinux /varDesbordamientoparaalgunosarchivosgrandes ...

Alentraralsistema,stenosasignaundirectoriopordefecto,nuestrodirectoriohome.En muchoscasos,elnombredeestedirectoriosehacecoincidirconelnombredelusuarioysueleestar situadoeneldirectorio/home.Porejemplo, /home/i62xxxxx.Ensistemascomoelnuestro,con milesdeusuarios,losdirectorioshomeestnubicadosenotrosdirectorios.

2.3.2. Elshelldeentrada
Suponiendounainstalacingeneral,sideseamostrabajarcon bash deberemosvercualesel shelldeentradadelsistemay,sinoeseldeseado,cambiarlodeformatemporalopermanente.

18

2.3.- Una sesin de trabajo

Determinacindelshelldeentrada Cuandoentramosalsistemadespusdedarnuestronombredeusuarioynuestracontraseao palabraclave,Linuxiniciaunshellpordefectoqueeselquenosmuestraelindicadorderdenesde lasesin.Este shelldeentrada sedenomina loginshell.Eseladministradordelsistemaelque estableceesteshellcuandocreaunusuario. Cmosabemoscualeselshellasignadopordefecto?Cuandoseiniciaelshell,esteasignaa unavariableelvalordelshellactual(enlasprcticassiguienteshablaremosdetenidamentedelas variables). Esta variable se llama $SHELL. Podemos ver el valor de la variable con la orden empotradaecho:
echo$SHELL bin/tcsh

Averiguacualeselshellasignadoatusesindetrabajo

Podemosvariarelshellpordefectoconlaordenchsh(changeshell)perosuefectoslotiene lugarcuandonossalimosdelsistemayvolvemosaentrar.Sepuedeobteneruncambiotemporalde shellinvocandodirectamenteaunprogramashelldesdeelindicadordeordenesdelshellenelque estamos.Estecambiopermanecermientrasnofinalicemoselshellactualconlaordenexit,Ctrl+D


chshs<shell><user>

2.4. Losprocesos
El hecho que el sistema operativo sea multitarea implica que podemos lanzar ms de un programaalavez.Unprocesonoesmsqueunprogramaoaplicacincargadoenmemoriay ejecutndose.AunquenuestroordenadorslodispongadeunaCPU,elsistemaoperativoseencarga derepartireltiempodeprocesamientodelamismaparaquevariosprocesospuedanirrealizando susoperaciones,dandolasensacinqueseestnejecutandotodosalavez.

19

2.4.- Los procesos

2.4.1. Algunasherramientasparavigilarprocesos
Laformahabitualdeverelestadodenuestrosistemaesmedianteelusodeherramientasque permitenvigilarlaejecucindelosprocesos.EnLinux,estasherramientasestncontenidasenel paquete procps.Entre stasencontramos: top,vmstat,free,uptime, w,,etc.Estasherramientas utilizanelpseudosistemadearchivos /proc paraobtenerlainformacin.EnelcasodeRedHat, algunasherramientastambinestndisponiblesenlosentornosdeventanas,comoeselcasode ktop,kpmyprocinfoenkde,gtopengnome. Comprobacindelosdispositivos Elpseudosistemadearchivos/procpermiteconsultarlosdispositivosreconocidosporelkernel deLinux.Lasiguienteordennosmuestrapartedelainformacinquepodemosobtenerdeestetipo:

cat/proc/cpuinfo

#informacinsobreelprocesador

cat/proc/devices#sobrelosdispositivos cat/proc/interrupts#interrupciones cat/proc/dma#DMA cat/proc/ioports#puertosdeentrada/salidadedispositivos cat/proc/pci#dispositivosPCIdelsistema lsl/proc/ide#dispositivosIDE lsl/proc/scsi#dispositivosSCSI

Ordenps Laordenpsnosdaunainstantneadelosprocesosdelsistemaactuales(cuandoseejecutala orden).Siqueremostomardiferentesinstantneas,debemosdeutilizar top,quenosinformade formainteractivadelosprocesosdelsistema,delestadodeutilizacindelaCPU,lamemoria utilizadaylibre,laRAMqueutilizacadaproceso,etc. Algunasdelasopcionesmsutilizadas:


pse#muestratodoslosprocesos psx#procesossinterminaldecontrol(tty)
20

2.4.- Los procesos

psu#procesosdeunusuarioespecificado psl#formatolargo pso#formatodefinidoporelusuario,...

ps,sinopcionesniargumentos,dainformacinsobrelosprocesosdelasesinactual.
Muestra los porcentajes de uso de la CPU de los procesos del sistema Pruebaelcomandotop

Elcomandokillnospermiteenviarsealesalosprocesosquenosinterese.Haymuchostipos diferentesdeseales,quepodemosverenelmanualdekill,aunquelasmsutilizadassonlasque nossirvenparaobligaraunprocesoaquetermineopausesuejecucin.ConCTRL+Zpodemos pausarunprogramayrevivirlocon fg.Siqueremosqueelprocesoseejecuteensegundoplano utilizaremosbg.


comando& ctr+z fg<idproceso> bg<idproceso> kill<idproceso>

2.4.2. Metacaracteressintcticos
Unavezaprendidocomoutilizaralgunosdeloscomandosdelsistema,esmuyprobablequeen algunos casos nos interese utilizarlos de forma simultnea para agilizar ms las acciones que queramosrealizar.Losmetacaracteressintcticosnosayudanenestesentido. SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 2.1 muestraestoscaracteresydaunadescripcindesufuncin.

21

2.4.- Los procesos

LosmetacaracteressintcticospermitenmaterializarlafilosofadetrabajodeLINUXdecajade herramientas: dadas las ordenes que necesitamos para realizar un trabajo, los metacaracteres sintcticospermitencomponerlas("pegarlas")pararesolverlo.Estafilosofaesengranmedidala responsabledequelas rdenesdeLINUXrealicenfuncionesmuyconcretas,yseanparcasendar informacinalusuario. Metacarcter ; | Descripcindelafuncin Separadorentrerdenesqueseejecutansecuencialmente Separacin entre rdenes que forman parte de un cauce (pipeline).Lasalidadelaordendelaizquierdadelseparador eslaentradadelaordendeladerechadelseparador. Seusanparaaislarordenesseparadaspor; |.Lasordenes dentro de los parntesis, ejecutadas en su propio shell, son tratadas como una nica orden. Incluir un cauce dentro de parntesis,nospermiteasuvezincluirloenotroscauces. Indicadordetrabajoensegundoplano(background).Indicaal shellquedebeejecutareltrabajoensegundoplano. Separadorentrerdenes,dondelaordenquesigueal||slose ejecutasilaordenprecedentefalla. Separadorentreordenes,enlaquelaordenquesigueal&&se ejecutaslosilaordenprecedentetienexito.
Tabla2.1:Metacaracteressintcticos

()

& || &&

Uniendordenescon; Elusodelpuntoycoma(;)permiteescribirdosomsrdenesenlamismalnea.Lasrdenesse ejecutansecuencialmente,comosisehubiesendadoenlneassucesivas.Enprogramasshell,se utiliza por razones estticas (permite una asociacin visual entre ordenes relacionadas). En el indicadorde rdenes,permiteejecutarvariasordenessintenerqueesperaraquesecompleteuna ordenparaintroducirlasiguiente. Enelejemplosiguiente,utilizamoslaordenpwdquenospermiteverelcaminoabsolutodel directoriodetrabajoactual,ylaordencd(paracambiardedirectorio).
22

2.4.- Los procesos

$pwd /home/in1xxxxxx $cd so2006 ;ls #Cambiamosdedirectorioyhacemosls. miprograma1 miprograma2 $pwd /home/in1xxxxx/so2006

Creandocaucescon| Antesdeverloscauces,debemoscomentaralgosobreelentornodeejecucindelosprogramas enLINUX.Partedelentornodeejecucindeunprogramasonlosarchivosqueutiliza.Cuandoel sistema operativo crea un proceso, le abre tres archivos: la entrada estndar (stdin), la salida estndar(stdout)yelerrorestndar(stderr),quesecorrespondenconlosdescriptoresdearchivo(o handles)0,1y2,respectivamente(verFigura2.3).Pordefecto,estosarchivossecorrespondencon eltecladoparalaentradaestndar,ylapantallaparalasalidayerrorestndares,perocomoveremos enbreve,estasasociacionessepuedencambiar.

Figura2.3:Entrada,salidayerror,estndares

LoscaucessonunacaractersticadistintivadeLINUX.Uncauceconectalasalidaestndardela ordenqueaparecealaizquierdadelsmbolo|conlaentradaestndardelaordenqueapareceala derecha.Elflujodeinformacinentreambasrdenesserealizaatravsdelsistemaoperativo. Paraverunejemplo,usaremoslaordenwhoqueproduceuninformedelosusuariosqueestn conectadosactualmentealsistema.Cadaunadelaslneasquemuestrahacereferenciaaunusuario, ydasunombredeusuario,elterminalalqueestconectado,ylafechayhoradeentradaalsistema.

23

2.4.- Los procesos

$who mariatty2May1013:35 luistty6May109:00

Qu debemos hacer si queremos obtener esta misma informacin pero ordenada alfabticamente?Lasolucinessencilla,usarlaordensortquesirveparaclasificar.
$who|sort#Lasalidadewhoseutilizacomoentradadesort luistty6May109:00 mariatty2May1013:35

Quhaocurrido?Lasalidadewhosehapasadocomoentradaalaordensort.Estonosilustra, adems,quelasrdenesdeLinuxestnconstruidassiguiendoelsiguienteconvenio:cuandoenuna ordennoseespecificanarchivosdeentraday/osalida,elsistematomapordefectolaentradao salida estndar, respectivamente. Por ejemplo, qu ocurre si ejecutamos sort sin argumentos? Sencillo,seordenalaentradaestndaryseenvaalasalidaestndar.
sort<opciones><fichero>

Pruebaelcomandosortsinargumentos.RecuerdaqueCtrl+dindica findearchivo

Combinadoordenescon() Enocasiones,necesitaremosaislaruncauce,ounasecuenciadepuntoycoma,delrestodeuna lneade rdenes.Parailustrarlo,vamosausarlasordenes date,quenosdalafechayhoradel sistema,y la orden wc,quenos permiteconocercuantaslneas,palabrasycaracteres, tiene el archivo que se pasa como argumento. Por ejemplo, las siguientes rdenes tienen resultados diferentes:
$date;who|wc#ejecutadate;ejecutawhocuyasalidapasaawc WedOct1110:12:04WET1995 1531 $(date;who)|wc#ejecutadateywho,sussalidassepasanawc
24

2.4.- Los procesos

21264 Porqu?

Ejecutandoordenesensegundoplanocon& Linuxpermitedosformasdeejecucinderdenes:

Ejecucin de rdenes en primer plano (foreground): en este caso, el indicador de

rdenesnoaparecehastaquehafinalizadolaordenquemandamosejecutar.Porejemplo, lasrdenesquehemosejecutadohastaahora.

Ejecucinensegundoplano(background):enestesegundocaso,elindicadorreaparece

inmediatamente, locual nos permiteejecutarotrasordenes aunquelaquese lanz en segundoplanonohayaterminado. Paraejecutarunaordenensegundoplanoslodebemosfinalizarlalneadeordenescon &. SupongamosquedeseamosrealizarlacompilacindeunprogramaescritoenCyquelamisma duraalgunosminutos,siqueremosseguirtrabajandomientraselsistemarealizaeltrabajo,podemos ejecutarlaensegundoplano:
$gccmiprograma.c&#compilacinlanzadadefondo [1]1305 10%ls#seguimosmientrasotroprocesorealizalacompilacin

Vemoscomoelshellrespondealcarcter&indicandoelnmerodeltrabajoquehemoslanzado. Esteapareceentrecorchetes,seguidodelidentificadordelprocesoqueejecutalaorden.Elnmero detrabajonosservirparacontrolarlosprocesosensegundoplano.Otrosejemplos:


$who |wc &#lazamosdefondouncauce [2]13561357 $(cd midi rect orio ;ls) &#lanzamosdefondounasecuenciade [3]1400ordenes $cd midi rect orio& ls& #&sirvedeseparador;perdemosla secuencialidad [1]1402
25

2.4.- Los procesos

[2]1403

Ejecucincondicionaldeordenescon||y&& Elshellsuministradosmetacaracteresquepermitenlaejecucincondicionalderdenesbasada enelestadodefinalizacindeunadeellas.Separardosordenescon ||o&&,provocaqueelshell compruebeelestadodefinalizacindelaprimerayejecutelasegundaslosilaprimerafallao tienexito,respectivamente.Veamosunejemplo,


find*.r||echoNoseencuentraelarchivo findname*.txt&&echoArchivosencontrados

find<ruta>name<nombre><otrasopciones> find<ruta>size<tamao><otrasopciones> find<ruta>atime<numerodias><otrasopciones>

Muestra un mensaje que te indique si esta conectado o no un usuario.Utilizalaordenechoparamostrarelmensaje

echo<mensaje>

Nohayrestriccinquelimiteelnmeroderdenesqueaparecenantesdel||,perosloseevala elestadodelaltima.

2.4.3. rdenesparaelcontroldetrabajos
Sedenominatrabajo,ojob,acadaordenquemandamosaejecutaralshell.Elshellmantienela pistadetodoslostrabajosquenohanfinalizadoysuministramecanismosparamanipularlos.En estaseccin,vamosaveresosmecanismosquenossuministraelshellparacontrolarlaejecucinde nuestrostrabajos.

26

2.4.- Los procesos

jobs Untrabajopuedeestarenunodelostresestadossiguientes:primerplano,segundoplano,o suspendido (suspended o stopped, segn el sistema.). La orden jobs muestra los trabajos actualmenteasociadosconlasesindelShell(lanzadosenunterminal).Susintaxises:
jobs[l]

Listalostrabajosactivosbajoelcontroldelusuario.Conlaopcinlselistan,ademsdela informacinnormal,losidentificadoresdelosprocesos. Pruebalosiguiente:


$gccopruebaprueba.c& $sortmisdatos>misdat.ord& $vitexto .. <CTRL>Z#suspendemoslaejecucindevi $jobs Quinformacinproporciona?

Siuntrabajocontieneuncauce,lasordenesdelcaucequehanacabadosonmostradasenuna lneadiferentedeaquellasqueestnanejecutndose. Lassiguientes rdenesquevamosaveracontinuacinnospermitencambiarelestadodeun trabajo.Lamayorpartedeellasadmitencomoargumentounidentificadordetrabajo. fg Laordenfgseusaparatraertrabajosdefondo,osuspendidos,aprimerplano:


fg[%[job]]

Sin argumentos,ocon%, fg traeeltrabajoactualaprimerplano.Conunidentificador de trabajo,traeaprimerplanoeltrabajoespecificado. Supongamosquehaydostrabajosensegundoplano,comomuestraelejemplo:


$jobs
27

2.4.- Los procesos

[1]+Stopped(user)xterm [2]Runningxclock

Sideseamosponerenprimerplanoxterm,dadoqueestasuspendido,podemosejecutar
$fg%1 xterm

Ahora,elshellnorespondehastaquefinalicemoselprocesoxtermolodevolvamosasegundo plano. Este tipode transferencia,nos permitelanzardefondoprogramas quenecesitenmucho procesamiento inicial tal como crear una base de datos y retomarlos cuando necesitemos interactuarconl. bg Contrariaalaordenfg,bgenvaasegundoplanounprograma:
bg[%job]

Ejecutaeltrabajoactual,oespecificado,enbackground.Estoseilustraenelejemplo.
54%jobs [1]+Stopped(user)xterm [2]Runningxclock 55%bg%1 [1]xterm&

Laorden% Laorden%seutilizaparacambiarelestadodeuntrabajo.
%[job][&]

Estallevaaprimerplanoeltrabajoactual,sinotieneargumento,oelespecificadoporjob.Sial finaldelordenestpresenteel&,envaeltrabajoasegundoplano. Laorden%esenrealidadunaabreviacindefgybg.

28

2.4.- Los procesos

kill Laordenkillenviaunasealaun(os)proceso(s).Tienedosformas:
kill[sig]{pid|%job}... killl

Laaccinpordefectodekillesenviarlasealdefinalizaralproceso(s)indicado(s)porPIDo nmerodejob.Lasseales, sig,seindicanpornmerosonombres.Conlaopcin l,listalos nombresdelasealesquepuedenserenviadas. LassealessonenLINUXelmediobsicoparanotificardelaocurrenciadeeventosalos procesos.Porejemplo,laspulsaciones<CTRL>C,<CTRL>Z,etc.loquehaceenrealidades provocarqueelmanejadordetecladogeneredeterminadassealesquesonenviadasalprocesoen ejecucin.Tambin,seenvansealescuandounprogramareferenciaunadireccininvlida(p.e. unpunteronoinicializado)delproceso.Enestecaso,segeneralaseal SIGSEGV,queproduceel mensajedesobraconocido"Segmentationfault:coredump".

2.5. Metacaracteresdeentrada/salidaodedireccin
Losmetacaracteresdeentradas/salidassonotradelascaractersticasdistintivasdeLINUX.Con ellos,podemosredireccionar(tomar)laentradadeunaordendesdeunarchivoenlugardelteclado, redireccionar (llevar) la salida estndar a un archivo en lugar de a la pantalla, o encauzar su entrada/salidaa/desdeotraorden.Tambin,podremosmezclarlosflujosdeinformacindelasalida yelerrorestndaresparaquesalganjuntosporlasalidaestndar.TenemosunresumenenlaTabla 2.2. Metacarcter <nombre >nombre 2>nombre Descripcindelafuncin Redirecciona la entrada de una orden para leer del archivo nombre. Redireccionalasalidadeunaordenparaescribirenelarchivo nombre.Sinombreexiste,losobreescribe. Redireccionaelerror(stderr)aunfichero.Sinombreexiste,lo
29

2.5.- Metacaracteres de entrada/salida o de direccin

Metacarcter sobreescribe. >&nombre >>nombre 2>>nombre >>&nombre |

Descripcindelafuncin

Lasalidade stderr secombinacon stdout,yseescribenen nombre. Lasalidadelaordenseaadealfinaldelarchivonombre. Lasalidadestderrseaadealfinaldelarchivonombre Aadelasalidadestderr,combinadaconstdoutylasaadeal finaldenombre. Creauncauceentredosrdenes.Lasalidaestndardelaorden alaizquierdadesmboloseconectaalaentradaestndardela ordendeladerechadelsigno. Creauncauceentredosordenes,conlassalidasde stderr y stdout delaordendelaizquierdacombinadasyconectadas conlaentradadelaordendeladerecha.
Tabla2.2:Metacaracteresdeentrada/salidaodedireccin

|&

Redireccindelaentradaestndarcon< AlgunasordenesLINUXtomansuentradadearchivoscuyonombresepasacomoargumento, perosiestosnoseespecifican,comovimosanteriormente,lalecturasellevaacabode stdin.Otras rdenessloleendelaentradaestndar,porloquesiqueremosqueleandearchivodebemos utilizarlaredireccin<. Porejemplo,laordenmail(programabsicodecorreoelectrnico)leesuentradade stdinyno aceptaunnombredearchivocomoargumento(esperaqueescribamoselmensajeporteclado).Sin embargo,podemosescribirelmensajeenunarchivoypasrseloalaorden:
$cat>mimensaje HolaJuan:esteesunmensajedeprueba <CTRL>d $mailx333333<mimensaje $_

30

2.5.- Metacaracteres de entrada/salida o de direccin

Como podemos observar, la orden cat >mimensaje indica al shell que el contenido de la entradaestndardebeserincluidoenelarchivomimensaje. Redireccindesalidacon>,2>y>& Lassalidasdelas rdenesvannormalmentea stdout,ymuchas rdenesescribenmensajesde erroroinformacinadicionalenstderr.Laredireccindelasalidapermiteenviarlassalidasaun archivo.Enestecasolosmensajesquesalenporstderrsiguensaliendoporpantalla.Siqueremos redireccionar el error a un fichero independiente utilizamos el metacarcter 2> y si queremos combinarenunmismoficherolastdoutystderr,utilizamoselmetacaracter>&. Losejemplosmuestranlosdiferentesmetacaracteresderedireccin.
$ls>temporal temporal $cattemporal archiv1 practicas proyecto $cattemporil#Suponemosquetemporilnoexiste cat:temporil:Noexisteelficherooeldirectorio $cattemporil>errores cat:temporil:Noexisteelficherooeldirectorio # El resultado de ls se almacena en

Observamos,comosiguesaliendoporpantallaelmensajeaunquetenemosredirigidalasalida estndaraunarchivo.Estosedebeaque,comodijimosantes,algunasrdenesgeneraninformacin porelerrorestndar,nosloporlasalidaestndar.Porello,debemosutilizarlaredireccin2>o &>paranoseguirvindoloporpantalla.


$cattemporil2>errores $caterrores ca:temporil:Noexisteelficherooeldirectorio $_

31

2.5.- Metacaracteres de entrada/salida o de direccin

Redireccindeentradadentrodeprogramascon<< Elmetacarcter << nospermiteredireccionarlneasdesdeunprogramaalaentradadeuna orden dentro del programa. La redireccin se realiza mediante un mecanismo conocido como documentacinaqu.Estaredireccinpermiteescribirmensajesmultilneadesdeunprogramasin necesidaddeusarmltiplesrdenesecho. Parautilizarlo,escribimosacontinuacinde<<undelimitador,esdecir,unconjunto nicode caracteresquemarcarnelfindelaslneasdeentradaparaladocumentacinaqu.Cadaunadelas lneas deentradaquesevayaintroduciendoseexaminaparaigualareldelimitadorsinrealizar ningunasustitucin,oexpansindemetacaracteres.Unavezintroducidoeldelimitador,seejecuta laorden.Estonosvaapermitirajustardinmicamentelosmensajesuordenes. Elsiguienteejemplomuestracomousarestemecanismoparagenerarunmensajedebienvenida paraunusuarioadaptndoloasuentorno.Paraello,hacemosusodelasvariables$usery$PWD quenosdanellogindeusuarioyeldirectoriodetrabajoactual,respectivamente.
$cat<<FIN_BIENVENIDA Hola$user Sudirectorioactuales$PWD Noolvidemirarlasnoticias FIN_BIENVENIDA Holax3333333 Sudirectorioactuales/d5/home/x3333333 Noolvidemirarlasnoticias $_

Comovemos,catestaaceptandoinformacinhastaqueencuentralapalabraclavequelehemos indicadotrasel<<,ennuestroejemplo,FIN_BIENVENIDA;cuandolaencuentraentiendequela entradadeinformacinporstdinhafinalizado.


Genera una secuencia de nmeros.Dichasecuencia acabar cuando seintroduzcaun0.

32

2.5.- Metacaracteres de entrada/salida o de direccin

Algomssobrecaucesyredirecciones Sideseamosmezclarlosmecanismosdecaucesyredireccionamiento,encontramosqueelnico lugardondelaredireccindearchivosseacomodadentrodeuncauceesalfinaldelaltimaorden delcauce.Enestecaso,podemosusarlaredireccindelasalidaparacapturarlasalidafinalenun archivo. Si intentsemos redireccionar la salida de una orden al principio o en medio de un encauzamiento,todos losdatos irn alarchivoynada fluir atravs del restodelcauce. Para permitirintroducirredireccionamientoencualquierordendeuncauce,existelaorden tee quea partirdeunflujodeentradadesdoblasteendos:unodeellospuedeirredireccionadoaunarchivo yelotroalcauce.Conlaredireccindestdinpasaalgosimilar,slopodemosusarlaenlaprimera ordendelcauce.Silausamosenmedio,seignoralainformacinquefluyeporelcauce.
tee<opciones><fichero>

Archivosdedispositivosyredirecciones En Linux, el directorio /dev contiene los archivos de dispositivos y pseudodispositivos (dispositivoslgicosquenosecorrespondenconundispositivohardware).Unodeestospseudo dispositivoses/dev/nullqueactacomounsumiderodeinformacin,deformaquetodoloquesele enva es descartado por el sistema y, por tanto, podemos enviarle la informacin que no necesitemos.Porejemplo,laorden time ejecutaotraordenpasadacomoargumentoynosdalos tiemposdeejecucindelamisma(modokernel,usuarioytiempodereloj).
$timels COORDINA.PSarchsurvey.pscomplete.wavwoods.ps real0m0.003s user0m0.001s sys0m0.002s

Comovemos,timemuestraelresultadodeejecutarlaordenlsyeltiempodeejecucin.Sino estamosinteresadosenelresultadodels,podemosdescartarlaenvindolaa/dev/null.Nota:como se puede observar los tiempos de ejecucin siguen vindose en pantalla aunque hemos redireccionadolasalidaestndar.Estosedebeaquelostiempossalenporelerrorestndar.

33

2.5.- Metacaracteres de entrada/salida o de direccin

%timels>/dev/null real0m0.003s user0m0.001s sys0m0.002s

2.6. Empaquetadoycompresindearchivoscontarygzip
Comprimirunarchivo,agruparvariosenunosolooverqu contieneunarchivocomprimido sontareasqueutilizaremosfrecuentementeparahacercopiasdeseguridad,transportararchivosde unsitioaotro,etc.Aunqueexistenmultituddeprogramasdiferentesquenospermitenhaceresta clasedeoperaciones,generalmenteentodoslossistemasUNIXencontraremoslaherramienta tar. Esteprogramanospermitemanipulardecualquierformaunoovariosarchivosparacomprimirlos, agruparlos,etc. Aunqueconelmismo tar podemoscomprimirarchivos,laaplicacinens mismanoesde compresin.Comohemosdicho,paraelloutilizaprogramasexternoscomoelgzip. Compresindearchivos Lacompresindearchivosnospermiteahorrarespaciodediscoytiempoenlatransmisinde losmismos. Paracomprimirydescomprimirarchivospodemosutilizarlas rdenescuyasintaxisaparecea continuacin:
gzip[opciones][Ssufijo][nombre...] gunzip[opciones][Ssufijo][nombre...] bzip2[opciones][Ssufijo][nombre...] bunzip2[opciones][Ssufijo][nombre...]

gzip y bzip2 comprimen uno o varios archivos. Cada archivo es sustituido por uno cuya extensin es .gz o .bz, respectivamente. Los archivos son restaurados con las ordenes gzip d,
34

2.6.- Empaquetado y compresin de archivos con tar y gzip

gunzip,bzip2d,bunzip2, Veamosalgunosejemplos.
$gziparchivo1archivos.gz $bzip2archivo2archivos2.bz

Podemosdescomprimirlosarchivosenlasalidaestndarenlasdosformassiguientes:
$gunziparchivos.gz $bzip2darchivos2.bz

Por ltimo,indicarquesiqueremoscrearun nicoarchivoconmltiplescomponentes que puedanextraerseposteriormentedeformaindependiente,esrecomendableutilizar tar,pues gzip estapensadoparacomplementaratar,noparasustituirlo. Empaquetadodearchivos Laordentarseutilizaparaempaquetarungrupodearchivosenun nicoarchivo,quetienela estructuradeunencabezadode512bytesyelarchivo,tantasvecescomoarchivosempaquetemos. Seutilizaparaalmacenarjerarquasdedirectorios,tenercopiasdeseguridadyahorrarespacio.Es laformahabitualdesuministrarparchesydistribucionesdesistemas. Lasintaxisdelaordentares:
tar[opciones][archivos]

Lasopcionesde tar puedenironoprecedidasdel.Sibientienenumerosasopciones,slo vamosaveralgunasdeellas:


cCreaunnuevopaqueteparaalmacenarlosarchivos. rGrabaarchivosalfinaldelpaquete tEnumeraelcontenidodelpaquete.

fEspecificaelarchivoenelquesecrearelpaquete xExtraelosarchivosdelpaquete vUtilizaenmodoverboso


35

2.6.- Empaquetado y compresin de archivos con tar y gzip

Vamosaverunejemplodeempaquetadoenunarchivodediscodeunajerarquadedirectorios (todoslosarchivosdirectoriosquehayeneldirectorioMisPracticasSOI):
$cdMisPracticasSOI $tarcvfpracticasSoi.tar. ./Sesion1/archivo1 ... ./Sesion4/achivon $filepracticasSoi.tar practicasSoi.tar:GNUtararchive

Para restaurar posteriormente en el directorio actual todos los archivos podemos utilizar la opcinx:
$tarxvfpracticasSoi.tar

Observamoscomoelarchivotarnodesaparecealfinalizareltrabajo,puesnossirvecomocopia deseguridad.Conlasopcionesxyttambinpodemosrecuperararchivosconcretos:conlaprimera debemos conocer el camino de acceso al archivo, con la segunda no. Por ejemplo, podemos recuperarunaprcticaconcretadelaforma:
$tarxvfpracticasSoi.tarSesion2/ejercicio1.tcsh

Combinandolacompresinyelempaquetado Podemoscombinarlacapacidaddecompresinconladeempaquetayas reducireltamao. Paraelloeltartienedosopcionesms:


zComprimeutilizandogzip jComprimeutilizandobzip2

Lasextensionesdelosarchivossontgzytbz,respectivamente.Amododeejemplo:
$tarcvzfmisPracticas.tgzmispracticas

EmpaquetaycomprimeeldirectoriomisPracticasysucontenidoenun nicoarchivollamado misPracticas.tgz


$tarxvzfmisPracticas.tgz

36

2.6.- Empaquetado y compresin de archivos con tar y gzip

Descomprime y desempaqueta el archivo misPracticas.tgz, manteniendo la estructura de directoriosinicial.

37

2.7.- Ejercicios

2.7. Ejercicios
1.Desplzatehastaeldirectorio/binygeneralossiguienteslistadosdearchivos(siemprede laformamscompactayutilizandolosmetacaracteresapropiados): a) Todoslosarchivosquetengancomoterceraletradesunombreunaa b) Todoslosarchivosquenocomiencenporunaconsonante c) Todoslosarchivosquequecontenganunnmeroporda,df d) Todoslosarchivosquecomiencenporbyacabenenunnmero 2.Construyelasiguienteestructuradedirectorios Mail Inbox SPAM Sent 2006 SO EDI ylossiguientesficherosdetextoconcontenidodetuinvencin.
Situadoeneldirectorio SPAM Nombredelfichero banco.eml compraTelefono.txt Mail SO EDI IA LOCAL 2006 notas.eml noticiasPracticas.eml febrero2007_notas.eml anotaciones.txt listaAprobados.txt telefonosClase.eml

Local IA

38

2.7.- Ejercicios

SitundoteeneldirectorioMail: a) Utilizalaordenfindparaencontrartodoslosficherosqueacabenen.txt b) Utilizalaorden find paraencontrartodoslosficheroscuyonombrecontengala cadenafono c) Utilizalaorden find paraencontrartodoslosficheroscuyonombrecontengala cadenanot d) Utilizalaorden find ysuopcinexecparamostrarelcontenidodelosficheros cuyonombrecontengalacadenaeml. 3.Creaunalneade rdenesqueaadaelcontenidodetodoslosarchivoscontenidosen cualquier subdirectorio de Mail a un fichero llamado copiaSeguridad.bak situado en el directorioLocal 4.Construyeunalneaderdenesquedcomoresultadoelnmerodearchivosydirectorios quehayeneldirectoriodetrabajoy,acontinuacin,imprimalafechayhoraactual.Paraello necesitarsutilizarlasrdeneswc(cuentaelnmerodelneas,palabrasycaracteres)ydate (imprimelahoraylafechaactual). 5.Construya un archivo llamado agenda.txt en el directorio INBOX y configure sus privilegiosdeacceso,detalmodo,queelusuariopuedaleeryescribir,elgrupopuedaleery losotrosnopuedanhacernada. 6.Sin utilizar un editor de texto grfico, crea, en el directorio SO, un fichero llamado notas.txtcon10lneas,cadaunadelascualestengaesteformato: NombreDNICalificacin 7.Visualicelaprimeraylassieteltimaslneasdelarchivonotas.txt

39

2.7.- Ejercicios

8.Creaunalneaderdenesparaeliminartodaslaslneasduplicadas,menosuna,delarchivo telefonosClase.eml 9.Escribeunalneaderdenesparavisualizarlaslneasdelarchivo notas.txtquecontengan alumnosconlacadenazapensunombre 10.Busca archivos cuyo nombre contenga la cadena 86 a partir del directorio raz /. Redireccionalasalidayelerrordeformaadecuadaparaenterartedelasalida. 11.Creaunfichero.tgzyotro.tbzconlajerarquadedirectoriosdeMail. 12.Escribelaslneasderdenesquellevenacabolastareassiguientes: a) Contarelnmerodecaracteresylneasquehayenelarchivo notas.txtymostrarelresultado porpantalla(nohayquemostrarelnombredelarchivo) b) Contarelnmerodepalabrasylneasquehayenelresultadodelaorden ls1ymostrarel resultadoporpantalla c) Los mismo que el apartado (b), pero redirigiendo la salida a un archivo llamado estadsticas.data1 13.ConstruyeunatablaASCIIenelarchivoasiapac.temps,poniendoencadalnealosdatos deunaciudadporelordensiguiente:nombredelaciudad,temperaturamximaytemperatura mnima.Lalneasiguienteesunejemplo: Tokyo2810 Lainformacindelasciudadeseslasiguiente:(Kuala,28,13)(Karechi,30,12)(Tokyo,28, 10)(Lahore,20,11)(Manila,28,17)(NuevaDelhi,25,15),(Jakarta,3011),(Pekin,9,3)y (HongKong9,1) Escribelardenesnecesariaspararealizarlasoperacionessiguientes

40

2.7.- Ejercicios

a) OrdenarlatablapornombresdeciudadesyguardarlaenelficheroordenNombre.txt b) OrdenarlatablaportemperaturasmnimasyguardarlaenelficheroordenMaxima.txt c) Ordenarlatablaempleandolatemperaturamximacomoclaveprimariaylatemperatura mnimacomoclavesecundariayaadirlaalficheroordenNombre.txt 14.Creaunordenquemuestreporpantallatodoslosarchivosocultosquehayentudirectorio home. 15.Creaunaordenquemuestreporpantallaelnombredecincoeditoresdetextoquehayaen elsistema. 16.Iniciaunprogramainteractivo(porejemplo,xclock),ysuspndalo.Revisalalistade procesosycompruebaqueelnuevoprocesoest yquesuestadoseasuspendido.Despus reincialoensegundoplanoyfinalmenteelimnalo. 17.Queharelcomandotouch*.c?

41

3.- COMANDOS SHELL II

3. COMANDOSSHELLII
3.1. Historiaderdenes
Lasrdenesqueseescribenenelterminalsevanguardandoenunarchivohistrico,esloquese llamahistoriaderdenes.stavaalmacenandolasrdenesconsusrespectivosparmetrosquesele vandandoalashellparaqueejecute.Elsentidodemantenerlahistoriaesfacilitaryhacerms rpidalarepeticindealgunaordenqueyahabamosejecutadoypoderreutilizarsusargumentos. Enesteapartado,vamosaestudiarcomoconseguirqueelshellmantengaunahistoriadelas rdenesdadas,ycmovolverallamarardenesdadasconanterioridad,modificarlasyreutilizarlas. Asignandolavariablehistoria Lavariable$HISTSIZEcontieneelnmerode rdenesquesevanaalmacenarenlahistoria antesdedescartarlaordenmsantiguaalmacenada.Elvalorpredeterminadoparaestavariablees de500,sibienpodemoscambiarloasignndoleotrovaloralavariable. Paraconsultarelvalordelasvariablesdeberemosteclearset.
$bash$ set argv() PWD/tmp/ HISTSIZE500 USER SHELL mluque /bin/bash

... Laprimeracolumnareflejaelnombredelavariableylasegundasuvalor. Viendolahistoria La orden history muestraunalistadelas rdenesdelahistoriade rdenes;cadaorden va

42

3.1.- Historia de rdenes

precedidadeunnmeroqueindicalaocurrenciadelamismaenlahistoria,empezandopor1para laordenmsantigua.Ennuestrocaso
$bash$ history 1echo$SHELL 2ls 3psax 4find.name*.txt 5history history[opciones] N:mostrarnicamentelasNltimaslneasdelhistrico c:borrarlalistahistrica Pruebaelcomandohistory.Quocurresilolanzasendiferentes terminales

Almacenandolahistoriaderdenes Cuandoabandonamosunashell(bienutilizandoelcomando exit ocerrandoelterminal),las rdenesquesehayanejecutado(listadohistrico)seguardanenelarchivohistrico.Larutadeeste archivoseencuentraalmacenadaenlavariable$HISTFILE;elarchivohistricopredeterminado sueleser~/.bash_history. Repitiendordenesconeleditorderdenes Enelbash,podemosutilizaruneditorde rdenespararecuperaryejecutar rdenes.Conlas flechasarribayabajodelteclado,podemosmovernoshaciaadelanteyhaciaatrsenlahistoriade rdenes.Cadaordenvaapareciendoenpantallasegnlarecuperemosconelcursorsituadoalfinal. Podemospulsar<RETURN>paraejecutarla<CONTROL>Cparacancelarla.Tambin,podemos editarlasrdenesparareciclarlas.Utilizandolasflechasizquierdayderechapodemosmovernospor lalnea(ordenrecuperada)yborraroinsertarparamodificar,segnnuestranecesidad,laorden recuperada.

43

3.1.- Historia de rdenes

Expansinhistrica:repitiendordenesconelsignobang(!) Otraformaparareutilizarrdenesesusarelsignodeadmiracin,denominadobang.Lasformas pararecuperarunaordenson:


!numeroorden#Invocaunaordenconocidasuposicinenlahistoria !!#Invocalaltimaordenejecutada !n#Invocalaordensituadanlugaresatrsenlahistoria !cadena_texto#Invocalaordenquecomienzaporcadena_texto !?cadena_texto[?]#Invocalaordenquecontienecadena_texto

Supongamosqueestamosenlaorden6,diferentesformasdeinvocarlaorden4( find.name *.txt)son:


$bash$!4#Damoselvalorabsolutolaposicinenlahistoria $bash$!2#Damoslaposicinrelativaenlahistoria $bash$!fi#Ejecutamoslaordenquecomienzapor"fi" $bash$!?in#Ejecutamoslaordenquecontienelasubcadena"in"

Enelltimoejemplo,indicamosquequeremoslaordenmsrecientequecontieneeltextoin encualquierpartedelacadenadelaorden. Podremosseguiraadiendotextoaunaordenanteriorsifinalizamosconuna ?.Delejemplo anterior,reutilizamoslaescrituradelaorden2(ls)paramodificarlasopciones!?ls?l


lsl

Modificacindeusocomnparalaexpansindellistadohistrico Laspalabrasdelaordenseleccionadasenumerandetalmodoquelaprimera(nombredela orden)tieneelnmero0,ylasdemspalabrassenumeranconsecutivamenterespectoalaanterior. Sepuedeemplearunindicadordepalabraparaidentificarlapalabraopalabrasdeseadasdentrode laordenoeventoseleccionado.Elsignodospuntos(:)seinsertaentreelindicadordelsucesoyel indicadordepalabra.


!or den [:pala bra]

44

3.1.- Historia de rdenes

LaTabla 3.1 enumeraalgunodelosindicadoresdepalabramsfrecuentes.Comoejemplo utilizamoslaordengcclab1.colab1 Unavezseleccionaunaorden,yciertaspalabradentrodeesaorden,sepuedenaplicarunaoms operacionesalaspalabrasseleccionadasmedianteelusodeunasucesindeoperadoresllamados modificadores.Lomodificadoresvanprecedidosdelsignodospuntos(:)


!or den[:p alabr a][:mo di ficado r]

Indicador o N ^ $ * N1N2 Palabra0(orden)

Significado

Ejemplo oLaordengcc 2Latercerapalabra(o) ^Lapalabraserlab1.c $Lapalabralab1 *Laspalabraslab1.c,oylab1

LaNsimapalabra Lapalabra1delaorden Laltimapalabradelaorden Todalaspalabrassalvoelnombredelaorden

ElintervalodepalabrasdesdeelnmeroN1alN2 23Laspalabrasoylab1
Tabla3.1:Indicadoresdepalabra

Los modificadores cambian la forma en la que el evento actual es tratado. Algunos de los modificadoresmstilesaparecenenlaTabla3.2(elrestopuedenconsultarseenelmanualenlnea sobrehistory). Modificador p r e h t Descripcin Imprimeelresultadodeunaordensinejecutarla Eliminalarazdelnombredearchivo Eliminalaextensindelnombredearchivo(partequesigue alpunto) Sequedaconlacabeceradelaruta(todomenosel ltimo componente) Sequedaconelfinaldelaruta(ltimocomponente)
Tabla3.2:Modificadoresdelareferenciasdelahistoria 45

3.1.- Historia de rdenes

Vamosaveralgunosejemplos,:pestilcuandonoestamossegurossilareferenciaquevamosa hacereslaquedeseamos.Con l,veremoslaordensinejecutarla,yunavezqueestemosseguros slotenemosquehacer!!


$!ech:p echo$SHELL $!!

3.2. Autocompletarconeltabulador
UnateclamuyconocidaenBasheseltabulador,quenosayudaaterminarderellenarunaorden conelnombredeuncomando,deunavariable,deunficheroodirectorio,oconelnombredeuna funcinBash.Paraello,sesiguenlassiguientesreglascuandosepulsaeltabulador: 1. Sinohaynadaqueempieceporeltextodelapalabraqueprecedealcursorseproduceun pitidoqueinformadelproblema. 2. Sihayuncomando(enelPATH),unavariable(siempreprecedidapor$),unnombrede ficheroofuncinBashquecomienzaporeltextoescrito,Bashcompletalapalabra. 3. Sihayundirectorioquecomienzaporelnombreescrito,Bashcompletaelnombrede directorioseguidoporunabarradeseparacindenombresdedirectorios,/. 4. Sihaymsdeunaformadecompletarlapalabra,elshellcompletalomsquepuedey emiteunpitidoinformandodequenolapudoterminardecompletar. 5. CuandoBashnopuedecompletarunacadena(porhabervariasposiblesqueempiezan igual),podemospulsardosveceseltabuladorysenosmostrar unalistaconlasposibles cadenas.

3.3. Metacaracteres
Todoslosshellsposeenungrupodecaracteresqueendiferentescontextostienendiferentes significados,losmetacaracteres.stosjueganunpapelimportantecuandoelshellestanalizando lalneaderdenes,antesdeejecutarla.Vamosaverlosagrupadossegnlafuncinquerealizan.
46

3.3.- Metacaracteres

3.3.1. Metacaracteressintcticos
SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 3.3 muestraestoscaracteresydaunadescripcindesufuncin(verprctica1XXXXX). Metacarcter ; | Descripcindelafuncin Separadorentrerdenesqueseejecutansecuencialmente Separacin entre rdenes que forman parte de un cauce (pipeline).Lasalidadelaordendelaizquierdadelseparador eslaentradadelaordendeladerechadelseparador. Seusanparaaislar rdenesseparadaspor; |.Las rdenes dentro de los parntesis, ejecutadas en su propio shell, son tratadas como una nica orden. Incluir un cauce dentro de parntesis,nospermiteasuvezincluirloenotroscauces. Indicadordetrabajoensegundoplano(background).Indicaal shellquedebeejecutareltrabajoensegundoplano. Separadorentrerdenes,dondelaordenquesigueal||slose ejecutasilaordenprecedentefalla. Separadorentrerdenes,enlaquelaordenquesigueal&&se ejecutaslosilaordenprecedentetienexito.
Tabla3.3:Metacaracteressintcticos

()

& || &&

3.3.2. Metacaracteresdenombredearchivos
stosseutilizanparaformarpatronesdeigualacinparalasustitucindenombresdearchivos conelfindepoderreferenciardeformaabreviadaunaseriedearchivoscuyosnombressiguenun patrn.LaTabla 3.4 muestraestosmetacaracteres.Paraverunadescripcinmsdetalladaverla prcticaXXXX. Metacarcter ? * [] Descripcindelafuncin Comodnacualquiercarctersimple Igualacualquiersecuenciadeceroomscaracteres Designauncarcterorangodecaracteresque,comounaclase,son
47

3.3.- Metacaracteres

Metacarcter

Descripcindelafuncin igualadosporunsimplecarcter.Paraindicarunrango,mostramos elprimeryelltimocarcterseparadosporunguin().Conel smbolo!indicamosnegacin.

{} ~

Abreviarconjuntosdepalabrasquecompartenpartescomunes Seusaparaabreviarelcaminoabsoluto(path)deldirectoriohome
Tabla3.4:Metacaracteresdenombredearchivos

3.3.3. Metacaracteresdecitacin
Losmetacaracteresdecitacin,Tabla3.5,seutilizanparacontrolarcundodebenprotegerseel resto de metacaracteresdelaexpansin ointerpretacin delshell. Denominamos expansin al procedimientoporelcualelshellsustituyelaocurrenciadeuncarcterespecialporunalista. Metacarcter \ ' ` Descripcindelafuncin Evita que el carcter que le sigue sea interpretado como un metacarcterporelshell. Evitaquelacadenadecaracteresencerradaentredoblescomillas seainterpretadacomometacaracteres. Evita que la cadena de caracteres encerrada entre comillas simplesseainterpretadacomordenesometacaracteres. La cadena de caracteres encerrada entre acentos se interpreta comounaordenyseejecuta
Tabla3.5:Metacaracteresdecitacin

Eludirmetacaracterescon\ Cuandoelshellprocesaunaorden,loprimeroquehaceessustituirlosmetacaracteresporsus respectivosvaloresparaqueenlaejecucinaparezcanlosvaloresreales,nolosmetacaracteres. "Eludir" metacaracteres significa evitar su interpretacin por el shell, de forma que stos permanezcanenlalneaderdenesparaserprocesadosenlaejecucin.

48

3.3.- Metacaracteres

Supongamosquequeremoscrearunosarchivosconnombres abc;1 y TrabajoParaCasa.Si escribisemos estos nombres como tal, el shell interpretar el ; y el espacio en blanco como separadores,respectivamente(prubaloparaverquedice). Paraevitarlopodemosescribir:
$bash$mvabc1abc\;1 $bash$mvTrabajoParaCasaTrabajo\Para\Casa

Protegiendometacaracterescon Labarrainvertidasloprotegealcarcterquelasigueinmediatamente,porloquenoescmodo para proteger cadenaslargas. En estos casos, podemosprotegerla cadenacompletausando las comillasdobles.stasdesactivanelsignificadoespecialdeloscaracteresentreellas,salvolosde ! evento,$vary`cmd`querepresentanlasustitucindelahistoria,variablesyejecucinderdenes, respectivamente.Ejemplo:
$bash$ echo"****Hola$USER" ****HolaPepito $bash$

Observadcomolosmetacaracteres*nosehanexpandido,perolavariable$USER sihasido sustituidaporsuvalor. Protegiendocon''rdenes,variablesymetacaracteres Lascomillassimplessonparecidasalascomillasdobles,desactivanelsignificadoespecialde algunoscaracteressalvolaexpansindelahistoriaderdenes(!evento).


$bash$ texto="mivariable" $bash$ dentro="valorde$texto" $bash$ echo$dentro valorde miva riable $bash$ setdentro='valorde$texto' $bash$ echo$dentro valorde $ text o
49

3.3.- Metacaracteres

Tenedpresentequelaacotacindecadenasescompleja,especialmentelascadenasqueasuvez contienenmetacaracteresdecitacin.Recordadquelosmetacaracteresdecitacinnoseutilizan igualqueenlaescrituranormal.

3.3.4. Metacaracteresdeentrada/salidaodedireccin
Losmetacaracteresdeentrada/salidasonotradelascaractersticasdistintivasdeLINUX.Con ellos,podemosredireccionar(tomar)laentradadeunaordendesdeunarchivoenlugardelteclado, redireccionar (llevar) la salida estndar a un archivo en lugar de a la pantalla, o encauzar su entrada/salidaa/desdeotraorden.Tambin,podemosmezclarlosflujosdeinformacindelasalida yelerrorestndaresparaquesalganjuntosporlasalidaestndar.VemosunresumenenlaTabla 3.6. Metacarcter <nombre >nombre &>nombre 2>nombre >>nombre &>>nombre | Descripcindelafuncin Redirecciona la entrada de una orden para leer del archivo nombre. Redireccionalasalidadeunaordenparaescribirenelarchivo nombre.Sinombreexiste,losobreescribe. Lasalidade stderr secombinacon stdout,yseescribenen nombre. Lasalidadestderrseescribeennombre Lasalidadelaordenseaadealfinaldelarchivonombre. Aadelasalidade stderr,combinadacon stdout alfinalde nombre. Creauncauceentredosrdenes.Lasalidaestndardelaorden alaizquierdadesmboloseconectaalaentradaestndardela ordendeladerechadelsigno.
Tabla3.6:Metacaracteresdeentrada/salidaodedireccin

3.3.5. Metacaracteresdeexpansin/sustitucin
Losmetacaracteresdeexpansin/sustitucinactancomoindicadoresespecialesparaelBash. LaTabla3.7muestraloscuatrometacaracteresdeestetipo.
50

3.3.- Metacaracteres

Metacarcter $ ! :

Descripcindelafuncin Indicalasustitucindevariables.Unapalabraprecedidade$se interpretacomovariable,y$palabrasesustituyeporsuvalor. Indicadordesustitucindehistoria(historiaderdenesenbash). Precedealosmodificadoresdesustitucin.


Tabla3.7:Metacaracteresdeexpansin/sustitucin

Estosmodificadoresnoshanidoapareciendoalolargodelosguiones,veamosquesignifican: "$" sirveparaindicaralshellquesustituyaunavariableporsuvalor; "!" eselindicadordela historiade rdenes;ylos ":" separanlaordendelosdesignadoresdepalabraenlahistoriade rdenes.

3.4. Losalias
3.4.1. Definicinyeliminacindealias
Unaliasesunnombremscorto(seudnimo)parauncomandoqueusamosmuyamenudo.El mecanismodealiaspermiteadaptarelcomportamientodelasrdenesLINUXcuandoseejecutan. Essimilaralacapacidaddedefinicindemacrosenotroslenguajes.EnBash,laorden alias,se encargadecrearunseudnimoparaunaorden.
alias[nombre_alias]=[definicin_orden]

Asociaunnombre_aliasconladefinicin_orden.
$bash$ aliasdir=lsl#asignaalslelnombrededir

Cuandoveamosqueyanonosestilladefinicindeunalias,podemosborrarlasinsalirdel sistema.Lasintaxises
unaliasnombre_alias

dondenombre_aliaseselnombredelaliasquesevaaborrar.

51

3.4.- Los alias

3.4.2. Listarladefinicindelosaliasexistentes
En nuestro entorno de prcticas, el sistema define algunos alias de uso comn. Se pueden parecerbastantea:
$bash$ alias #listalosaliasexistentesysudefinicin l.lsd.[azAz]*color=tty lllslcolor=tty lslscolor=tty whichalias|/usr/bin/whichttyonlyreadaliasshowdo $bash$ alias ll#muestraladefinicindelaliasll lllslcolor=tt

3.4.3. Renombraroredefinirunaordenexistente.
Esto permite ahorrar escritura de rdenes o que nuestro sistema se parezca a otro sistema operativo.
$bash$ aliasrename=mv#renombramvalnombrerename $bash$ aliasls='lsl'#abrevialaescrituradelsl

Cuandoredefinimosunaordenconunalias,podemosseguirutilizandolaordenensuforma originalanteponiendoalnombreun\,obieninvocndolaconsucaminocompleto.Porejemplo, definidoelaliasanterior,parainvocarlsensuformanormal:

$bash$ \ls $bash$ /bin/ls

3.4.4. Crearunanuevaorden
Permiteabreviarlaescrituradelasrdenesqueusamosfrecuentemente:
$bash$ aliashp='history|more'#hpmuestrahistoriapaginada $bash$ aliasht='history|tail'#htmuestraelfinaldelarchivo dehistoria

52

3.4.- Los alias

Precauciones! 1. Aveces,losaliaspuedenentrarenconflictoconprogramasdelshell,especialmentesise usanparalaredefinicinde rdenes.Unprogramashellpodranofuncionarcorrectamente porqueesperaelcomportamientopordefectodeunaorden. 2. Definesiemprelosaliasmultipalabraentrecomillassimples. 3. Alcrearunalias,debemostenerlaprecaucindenollamarlos alias,nicrearaliasquese referencienaellosmismosparanocrearunbucleenlasdefinicionesdestos.Ahorabien,s podemoscrearaliasquereferencienaotrosalias. 4. Cuandodefinimosunalias, stesloestar disponibleenelterminalenelquesecre y, adems,cuandoseapagueelordenadorseperder.Siqueremosqueunaliasestdisponible ennuestrosistemasiemprequearranquemos,podemosdefinirlodentrodelfichero~/.bashrc. EsteficheroseejecutasiemprequesearrancaBash.

3.5. Variables
Elshell,comolenguajedeprogramacinquees,necesitapoderdefiniryusarvariables.Una variableesunaposicindelamemoriaprincipalalacualseleasignaunnombre.Estonospermite aludir a esta posicin dememoriaempleandounnombre,en lugarde utilizarsu direccin. El nombredeunavariabledeshellpuedeestarformadopordgitos,letrasyelguininferior(_), siempreycuandoelprimercarcterseraunaletraounguininferior.Lamaysculasyminsculas seconsiderandistintasylalongituddelnombrenoestlimitada.Comolamemoriaprincipalesun tipodealmacenamientoqueadmitelecturayescritura,sepuedeleerelvalordelavariable,y tambinselepuedeasignarunnuevovalor.ParalashelldeBash,lasvariablessonsiemprecadenas decaracteres,aunquesealmacenennmerosenellas.

3.5.1. Variablesdeentornoyvariableslocales
Lasvariablesdelshellpuedenperteneceradostipos:variablesdeentornoyvariablesdefinidas porelusuario.Lasdospuedenalbergarvalores,cadenasonmeros,ypuedenutilizarsetantoen programasshellcomointeractivamente.Ladiferenciaentreambasradicaensualcanceombito.
53

3.5.- Variables

Lasvariablesdeentornosirvenparapersonalizarelentornoenelqueseejecutalashellypara ejecutarcorrectamentelas rdenesdelshell.Cuandodamosalshellunaordeninteractiva,Linux inicia un nuevo proceso para ejecutar la orden. El nuevo proceso hereda algunos atributos del entornoenelquesecre.Estosatributossepasandeunosprocesosaotrospormediodelas variablesdeentorno,tambindenominadasvariablesglobales($HOME,$SHELL,$USER,...). Porcontra,las variablesdefinidasporelusuarioolocales nosepasandeunosprocesosa otrosysuscontenidossedescartancuandosalimosdelshellenelcualsedefinieron. Elshelltrataporigualatodaslasvariables:lasidentificaporunprefijoespecial,el signodolar ($),queindicaquelapalabraquesigueeselnombredeunavariable.Porotraparte,existeuna convencin para la designacin de variables: se usan letras maysculas para las variables de entorno,yminsculasparalasvariableslocales.ComoLinuxessensiblealtipo,esimportanteel usodemaysculasominsculas.Nosonlomismo$COSA,que$cosa,que$CoSa,etc. Para visualizar los valores de todas las variables del sistema se utiliza el comando set sin argumentos.

3.5.2. Creacindevariables
Siqueremosdarlevaloraunavariable
var=Valor var= #asignaValoralavariablevar #asignaunvalornuloalavariablevar

Dondevareselnombredelavariable,compuestoporletras,dgitosy/osubrayado(_).Si varno existe,secrea,ysino,secambiaelvalordelavariable. Nopuedenexistirespaciosanteso despusdelsmbolo=. Sin el argumento valor, ala variable se le asigna unvalor nulo.Siel argumentoes valor, entoncesseasignavaloravar.Elvalorpuedeserunapalabrao(lista_de_palabras). Lasvariablesmultipalabrasonmatricescuyoselementospuedenseraccesiblesindividualmente, indicandosuposicindentrodelamatrizcon[](comenzandoconelelementonmero0).

54

3.5.- Variables

$bash$ varprueba=prueba123 $bash$ matrizpru=(prueba123) $bash$ varvacia $bash$ matrizpru[3]=dos $bash$ nombre='FernandoLpez' $bash$ nombre2=Fernando\Lpez

Paraobtenerelvalordeunavariabledebemosdeprecederlapor$yutilizarlaordenecho.La ordenechosirve,adems,paramostrarunalneadetextoporpantalla.
echo$variable echofrase

$bash$ echo$var pr ueba prueba123 $bash$ echo$no mb re2 FernandoLpez $bash$ echo${m at rizpr u[0]} prueba $bash$ echo${m at rizpr u[3]} 3 $bash$ echoEs toesuna f rase Estoesunafrase $bash$ echo Eldir ect oriocon tiene `ls |w c l`f icher os Eldirectoriocontiene12ficheros.

Observadquelascomillasoelcarcterdeescapenoformanpartedelvalordelavariableuna vezqueserealizalaasignacin. Enelltimoejemplo,utilizamoselacentoparaindicarlealashellqueelcomandoqueremosque loejecuteynoquelotratecomounacadenams. Paraeliminarunavariabledeentornopodemosusarelcomandounset.Porejemplo:

55

3.5.- Variables

$unsetNOMBRE

3.5.3. Personalizarelprompt
Elprompteselindicadordequelalneadecomandosestlibreparaaceptarunanuevaorden. Enlasaulasdeprcticas,el prompt pordefectoes $bash$,sinembargopodemospersonalizarlo paraquepongaloquenosotrosqueramos. LacadenaquesemuestraenelpromptsealmacenaenlavariabledeentornoPS1,porlotanto, bastarconcambiarelvalordeesavariable,paracambiarelpromptdenuestrosistema. LaTabla3.8muestraalgunasopcionesquepodemosusarparapersonalizarelprompt,veamos algunasdeellas. Opcin \A \d \H \h \j \n \r \s \t \T \u \v \w \W \# Descripcin LahoraenformatoHH:MM Lafechaenformatosemanamesdia Hostname Elnombredelamquinahastaelprimerpunto Nmerodejobshijosdelshell Retornodecarroynuevalnea Retornodecarro Nombredelshell HoraenformatoHH:MM:SScon12horas Horaenelformatoanteriorperocon24horas Nombredeusuario VersindeBash Rutadeldirectorioactual Nombredeldirectorioactual(sinruta) Nmerodecomandosejecutado
56

3.5.- Variables

Opcin

Descripcin

\$ \nnn \\

#sisomosroot,o$encasocontrario Cdigodecarcteramostrarenoctal Labarrahacaatrs


Tabla3.8:Opcionesdepersonalizacindelprompt

Conocereldirectoriodetrabajo Alpromptpodemosaadirlemuchasopcionesquenosayudenatrabajar;quizslamsusadaes \wquemuestraeldirectoriodondeestamossituadosencadamomento.


$bash$ PS1='\w>' ~>

Donde~significaqueestamoseneldirectoriohome. Sabersisomos root ousuario Esmuytpicoquerersabersisomosrootocualquierotrousuariodelamquina,paralocualse usalaopcin\$quemuestrauna#sisomosroot,oun$encualquierotrocaso.


~> PS1='\w\$' ~$

Saberenquemquinaestamos Muchasvecesel prompt nosayudaasaberenquemquinaestamossituados,estoes til,por ejemplo,cuandotenemoslacostumbredehacermuchostelnetosshaotrasmquinas.Enestecaso, podemosusarlaopcin\Hquenosdaelnombredelamquinadondeestamossituados,olaopcin \hquenosdaelnombredelamquinaslohastaelprimerpunto:


~$ PS1='\h\w\$' rabinf1 41~$ PS1='\H\w\$' rabinf1 41.uco. es~$

57

3.5.- Variables

Mostrarelnombredelusuario Laopcin\unosmuestraelusuarioconelqueestamosconectados.Esteesunpromptbastante til:


rabinf1 41.uco. es~$ PS1='\u@h:\w\$ mluq ue@r abinf1 41:~$

Apartedelpromptbsico(suvalorseobtienedelavariablePS1)quenosindicasilalneade comandosest preparadapararecibirunanuevaorden,existenotros prompts enelsistema.Sus cadenasvienedeterminadasporlosvaloresdelasvariablesPS2,PS3yPS4. As,PS2eselpromptsecundarioypordefectovale>.Seusacuandoescribimosuncomando inacabado.Porejemplo:


$bash$ echoEn unlugarde laManch ade cu yonombreno \ >q uier oacor dar me noa muchotie mpo viva un\ >hidal gocab aller o. EnunlugardelaManchadecuyonombrenoquieroacordar noamuchotiempovivaunhidalgocaballero.

PS3yPS4sonpromptsdeprogramacinydepuracin.

3.5.4. Variablesdeentornointernas
Existenunaseriedevariablesdeentorno,lascualesseresumenenlaTabla 3.9,quenolas fijamosnosotrossinoquelasfijaelshell,ycuyovaloresdeslolectura. Variable SHELL LINES COLUMNS HOME PWD OLDPWD Descripcin Pathdelintrpretederdenesqueestamosusando Lneasdelterminalencaracteres Columnasdelterminalencaracteres Directoriohomedelusuario Directorioactual Anteriordirectorioactua
58

3.5.- Variables

Variable USER

Descripcin Nombredeusuarioconelqueestamosconectados
Tabla3.9:Variablesdeentornointernas

Algunasvariablesseactualizandinmicamente,porejemplo,LINESyCOLUMNSalmacenan entodomomentoelnmerodefilasycolumnasdelapantalla,ylasusanalgunosprogramascomo vioemacsparamodificarsuapariencia.

3.5.5. Exportarvariables
Cuandodefinimosunavariable,esavariablenoesconocidaautomticamenteporlosprocesos hijosquelanzalasesinBash,anoserqueestasepongaexplcitamenteasudisposicin,conel comandoexport. Porejemplo:
$bash$ EDITOR=/sw/bin/joe $bash$ exportEDITOR

Podemosobtenerunlistadodelasvariablesexportadasusandoelcomando envoelcomando export sinargumentos.Paraobtenerlasvariablestantoexportadascomonoexportadasdebemos usarelcomandosetsinargumentos.

3.6. Scripts
EnelCaptulo1(XXX)comentamosquelosintrpretesde rdenesoshellseranlenguajesde programacinyquenuestroobjetivoseraaprenderestelenguaje,enconcreto,elcorrespondienteal Bash.Bien,comencemosaconocerestelenguaje. CuandoprogramamosenC,creamosunficheroconextensin.cdondeescribimoselcdigodel programayacontinuacinlocompilamosparaobtenerelprogramaejecutable.Deigualforma,en Bash,laformamscomndeejecutarprogramasescrearficheros(enestecasoconextensin.sh) quesellamanarchivosinterpretadososcriptsyquecontienenunacoleccinderdenesBashque sernejecutadasporlashell.
59

3.6.- Scripts

Paraimplementarestemecanismo,losdiseadoresdeLINUXsobrecargaronlafuncionalidadde lallamadaalsistemaquepermiteejecutarunprograma,lallamada exec.Deestaforma,cuando mandamosaejecutarunprograma,lafuncinexeccompruebasielarchivoesbinarioono.Siesun binario,resultadodeunacompilacin,loejecutaenlaformausual.Perosielarchivonoesbinario, lafuncin exec est diseadaparasuponerqueloquecontieneelarchivoson rdenesparaun intrpretede rdenes,porloqueejecutaunshellylepasaelcontenidodelarchivoparaquelo interprete.Deaqu elnombredearchivosinterpretados.Ahorabien,elshellcreadopor exec por defectoesunBourneshell(bash)Qu ocurresiqueremosejecutarunprogramaescritoenotro lenguajeshell? Enestecasoseutilizaelsiguienteconvenio:laprimeralneadelarchivointerpretadodebe contener el programa intrprete al que se le debe pasar el resto del contenido del archivo. El convenioparaindicarelintrpretees:
#!path_absoluto_del_interprete[argumentos] #!/bin/bash

Deestamanera,podemosejecutarprogramasshelldeunamanerasencilla. Estaindicacin debesersiemprelaprimeralneadelscriptynopuedetenerblancos.

3.6.1. Primerospasosconscripts
Paracrearun script usamoscualquiereditordetextoyloguardamosenunfichero.Unavez creadoelscriptexistendosformasdeejecutarlo: 1. Laprimeraformaimplicadaralficheropermisodeejecucin(conelcomandochmod). Unavezdadoestepermiso,podremosejecutarlosimplementeponiendo./script.Dehecho, muchoscomandoscomunes(p.e.spelloman)estnimplementadoscomoscriptsBashyno comoprogramasCejecutables.
./<ficheroscript>

2. Lasegundaconsisteenejecutarloconelcomandosource,elcualcargaelficheroenla
60

3.6.- Scripts

memoriadeBashyloejecuta.
source<ficheroscript>

Unadiferenciaentreestasdosformasdeejecutarunscriptesquesiloejecutamosconsource, ste se ejecuta dentro del proceso del shell, mientras que si lo ejecutamos como un fichero ejecutableseejecutaenunsubshell.Estoimplicaqueslolasvariablesdeentornoexportadasson conocidasporelnuevosubshellqueejecutaelprograma;yquelasvariablesqueseancreadasenla ejecucindelprogramaseconocernasufinalizacin. Nuestroprimer script :Holamundo Paracrearunscriptbastaconabrirunficheroconcualquiereditordetexto(nedit,pico,vi,gedit) y,acontinuacin,indicarlasaccionesquequeramosquerealicenuestroscript.
#!/bin/bash echoHolaMundo

Estescript(hello.sh)tieneslodoslneas.Laprimeraleindicaalsistemaqu programausar paraejecutarelfichero;ylasegundaeslanicaaccinrealizadaporestescript,queimprime'Hola mundo'enlaterminal. Sisalealgocomo ./hello.sh:Comandodesconocido,probablementela primera lnea, '#!/bin/bash', est mal escrita. Ejecutad whereis bash para saber donde se encuentraelcomandobashyaseguraosdequelasbarrassonlasadecuadasyquenohabis dejadoespacios. Un script decopiadeseguridadmuysimple Elsiguientescript(copiaSegurida.sh),creaunacopiadeseguridaddeldirectoriohome.
#!/bin/bash tarxvf/var/copia.tar/home/in1lurom gunzip/var/copia.tar

Estescript,envezdeimprimirunmensajeenlaterminal,empaquetaycomprimeeldirectorio homedelusuario.

61

3.6.- Scripts

Comentariosenlos scripts Enunscripttodoloquevayadespusdelsmbolo#yhastaelsiguientecarcterdenuevalnea setomacomocomentarioynoseejecuta.


echoHolatodos#comentariohastafindelnea

sloimprime"Holatodos".
#cat/etc/passwd

noejecutanada,pueselsmbolo#conviertetodalalneaencomentario. Losscriptssuelenencabezarse(despusdelalnea#!/bin/bash)concomentariosqueindicanel nombre del archivo y lo que hace el script. Tambin se suelen colocar comentarios de documentacin en diferentes partes del script para mejorar la comprensin y facilitar el mantenimiento.Uncasoespecialeselusode#enlaprimeralneaparaindicarelintrpreteconque seejecutarelscript.Unscriptconcomentariosquedaraas:
#!/bin/bash #misdatos.sh# #muestradatospropiosdelusuarioqueloinvoca # echoMISDATOS. echoNombre:$LOGNAME echoDirectorio:$HOME echonFecha: date#muestrafechayhora echo#lneaenblancoparapresentacin #finmisdatos.sh

Este script (misdatos.sh)muestraporpantallaunaseriededatossobreelusuario.Paraello, utilizavariablesdeentorno.

3.6.2. Variableenlosscripts
IgualquecuandoprogramamosenC,dentrodelos scripts sepuedenutilizarvariablespara clarificarofacilitarlacompresindelprograma.Sinoseespecificaotracosa,lasvariablesBash
62

3.6.- Scripts

sondetipocadena,porloquepuedencontenerunnmero(representadocomounacadena),un carcter o una cadena de caracteres. Su creacin, consulta y borrado es igual a la vista en el apartado5;noesnecesariodeclararla,secrearsloconasignarleunvalorasureferencia.
#!/bin/bash #Ejemplo1devariables cad=HolaMundo echo$cad

El script anterior (variables.sh) crea una variable cad con el valor Hola mundo y a continuacinlamuestraporpantalla.
#!/bin/bash #Ejemplo2 nombre="FulanitodeCopas" echo"$nombre(asignadoentrecomillas)" echoSiloasignosincomillaspasaesto: nombre=FulanitodeCopas

Elscriptanteriordaracomoresultadolosiguiente
$bash$ ./ejem plo2 FulanitodeCopas(asignadoentrecomillas) Siloasignosincomillaspasaesto: ./demo04.variables:line7:de:commandnotfound

Alasignarunacadenaquecontieneespaciosaunavariable,sinutilizarcomillas,nosdaunerror. Otroejemploconvariables
#!/bin/bash #Ejemplo3:asignacindevariables echon"Asignosincomillasaunavariablelacadena demo*ylaescribo" nombre=demo* echo$nombre echonAsignoahoraconcomillaslamismacadenayescribo lavariable" nombre=demo*

63

3.6.- Scripts

echo$nombre

El script anteriordacomoresultadodelprimerecho,unlistadocontodoslosarchivosque empiezancondemo,ycomoresultadodelsegundoecho,lacadenademo*


mluq ue@r abinf1 41:/tm p/bash $./ej em pl o3 Asignosincomillasaunavariablelacadenademo*ylaescribo demo01.hola_mundodemo02.hola_mundodemo03.entorno demo04.variablesdemo04.variables~demo05.variables Asignoahoraconcomillaslamismacadenayescribolavariable demo*

Porqu?

3.6.3. Pasodeargumentosalosscripts
Enocasiones,puedesertilquenuestrosscriptsrecibanalgntipodeargumento(undirectorio sobreelqueactuarountipodearchivoquebuscar)alserejecutados.Parahacerreferenciaaestos argumentos,dentrodelosscriptsseempleanunaseriedevariablesquesiempreestarndisponibles, los parmetrosposicionales $1,$2,$3,..., ,siendo $0 elnombredelpropioprograma.Reciben estenombreporqueselesreconoceporsuubicacin,esdecirelprimerargumentoes $1,elsegundo $2yassucesivamente. Porejemploimaginemosquecreamoselscriptsiguiente:
#!/bin/bash #Ejemplo4:scriptquerecibeparmetrosylosimprime echo"Elscript$0" echo"Recibelosargumentos$1$2"

Silohemos guardado enunficherollamado ejemplo4.sh conelpermisoxactivadopodemos ejecutarloas:


$bash$ ./ejemplo4.shholaadis Elscript./ejemplo4.sh Recibelosargumentosholaadis

64

3.6.- Scripts

Nosepuedemodificarelvalordelasvariablesposicionales,slosepuedenleer;sise intentaasignarlesunvalorseproduceunerror. Sielargumentoposicionalalquealudimosnosepasacomoargumento,entoncestieneelvalor nulo.


#!/bin/bash #Ejemplo5:scriptquerecibeparmetrosylosimprime echo"Elscript$0" echo"Recibelosargumentos$1$2$3$4"

Silohemos guardado enunficherollamado ejemplo5.sh conelpermisoxactivadopodemos ejecutarloas:


$bash$ ./ejemplo5.shholaadios Elscript./ejemplo5.sh Recibelosargumentosholaadios

Lasvariables$*,$@y$# Lavariabledeentorno$#almacenaelnmerototaldeargumentosoparmetrosrecibidosporel scriptsincontaral$0.Elvaloresdetipocadenadecaracteres,peromsadelanteveremoscomo podemosconvertirestevaloranmeroparaoperarconl.Lavariables$*y$@contienen,ambas, losvaloresdetodoslosargumentosrecibidosporelscript. Comoejemplo,elscriptdelEjemplo4lovamosamodificartalcomomuestraelEjemplo6para queuseestasvariablesparasacarlosargumentosrecibidos.


#!/bin/bash #Ejemplo5:scriptquerecibeparmetrosylosimprime echo"Elscript$0recibe$#argumentos:"$* echo"Elscript$0recibe$#argumentos:"$@

Alejecutarloobtenemos:
$bash$ ./ejemplo5.shholaadios Elscript./ejemplo5.shrecibe2argumentos:holaadios

65

3.6.- Scripts

Elscript./ejemplo5.shrecibe2argumentos:holaadios

Aunque cuando no entrecomillamos $* o $@ no existen diferencias entre usar uno y otro, cuandolosencerramosentrecomillasdobles(),podemoscambiarelsmboloqueusa $* para separar los argumentos cuando los muestra por pantalla. Por defecto, cuando se imprimen los argumentos,estosseseparanporunespacio,peropodemosutilizarotroseparadorindicndoloenla variabledeentornoIFS(InternalFieldSeparator).Lavariable$@siempreusacomoseparadorun espacioynosepuedecambiar.Porejemplosihacemoselsiguientescript:
#!/bin/bash #Ejemplo7:scriptquerecibeparmetrosylosimprime IFS=',' echo"Elscript$0recibe$#argumentos:$*" echo"Elscript$0recibe$#argumentos:$@"

Alejecutarloobtenemos:
$bash$ ejemplo6holaadios Elscript./reciberecibe2argumentos:hola,adios Elscript./reciberecibe2argumentos:holaadios

Vemoscomo,enelcasode $*,losargumentosseseparanporelsmbolocoma(,)(separador establecidoenlavariableIFS),mientrasqueenelcasode$@sesiguenseparandoporespacios(no leafectaelvalordelavariableIFS). Siempre conviene entrecomillar las variables $* y $@ para evitar que los argumentos que contenganespaciosseanmalinterpretados. Expansindevariablesusandollaves Realmentelaformaqueusamosparaveraccederalcontenidodeunavariable, $variable,esuna simplificacindelaformamsgeneral${variable}.Lasimplificacinsepuedeusarsiemprequeno existanambigedades.Enesteapartadoveremoscuandoseproducenlasambigedadesquenos obliganausarlaforma${variable}. Laforma${variable}seusasiemprequelavariablevaseguidaporunaletra,dgitooguinbajo
66

3.6.- Scripts

(_);encasocontrario,podemosusarlaformasimplificada $variable.Porejemplo,siqueremos escribirnuestronombre(almacenadoenlavariablenombre)ynuestroapellido(almacenadoenla variableapellido)separadosporunguinpodramospensarenhacer:


$bash$ nombre=Fernando $bash$ apellido=Lopez $bash$ echo"$nombre_$apellido" Lopez

PeroestoproduceunasalidaincorrectaporqueBashhaintentadobuscarlavariable $nombre_ quealnoexistirlahaexpandidoporunacadenavaca. Parasolucionarlopodemosusarlasllaves:


$bash$ echo"${nombre}_$apellido" Fernando_Lopez

Otro lugar donde necesitamos usar llaves es cuando vamos a sacar el dcimo parmetro posicional.Siusamos$10,Bashloexpandirpor$1seguidodeun0,mientrasquesiusamos${10} Bashnosdareldcimoparmetroposicional Tambinnecesitamosusarlasllavescuandoqueremosaccederaloselementosdeunavariable multipalabra.Porejemplo:
$bash$ matr iz=(uno dos tres) $bash$ echo $mat riz uno $bash$ echo $mat riz[ 2] uno[2] $bash$ echo ${matr iz[2]} tres

67

3.7.- Ejercicios

3.7. Ejercicios
1.Despusdeejecutarlassiguientesrdenes:i)lsii)dateiii)cat>pru.txtiv)wclpru.txt v)lslvi)chmod644pru.txtvii)echo$PATHviii)cd..ix)pwdx)echoHolamundo

Visualizalas5ltimardenesejecutadas Muestraeltamaomximodellistadohistrico Culestuarchivohistrico?Cmolohasencontrado?

2.Suponiendoellistadoderdenesdelejercicioanterioryutilizandoelsignobang(!):

Muestralaordenqueocupalaposicin7 Ejecuta,unaordenquecomienceporlacadenaecho Muestrasinejecutarlaltimapalabradelaltimaordenejecutada

3.Creaunalneaderdenesqueindiquemedianteunmensajesilaejecucindelaorden cat prueba.txttuvoxitoono.Laordendeberredirigirlasalidadeerrordeformaadecuada. 4.Muestra los siguientes mensajes en pantalla haciendo uso de la orden echo. (Las indicacionesennegritayentre<>indicaquehayqueejecutarunaordenparaobtenerese valor)

Elnumerodelneasdelarchivopru.txtes<Numerodelneasdepru.txt> Eltamaodelficheropru.txtes<Tamaodelficheropru.txt> Lavariable$DIRalmacenaeldirectorio\home\123

5.Creaunaliasllamadocomprimirqueempaqueteycomprimaundirectoriocualquiera.

68

3.7.- Ejercicios

6.CreaunaliasllamadobuscarCquebusquetodoslosarchivosconextensin.capartirde tudirectoriohome. 7. Crea una variable fecha cuyo contenido sea la fecha y hora actual. Comprueba su contenido. 8.Modificatupromptparaquemuestreelsiguienteaspectou(h):dr donde:

u estunombredeusuario d eselnombredeldirectorioenelqueteencuentras(rutacompleta) r indicasieresrootousuario h eslahoraactual

9.Creaunscriptdenombredatos.shqueejecutelassiguientestareas:

Listelosficherosdeldirectorioactual,separndolosporunacoma(verayudadells) Muestreelnmerodeficheros(archivosydirectorios)quehayeneldirectorioactual MuestreelvalordelavariablePATH Muestreelnmerodefilasycolumnasqueaceptalapantalla Usecomentariosdentrodelficherocreadoparaexplicarantesdecadaordensuutilidad

10.Ejecutaelscriptanterioryalmacenasusalidaenunficheroquesellameinformacion.txt 11.Creaunscript,denombrecopia.sh,querealice

Unacopiadelficherocreadoenelejercicioanterior(informacion.txt)enelfichero

informacionDuplicada.txt

Aada al final del fichero informacionDuplicada.txt el contenido ordenado de

informacion.txt
69

3.7.- Ejercicios

12.Realizaunscript,connombreinfoDir.sh,querecibacomoprimerparmetroelcamino completodeundirectorioymuestreporpantalla:a)Losficherosqueempiezanporunavocal yb)elnmerototaldeficherosydirectoriosquehayenesedirectorio. 13.Creaunscript,connombremueveFicherosTexto.sh,querecibacomoprimerparmetro el nombre de un directorio que no existe y como segundo parmetro el nombre de un directorioqueexiste.Elscriptdebercrearelprimerdirectorioymovertodoslosficherosque acaben en .txt del directorio pasadocomo segundo argumento al directorio pasadocomo primerargumento. 14.Crea un script, que se llame intercambiar.sh, que acepte dos argumentos. Los dos argumentossecorrespondernconlosnombresdedosarchivosexistentescuyoscontenidos sernintercambiadosalejecutarelscript.Porejemplo,sielarchivofich1contienelapalabra holayelarchivofich2contienelapalabraadis,alejecutarelscriptydarlecomoargumentos losnombresdeestosdosarchivos,elresultadoser que fich1 contendr lapalabraadisy fich2contendrlapalabrahola. 15.CreaunscriptllamadocopiaSeguridad.shquerecibacomoprimerparmetroelnombre de un directorio y como segundo parmetro el nombre de un fichero. El script deber empaquetarycomprimireldirectoriopasadocomoprimerparmetroenunarchivoconel nombredelsegundoparmetro. 16.CreaunscriptllamadocrearScript.shalcualselepasacomoargumentoelnombredel scriptacrear.CrearScript.hcrearotroscript,cuyonombreserelargumentorecibido,yuna vezcreado,ledar permisosdeejecucin.Elsegundoscriptrecibir comoargumentosel nombredeunficheroyelnombredeundirectorio;crear eldirectorioyhar unacopiadel ficheroeneldirectoriorecincreado.

70

4.- PROGRAMACIN BASH I

4. PROGRAMACINBASHI
4.1. Variablescontipo
Hastaahoratodaslasvariablesquehemosusadosondetipocadenadecaracteres.Aunqueenlos primerosshellslasvariablesslopodancontenercadenasdecaracteres,despusseintrodujola posibilidaddeasignaratributosalasvariablesqueindiquen,porejemplo,quesonenterasodeslo lectura.Parafijarlosatributosdelasvariables,tenemoselcomandointernodeclare,elcualtienela siguientesintaxis:
declare[opciones][nombre[=valor]]

LaTabla 4.1 describelasopcionesquepuederecibirestecomando.Unapeculiaridaddeeste comandoesqueparaactivarunatributoseprecedelaopcinporunguin,conloquepara desactivarunatributodecidieronprecederlaopcinporun+. Opcin a f F i r x Descripcin Lavariableesdetipoarray Mostrarelnombreeimplementacindelasfunciones Mostrarsloelnombredelasfunciones Lavariableesdetipoentero Lavariableesdeslolectura Exportalavariable(equivalenteaexport)
Tabla4.1:Opcionesdelcomandointernodeclare

Siescribimosdeclaresinargumentos,nosmuestratodaslasvariablesexistentesenelsistema. Siusamosla opcinf, nosmuestraslolosnombresdefunciones(lasveremosenlaprctica siguiente)ysuimplementacin,ysiusamosla opcinF,nosmuestraslolosnombresdelas funcionesexistentes.

71

4.1.- Variables con tipo

Laopcinideclara(Bashnoexigequesedeclarenlasvariables)lavariabledetipoentero,lo cual permite que podamos realizar operaciones aritmticas con ella. Por ejemplo, si usamos variablesnormalespararealizaroperacionesaritmticas:
$bashvar1=5 $bashvar2=4 $bashresult ado=$var1*$var2 $bashecho$resul tado 5*4

Sinembargo,siahorausamosvariablesdetipoentero:
$bashdeclareivar1=5 $bashdeclareivar2=4 $bashdeclareiresul $bashecho$resul tado 20 tado $bashresult ado=$var1*$var2

Paraquelaoperacinaritmticatenga xito,noesnecesarioquedeclaremoscomoenterasa var1yvar2,bastaconquerecojamoselvalorenunavariableresultadodeclaradacomoentera. Esdecir,podramoshacer:


$bashresult ado=4*6 $bashecho$resul tado 24

Einclusopodemosoperarconvariablesinexistentes:
$bashresult ado=4*var_ine $bashecho$resul tado 0 xi st ent e

Podemossabereltipodeunavariableconlaopcinp.Porejemplo:
$bashdeclarepresultado declareiresultado="24"

Laopcinxesequivalenteausarelcomandoexportsobrelavariable.Ambassonformasde
72

4.1.- Variables con tipo

exportarunavariable. Laopcinrdeclaraunavariablecomodeslolectura,conloqueapartirdeesemomentono podremosmodificarlaniejecutarunsetsobreella.Existeotrocomandointernollamadoreadonly quenospermitedeclararvariablesdeslolectura,peroquetienemsopcionesquedeclarer.En concreto,readonlypnosmuestratodaslasvariablesdeslolectura:


$bashreadonl yp declarearBASH_VERSINFO='([0]="2"[1]="05b"[2]="0" [3]="1"[4]="release"[5]="powerpcappledarwin7.0")' declareirEUID="503" declareirPPID="686" declareirUID="503"

Ademssenosindicasilavariableesdetipoarray(a)oentero(i)

4.2. Expresionesaritmticas
LosvaloresdetodaslasvariablesdelashelldeBashsealmacenanenformadecadenasde caracteres.Aunqueestacaractersticahacequeelprocesamientodedatossimblicosseafcily agradable,tambinhacequeelprocesamientodedatosnumricospresentealgunasdificultades.La raznesquelosdatosenterossealmacenan,enrealidad,enformadecadenasdecaracteres.Para poderrealizaroperacionesaritmticasylgicasconellos,esprecisotraducirlosaenterosyvolvera traducirelresultadoaunacadenadecaracteresparaalmacenarlacorrectamenteenunavariablede lashell. Afortunadamente,enlashelldeBashexistenvariasmanerasderealizaroperacionesaritmticas condatosnumricos:

Utilizandolaexpansindelshell$((expresin)) Utilizandolaordenlet

Laevaluacindeexpresionesseefectaempleandoenteroslargosynosehacencomprobaciones de desbordamiento. Cuando se utilizan variables de la shell en un expresin, las variables se


73

4.2.- Expresiones aritmticas

expanden(sesustituyenlasvariablesporsusvaloresenlaexpresin)ysetraducenaltipoentero largoantesdeefectuarlaevaluacindelaexpresin.

4.2.1. Expansindelshell$((expresin))
Paraqueelshellevaleunaoperacinaritmticaynolatomecomoargumentosdeuncomando, lasexpresionesaritmticasdebernirencerradasentre$((y)).
$((expresin))

Lasexpresionesaritmticas,aligualquelasvariablesylasustitucindecomandos,seevalan dentrodelascomillasdoble().
Basndonosenelcomandodate+%j,quenosdevuelveelnmerode da Juliano, hacer un script que nos diga cuantos das quedan hastaelprximo31deDiciembre. Elcomandosepuedeimplementarrestandoa365daselnmerode dastranscurridosas: $bash echo "$( ( 365 $(dat e +%j ) )) dias par a el 31 de Dic"

EnlaTabla4.2,semuestranalgunosdelosoperadoresaritmticossoportadosporBash. Operador + * / % () ** Suma Multiplicacin Resta Divisinentera Restodeladivisinentera Agruparoperaciones Potencia


Tabla4.2:OperadoresaritmticosadmitidosporBash

Descripcin

74

4.2.- Expresiones aritmticas

4.2.2. SimilitudconlasexpresionesaritmticasC
LasexpresionesaritmticasdeBashsehandiseadodeformaequivalentealasexpresionesde C.Porejemplo$((x+=2))aade2ax. Aunquealgunosoperadores(p.e.*olosparntesis)soncaracteresespecialesparaBash,nohace faltaprecederlosporelcarcterdeescapesiemprequeestndentrode $((...)).Igualmente,alas variablesqueestndentrodelaexpresinaritmticanohacefaltaprecederlaspor$paraobtenersu valor. Bash,adems,nospermiteusarlosoperadoresrelacionales(<,>,<=,>=,==,!=)ylgicosdeC (!,&&,||)interpretando,aligualqueC,el1comociertoyel0comofalso.

4.2.3. Elcomandointernolet
El comando interno let nos permite asignar el resultado de una expresin aritmtica a una variable.Tienelasiguientesintaxis:
letvar=expresion

expresionescualquierexpresinaritmticaynonecesitaestarencerradaentre$((...)). Elcomando let,adiferenciadelcomando declarei,nocreaunavariabledetipoentero,sino unavariabledetipocadenadecaracteresnormal.Porejemplo:


$bashleta=4 *3 $bashdeclarepa declarea="12"

Vemosqueaesdetipocadena,mientrasquesiusamosdeclareinoslacreadetipoentero:
$bashdeclareia=3 $bashdeclarepa declareia="12" *4

Aligualquepasaconlasvariablesnormales,lasdeclaradascon let nopuedentenerespacios entrelavariableyelsigno=,nientreelsigno=yelvalor.Noobstante,spuedentenerespaciossi encerramoslaexpresinentrecomillas:


75

4.2.- Expresiones aritmticas

$bashletx=" (9*5) /7 " $bashecho$x 6

4.3. Lassentenciascondicionales
4.3.1. Lassentenciasif,elifyelse
Lasentenciacondicionaltieneelsiguienteformato:
ifcondicin then sentenciasthenif elifcondicin then sentenciasthenelif else sentenciaselse fi

Ellenguajenosobligaaquelassentenciasestnorganizadasconestosaltosdelnea,aunque tambin se puedenponerlos then enlamismalneaquelos if,paralocualdebemosusar el separadordecomandos,queenBasheselpuntoycoma(;),as:


ifcondicin;then sentenciasthenif elifcondicin;then sentenciasthenelif else sentenciaselse fi

76

4.3.- Las sentencias condicionales

4.3.2. Loscdigosdeterminacin
EnUNIXloscomandosterminandevolviendouncdigonumricoalquesellamacdigode terminacin(exitstatus)queindicasielcomandotuvoxitoono. Aunquenoesobligatorioqueseaas,normalmenteuncdigodeterminacin0significaqueel comandotermincorrectamente,yuncdigoentre1y255correspondeaposiblescdigosdeerror. Encualquiercasosiempreconvieneconsultarladocumentacindelcomandoparainterpretarmejor sus cdigos de terminacin. Por ejemplo, el comando diff devuelve 0 cuando no encuentra diferenciasentrelosficheroscomparados,1cuandohaydiferencias,y2cuandoseproducealgn error(p.equeunodelosficherospasadoscomoargumentonosepuedeleer). Lasentenciaifcompruebaelcdigodeterminacindeuncomandoenlacondicin,sistees0 lacondicinseevalacomocierta.Luegolaformanormaldeescribirunasentenciacondicional if es:
ifcomando;then Procesamientonormal else Procesamoselerror fi

Cmopodemosconocerelcdigodeterminacindeuncomando? Para ello podemosusar lavariableespecial ?,cuyovalores $?,yqueindicaelcdigo de terminacindelltimocomandoejecutadoporelshell.Porejemplo:


$bashcddire rroneo bash:cd:direrroneo:Nosuchfileordirectory $bashecho$? 1

Alhaberfalladoel ltimocomando $?vale1.Sinembargo,sielcomandoseejecutabien $? valdr0:


$bashcddirexi stent e

77

4.3.- Las sentencias condicionales

$bashecho$? 0

Lavariable?debedeserledajuntodespusdeejecutarelcomando,siendomuytpicoguardar suvalorenunavariablect=$?parasuposterioruso.

4.3.3. Lasentenciaexit
Lasentenciaexitpuedeserejecutadaencualquiersitio,yloquehaceesabandonarelscript. Sueleusarseparadetectarsituacioneserrneasquehacenqueelprogramadebadetenerse,aunquea vecesseutilizapara"cerrar"unprograma.

4.3.4. Operadoreslgicosycdigosdeterminacin
Podemoscombinarvarioscdigosdeterminacindecomandosmediantelosoperadoreslgicos and(representadacon&&)or(representadacon||)ynot(representadacon!). Estasoperaciones,aligualqueenotroslenguajescomoCoJava,funcionanenshortcut,esdecir, elsegundooperandosloseevalasielprimeronodeterminaelresultadodelacondicin.Segn estolaoperacin:
ifcd/tmp&&cp001.tmp$HOME;then fi

Ejecutaelcomandocd/tmp,ysi stetiene xito(elcdigodeterminacines0),ejecutael segundocomando cp001.tmp$HOME,perosielprimercomandofalla,yanoseejecutael segundoporqueparaquesecumplalacondicinamboscomandosdeberandetener xito(siun operandofallayanotienesentidoevaluarelotro). Eloperador||porcontraejecutaelprimercomando,yslosi stefallaseejecutaelsegundo. Porejemplo:
ifcp/tmp/001.tmp~/d.tmp||cp/tmp/002.tmp~/d.tmp then

78

4.3.- Las sentencias condicionales

fi

Aqu,sielprimercomandotienexito,yanoseejecutaelsegundocomando(yaquesetienela condicinconquesecumpleunodesusoperandos). Obsrvese,queadiferenciadeC,elcdigodeterminacin0eselqueindicaverdadero,y cualquierotrocdigoindicafalso. Porltimoeloperador!niegauncdigodeterminacin.Porejemplo:


if!cp/tmp/001.tmp~/d.tmp;then Procesaelerror fi

4.3.5. Testcondicionales
Lasentenciaiflo nicoquesabeesevaluarcdigosdeterminacin.Peroestonosignificaque slopodamoscomprobarsiuncomandosehaejecutadobien.Elcomandointernotestnospermite comprobarotrasmuchascondiciones,quelepasamoscomoargumento,paraacabardevolvindonos uncdigodeterminacin.
test[condicin]

Una forma alternativa al comando test es el operador [[ ]] dentro del cual metemos la condicinaevaluar
[[condicin]]

esdecir,testcadena1=cadena2esequivalentea[[cadena1=cadena2]].Los espaciosentreloscorchetesylosoperandos,oentrelosoperandosyeloperadordecomparacin = sonobligatorios. Usandolos test condicionales podemosevaluaratributosdeunfichero(siexiste,quetipode ficheroes,quepermisostiene,etc.),comparardosficherosparavercualdeellosesmsreciente, comparar cadenas, e incluso comparar los nmeros que almacenan las cadenas (comparacin numrica).

79

4.3.- Las sentencias condicionales

Comparacindecadenas LosoperadoresdecomparacindecadenasseresumenenlaTabla4.3.Lascomparacionesque serealizanconlossmbolos<y>sonlexicogrficas,esdecircomparacionesdediccionario,donde porejemploqesmayorqueperro.Obsrvesequenoexistenoperadores<=y>=yaquesepueden implementarmedianteoperacioneslgicas. Operador str1=str2 str1!=str2 str1<str2 str1>str2 nstr1 zstr1 Verdaderosi... Lascadenassoniguales Lascadenassondistintas str1esmenorlexicogrficamenteastr2 str1esmayorlexicogrficamenteastr2 str1esnonulaytienelongitudmayoracero str1esnula(tienelongitudcero)
Tabla4.3:Operadoresdecomparacindecadenas

Cuandoseutilizanoperadoresdecomparacindecadenas,lasvariablesqueaparezcanenla comparacindebenirencerradasentrecomillasdobles.
fichero=$1 if[[z"$fichero"]];then echo'Use:muestraFichero<fichero>' else cat$fichero fi

Aunquenormalmenteseconsideramejortcnicadeprogramacinelencerrartodoelcdigo dentrodeunbloque if yelcomportamientoerrneodentrodeotrobloque else,enestecasoel bloqueifcorrespondeaunasituacindeerrorquedeberaabortartodoelscript,conloquevamosa ponerunexit,ydejamoselejemplocomosemuestraacontinuacin:


#Scriptquemuestralaslneasdeunfichero #Tienelaforma #muestraFichero<fichero>

80

4.3.- Las sentencias condicionales

fichero=$1 if[[z"$fichero"]];then echo'Use:muestraFichero<fichero>' exit1 fi cat$fichero

Comparacinnumricadeenteros Elshelltambinpermitecompararvariablesquealmacenennmeros,paraellosedebende utilizarlosoperadoresdelaTabla4.4 Operador lt le eq ge gt ne Descripcin Menorque Menoroigualque Igualque Mayorigualque Mayorque Diferente

Tabla4.4:Operadoresdecomparacinnumricadecadenas

Combinacindecondiciones.Operadoreslgicos Lostestdecondicin(losquevanentrecorchetes[[]])tambinsepuedencombinarusandolos operadoreslgicos&&,||y!.


if[[condicion]]&&[[condicion]];then

Tambinesposiblecombinarcomandosdelshellcontestdecondicin:
ifcomando&&[[condicion]];then

Adems,aniveldetestdecondicin(dentrodelos [[]])tambinsepuedenusaroperadores lgicos,peroenestecasodebemosdeusarlosoperadoresa(paraand)yo(paraor).

81

4.3.- Las sentencias condicionales

Porejemplo,lasiguienteoperacincompruebaque$reintegroseamenoroiguala$saldo, yque$reintegroseamenoroiguala$max_cajero:
if[$reintegrole$saldoa$reintegrole$max] then fi

Aunqueeloperadorlgicoatienemenorprecedenciaqueeloperadordecomparacinle,en expresiones complejasconvieneusar parntesisqueayudenaentenderlaexpresin.Siusamos parntesisdentrodeuntestdecondicinconvienerecordardosreglas:

Losparntesisdentrodeexpresionescondicionalesdebenirprecedidosporelcarcterde

escape\(paraevitarqueseinterpretencomounasustitucindecomandos).

Losparntesis,aligualqueloscorchetes,debendeestarseparadosporunespacio.

Luegolaoperacinanteriorsepuedeescribircomo:
if[\($reintegrle$saldo\)a\($reintegrole$max\)] then fi

Comprobaratributosdeficheros Eltercertipodeoperadoresdecomparacinnospermitencompararatributosdefichero.Existen 22operadoresdeestetipoqueseresumenenlaTabla4.5. Operador afichero bfichero cfichero dfichero efichero ffichero ficheroexiste ficheroexisteyesundispositivodebloque ficheroexisteyesundispositivodecarcter ficheroexisteyesundirectorio ficheroexiste(equivalenteaa) ficheroexisteyesunficheroregular Verdaderosi...

82

4.3.- Las sentencias condicionales

Operador gfichero Gfichero hfichero kfichero Lfichero Nfichero Ofichero pfichero rfichero sfichero Sfichero ufichero wfichero xfichero

Verdaderosi... ficheroexisteytieneactivoelbitdeseguridad ficheroexisteyesposedoporelgrupoIDefectivo ficheroexisteyesunenlacesimblico ficheroexisteytieneelstrickybitactivado ficheroexisteyesunenlacesimblico ficheroexisteyfuemodificadodesdelaltimalectura ficheroexisteyesposedoporelgrupoIDefectivo ficheroexisteyesunpipeonamedpipe ficheroexisteypodemosleerlo ficheroexisteynoestavaco ficheroexisteyesunsocket ficheroexisteytieneactivoelbitdesetuid ficheroexisteytenemospermisodeescritura fichero existe y tenemos permiso de ejecucin, o de bsquedasiesundirectorio

fich1ntfich2 Lafechademodificacindefich1esmsmodernaque ladefich2 fich1otfich2 Lafechademodificacindefich1esmsantiguaque ladefich2 fich1effich2 fich1yfich2sonelmismofichero


Tabla4.5:Operadoresparacomprobaratributosdeunfichero

Elscriptsiguientemuestraelusodeestoatributosenunejemplo.Elscriptcopiaunarchivo pasadocomoargumentoenundirectoriotambinpasadoporargumento.Compruebaqueelfichero y el directorio existan y, adems, que no exista un fichero con el mismo nombre dentro del directorio.

83

4.3.- Las sentencias condicionales

#!/bin/bash #Declaraciondevariables numArg=$# if[[$numArg!=2]] then echo$0"<fichero><directorio>" else #Comprobacionessobreelprimerargumento:fichero if[[a$1]]#Miramossiexisteelprimerargumento then echo"$1existe" if[[f$1]]#Miramossielargumentoesunfichero then echo"$1esunfichero" else echo"$1noesunfichero" exit fi else echo"$1noexiste" exit fi #Comprobacionessobreelsegundoargumento:directorio if[[a$2]] then echo"$2existe" if[[d$2]]#Comprobamossiesundirectorio then echo"$2esundirectorio" else echo"$2noesundirectorio" exit fi else echo"$2noexiste"

84

4.3.- Las sentencias condicionales

exit fi #Comprobamosquenoexistaunficheroconelmismonombreen eldirectorio if[[a$2/$1]] then echo"Existeunficheroconnombre$1eneldirectorio$2" else cp$1$2/.#Copiamoselficheroeneldirectorio fi fi

4.3.6. Ifaritmtico
Lasexpresionesaritmticaspuedenusarseenlasdistintassentenciasdecontroldeflujo,encuyo casolaexpresinvaentredoblesparntesis,perosinel $ delante,porejemplo,el if aritmtico tendralaforma:
if((expresinaritmtica)) then cuerpo fi

if((5+7==12)) then echoSoniguales fi

4.4. Elbuclefor
ElbucleforenBashesunpocodistintoalosbucles fortradicionalesdelenguajescomoCo Java;enrealidad,separecemsalbucleforeachdeotroslenguajes,yaqueaqu noserepiteun nmerofijodeveces,sinoqueseprocesanloselementosdeunalistaunoauno.

85

4.4.- El bucle for

Susintaxiseslasiguiente:
forvar[inlista] do listaderdenes done

Ejecutalas rdenesdelistade rdenestantasvecescomopalabrashayaenlista.Encada vueltadelbucle,sealmacenaunelementodelistaenvar. Siseomiteinlista,serecorreelcontenidode$@,peroaunquevayamosarecorrerestavariable, espreferibleindicarlaexplcitamenteporclaridad. Porejemplosiqueremosrecorrerunalistadeplanetaspodemoshacer:


forplanetainMercurioVenusTierraMarteJupiterSaturno do echo$planeta#Imprimecadaplanetaenunalnea done

La lista del bucle for puede contener comodines. Por ejemplo, el siguiente bucle muestra informacindetalladadetodoslosficheroseneldirectorioactual:
forficheroin* do lsl"$fichero" done

Pararecorrerlosargumentosrecibidosporelscript,locorrectoesutilizar$*.Eldelimitador queusaelbucle for paralavariablelistaeselqueindiquemosen IFS,ypordefectoeste delimitadoreselespacio,aunqueenocasionesconvienecambiarlo. Elejemplosiguienterecorredosveceslosargumentosdeunprogramacon$*.Laprimeravez usamoscomodelimitadorelvalorpordefectodelavariableIFS(elespacio)ylasegundavez cambiamoselvalordelavariablesIFSparaqueeldelimitadorseanlascomillasdobles().


86

4.4.- El bucle for

#Buclesquerecorrenlosargumentos forargin$* do echo"Elemento:$arg" done IFS='' dobles() forargin$* do echo"Elemento2:$arg" done #Cambiamoseldelimitadoralascomillas

Siahoraloejecutamos,obtenemoslasiguientesalida:
$bashrecibe.s h"Elperro""Lacasa" Elemento:El Elemento:perro Elemento:La Elemento:casa Elemento2:Elperro Elemento2:Lacasa

Foraritmtico Elbucleforpermiterecorrerloselementosdeunalista.Sinembargo,existeotrotipodebucle queseasemejamsalosbuclesdeC,elforaritmtico.stetienelasiguientesintaxis:


for((inicializacin;condicin;actualizacin)) do cuerpo done

En este casolosespaciosen ((inicializacin;condicin;actualizacin))no sonnecesarios. Elejemplosiguientemuestraporpantallalos20primerosnmeros.

87

4.4.- El bucle for

for((i=1;i<=20;i++)) do echo"$i" done

4.5. Bucleswhileyuntil
Los bucles while y until son tiles cuando los combinamos con caractersticas como la aritmticaconenteros,laentradaysalidadevariables,yelprocesamientodeopcionesdelalnea decomandos.Susintaxises:
whilecondicin do listaderdenes done untilcondicin do listaderdenes done

while ejecutalas rdenesespecificadasen listade rdenes mientraselresultadodeevaluar condicin sigasiendotrue.Porsuparte, until ejecutalas rdenesespecificadasen listade rdenesmientraselresultadodeevaluarcondicinseafalse. Unejemplodelusodelwhileeselsiguiente:
#!/bin/bash i=0 while[[$ilt10]] do echoElcontadores$i leti=i+1 done

EstescriptemulalaestructurafordeC,Pascal,... Otroejemploconuntil:
#!/bin/bash i=20

88

4.5.- Bucles while y until

until[[$ilt10]] do echoContador$i leti=1 done

Tantoenelbucleforcomoenelwhile,podemosusarbreakparaindicarquequeremossalirdel bucleencualquiermomento.Elsiguientescriptimplementaeljuegodeadivinarunnmero.
#!/bin/bash MINUM=8 while[[1]];do echo"Introduzcaunnmero:" readUSER_NUM if[[$USER_NUMlt$MINUM]];then echo"Elnmerointroducidoesmenorqueelmo" echo"" elif[[$USER_NUMgt$MINUM]];then echo"Elnmerointroducidoesmayorqueelmo" echo"" elif[[$USER_NUMeq$MINUM]];then echo"Acertaste:Minmeroera$MINUM" break fi done #Comandosinferiores... echo"Elscriptsalidelbucle.Terminando..." exit

La condicin del bucle while, test 1, siempre retornar TRUE, y el bucle se ejecutar infinitamente,preguntandoencadavueltaporunnuevonmero.Sielnmerointroducidoesel mismo que el valor de $MINUM (nmero a adivinar), break har que se salga del bucle y continenejecutndoseloscomandosinferiores. Whilearitmtico Aligualqueocurraconelforyelif,tambinexisteelwhilearitmtico.Tendralaforma:
89

4.5.- Bucles while y until

while((expresionaritmtica)) do cuerpo done

4.6. Entradaysalidadetexto
Enesteapartadocomentaremosdetalladamenteloscomandos echo,printfyread,loscuales nospermitenrealizarlasoperacionesdeentrada/salidaquerequiereunscript.

4.6.1. Elcomandointernoecho
Comoyasabemos,echosimplementeescribeenlasalidaestndarlosargumentosquerecibe. LaTabla4.6muestralasopcionesquepodemospasarleaecho. Opcin e E n Descripcin Activalainterpretacindecaracteresprecedidosporelcarcterdeescape. Desactivalainterpretacindecaracteresprecedidosporcarcterdeescape.Esla opcinpordefecto. Omiteelcarcter\nalfinaldelalnea(esequivalentealasecuenciadeescape\c).
Tabla4.6:Opcionesdelcomandoecho

La opcin e activalainterpretacindelassecuenciasdeescape,quepordefecto echo las ignora,esdecir:


$bashecho"Ho la\nAdios" Hola\nAdios $bashecho e"Hola\ nAdios " Hola Adios

LaTabla4.7muestralassecuenciasdeescapequeaceptaecho(cuandoseusalaopcine).Para que stastengan xitodebendeencerrarseentrecomillassimplesodobles,yaquesinoelcarcter


90

4.6.- Entrada y salida de texto

deescape\esinterpretadoporelshellynoporecho. Secuenciadeescape \a \b \c \f \n \r \t Descripcin Produceunsonidopoom(alert) Borrarhaciaatrs(backspace) Omiteel\nalfinal(esequivalentealaopcinn. Debecolocarsealfinaldelalnea Cambiodepginadeimpresora Cambiodelnea Retornodecarro Tabulador
Tabla4.7:Secuenciasdeescapedelcomandoecho

El carcter deescape \b se puede usar paraborrartextoescrito.Por ejemplo,el siguiente ejemplomuestraunscriptquepermiteirescribiendoelporcentajerealizadodeunproceso.


for((i=0;i<10;i++)) do echon"Procesado$i" sleep1 echone"\b\b\b\b\b\b\b\b\b\b\b" done

Elbucleserepitede0a9;sinembargo,siqueremoshacerlode0a100,estosecomplicayaque estosnmerostienendistintonmerodedgitos.Parasolucionarlopodemosusar\rqueretornael cursorenelterminalsinintroduciruncambiodelnea(comohace \n).El script quedaradela siguienteforma:


for((i=0;i<10;i++)) do echon"Procesado$i" sleep1 echone"\r" done

91

4.6.- Entrada y salida de texto

4.6.2. Elcomandointernoprintf
Aunqueelcomandoechoessuficienteenlamayoradeloscasos,enocasiones,especialmentea lahoradeformateartextoenpantalla,esnecesariomsflexibilidad.Paraestoscasosseutilizael comandoprintf. Estecomando,enprincipio,puedeescribircadenasigualqueecho:
$bashprintf "Hola mundo" Holamundo

Sinembargo,adiferenciadeechonoimprimeelcambiodelneadelfinalpordefecto,sinoque debemos indicarlo explcitamente (\n). Adems, printf por defecto interpreta las secuencias de escape.
$bashprintf "Hola mundo\ n" Holamundo

Elformatodeestecomandoesmuyparecidoaldelafuncinprintf()deC:
printfcadenaformato[argumentos]

Dentro de la cadena de formato que recibe como primer argumento pueden aparecer especificadoresdeformato,loscualesempiezanpor%ysedescribenenlaTabla4.8. Especificador %c %d %i %e %E %f %o %s %b Descripcin Imprimeelprimercarcterdeunavariablecadena Imprimeunnmerodecimal Igualque%d Formatoexponencialb.precisione[+]e Formatoexponencialb.precisionE[+]e Nmeroencomaflotanteb.precision Octalsinsigno Cadena(string) Interpretalassecuenciasdeescapedelargumentocadena

92

4.6.- Entrada y salida de texto

Especificador %q %u %x %X %%

Descripcin Escribeelargumentocadenadeformaquepuedaserusado comoentradaaotrocomando Nmerosinsigno(unsigned) Hexadecimalconletrasenminscula Hexadecimalconletrasenmayscula %literal


Tabla4.8:Especificadoresdeformatodeprintf

Unejemplodeusodelosespecificadoresdeformatoeselsiguiente:
$bashn=30 $bashnomb re=F er nando $bashprintf "El client e%des %s\n" $n$no mb re Elcliente30esFernando

Elespecificadordeformatotieneelsiguienteformatogeneral:
%[Flag][Ancho][.Precisin]Especificador

Elsignificadodeestoscamposdependedesielespecificadordeformatoesparaunacadenade caracteresoparaunnmero. EnelcasodequeseaunacadenaAnchoserefierealanchomnimoqueocupalacadena.Por ejemplo:


$bashprintf "|% 10s| \n" Hola |Hola|

SiqueremosindicarunmximoparalacadenadebemosdeusarelcampoPrecisin:
$bashprintf "|% 10.10s|\n" " Fer nand oLope z" |FernandoL|

ElFlagseusaparaindicarquequeremosalienaralaizquierda:
$bashprintf "|% 10s|\n" Hola |Hola|
93

4.6.- Entrada y salida de texto

Dosvariantesde%sson%by%q.Elespecificadordeformato%bhacequeseinterpretenlas secuenciasdeescapedelosargumentos.Esdecir:
$bashprintf "%s\n" "Hola \n Adio s" Hola\nAdios $bashprintf "%b\n" "Hola \n Adio s" Hola Adios

El especificadordeformato %q escribeelargumentodeformaquepuedaser usado como entradadeotrocomando.Porejemplo:


$bashprintf "%s\n" "Hola at odos" Holaatodos $bashprintf "%q\n" "Hola at odos" Hola\a\todos

Bashnopuedemanejarexpresionesconnmerosenpuntoflotante,sloenteros,peros puede recibirlasalidadeuncomandoquedevuelvaunacadenaconunnmeroenpuntoflotante.Eneste casopodemosformatearestenmerousando%e,%E,%f.EntoncesAnchoeselnmerototalde dgitosautilizaryPrecisinindicaelnmerodedgitosaladerechadelpunto.Porejemplo:


$bashn= 123.4 567 $bashprintf "|%9.3 f|\n" $n |123.457| $bashprintf "|%1 1.3E|\ n"$n |1.235E+02|

RespectoalosFlagquepuedetenerunnmero,estosseresumenenlaTabla4.9. Flag + espacio 0 # Descripcin Precederpor+alosnmerospositivos Precederporunespacioalasnmerospositivos Rellenarcon0'salaizquierda Precederpor0alosnmerosenoctal%oypor0xalos

94

4.6.- Entrada y salida de texto

Flag

Descripcin nmerosenhexadecimal%xy%X

Tabla4.9:Flagsdelosespecificadoresdeformatoparanmeros

Porejemplo:
$bashprintf "|%+1 0d|\n" 56 |+56| $bashprintf "|%0 10d|\n" 56 |0000000056| $bashprintf "|%x|\ n"56 |38| $bashprintf "|%#x| \n" 56 |0x38|

4.6.3. Elcomandointernoread
Elcomandoreadsirveparaleerinformacindeltecladoyguardarlaenvariables.Susintaxises:
readvar1var2...

Esta sentencia lee una lnea de la entrada estndar y la parte en palabras separadas por el smboloqueindiquelavariableIFS(pordefectoespaciootabulador).Laspalabrasseasignana var1, var2, etc.Sihaymspalabrasquevariables,las ltimaspalabrasse asignanala ltima variable.Porejemplo:
$bashreadvar1 var2 var3 Estoesunaprueba $bashecho$var1 Esto $bashecho$var2 es $bashecho$var3 unaprueba

Siomitimoslasvariables,lalneaenteraseasignaalavariableREPLY
95

4.6.- Entrada y salida de texto

Lasprincipalesopcionesdelcomandoread,seresumenenlaTabla4.10. Opcin a d nmax p Descripcin Permiteleerlaspalabrascomoelementosdeunarray Permiteindicarundelimitadordefindelnea Permiteleercomomximomaxcaracteres Permiteindicaruntextodeprompt


Tabla4.10:Opcionesdelcomandoread

Laopcindnospermiteindicarundelimitadordefindelneadeformaquelalneaseleehasta encontrarestedelimitador. Laopcin n nospermiteespecificarunnmeromximodecaracteresaleer.Siseintentan escribirmscaracteresquelosindicadosenestaopcin,simplementeseacabalaoperacinde lectura. Laopcinpnospermiteaportaruntextodepromptalcomando,queseimprimeantesdepedir eldato:


$bashread p"Cual estu nombre:"nombre Cualestunombre:Fernando

96

4.7.- Ejercicios

4.7. Ejercicios
Todoslosscriptsplanteadosdeberntener

Uncomentariosalprincipioqueindiqueloquehace. Comentariosalolargodelscriptparadocumentarloquesevahaciendo En el caso de recibir parmetros, comprobacin de que el numero de parmetros recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.

1.CreaunscriptdenombrepositivoNegativo.shquepidaunnumeroportecladoydetermine siespositivo,negativoocero. 2.Creaunscriptquesellamecopiar.shyqueaceptedosargumentos.Elprimerargumento representaelnombredeunarchivoexistentecuyocontenidoqueremoscopiaryelsegundo argumento es el nombre del fichero donde se copiar el contenido. El scritp copiar el contenido del primer fichero en el segundo fichero, haciendo todas la comprobaciones pertinentes a) Elnmerodeargumentosalllamaralprogramadebeserelcorrecto,sinomandarun mensajeindicandolasintaxiscorrecta. b) Elficheroodirectoriodadocomoprimerargumentodebeexistir,sinoexistedebe mandarseunmensajedeerroralusuarioyfinalizar. c) El segundo argumento no debe corresponder con ningn archivo o directorio existentes,siloes,sedebemandarunmensajealusuarioyfinalizar. 3.Desarrollaunscriptdenombrecal.shqueimplementeunacalculadoraconlasoperaciones bsicas(suma,resta,multiplicacin,divisin,potencia).Nota:Sepuedehacerenmenosde cuatrolneasdecdigo. 4.Escribeunscriptllamado sumaN.sh quepidaunnmero(N)eimprimaporpantallala

97

4.7.- Ejercicios

sumadelosNprimerosnmeros. 5.DesarrollaunscriptdenombreficheroDirectorio.shquerecibaunnmeroindeterminado deparmetros.Elscriptdeber clasificarlosargumentossegnseanficherosodirectoriosy guardarlosendosarchivos(fich.txtydir.txt). 6.Creaunscriptdenombre muestraLinea.sh querecibadosargumentosenlalnea de rdenes;elprimeroserunficheroyelsegundounnmeron .Elscriptmostrarporpantalla lalneanmeron delficheropasadocomoargumento.Silalneanoexistiese,elscriptdeber mostrarelmensajecorrespondiente. 7.Hazunscriptllamado ocupaTxt.sh quedadoundirectoriocomoargumentonosdigael tamaototaldelosficheroconextensin.txtquehayaenl.

98

5.- PROGRAMACIN BASH II

5. PROGRAMACINBASHII
5.1. Lasentenciacase
MientrasqueestasentenciaenlenguajescomoCoJavaseusaparacomprobarelvalordeuna variable simple, como un entero o un carcter, en Bash esta sentencia permite realizar una comparacindepatronesconlacadenaaexaminar. Susintaxiseslasiguiente:
casecadenain patron1) Listaderdenes1;; patron2) Listaderdenes2;; esac

Lasentenciacasecomparaelvalorpresenteencadenaconlosvaloresdetodoslospatrones, unoporuno,hastaqueobienseencuentraunpatrnquecoincidaoyanoquedanmspatronespara comparar con cadena. Si se halla un coincidencia, se ejecutan las rdenes presentes en la correspondientelistaordenesylasentenciacasecedeelcontrol. Cadapatrnpuedeestarformadoporvariospatronesseparadosporelcarcter|.
#!/bin/bash readn case$nin *1*|*5*)echoUnooCinco;; *2*)echoDos;; *3*)echoTres;; *4*)echoCuatro;; esac

99

5.1.- La sentencia case

En una aplicacin tpica de la sentencia, se incluye un patrn comodn que coincide con cualquierposiblevalordecadena.Seconocecomocasoporomisinypermitelaejecucindeun conjunto de rdenes adecuadas para manejar una situacin excepcional cuando cadena no coincideconningnpatrn.
#!/bin/bash readn case$nin *1*|*5*)echoUnooCinco;; *2*)echoDos;; *3*)echoTres;; *4*)echoCuatro;; *)echoOpcinincorrecta;; esac

5.2. Lasentenciaselect
Lasentenciaselectnospermitegenerarfcilmenteunmensimple.Susintaxiseslasiguiente:
selectvariable[inlista] do Sentenciasqueusan$variable done

Vemosquetienelamismasintaxisqueelbuclefor,exceptoporlapalabrareservadaselecten vezdefor.Dehecho,siomitimosinlista,tambinseusapordefecto$@. Lasentenciageneraunmen conloselementosdelista,asignaunnmeroacadaelemento,y pidealusuarioqueintroduzcaunnmero.Elvalorelegidosealmacenaenvariable,yelnmero elegidoenlavariable REPLY.Unavezelegidaunaopcinporpartedelusuario,seejecutael cuerpodelasentenciayelprocesoserepiteenunbucleinfinito. Aunqueelbuclede select esinfinito(locualnospermitevolverapedirunaopcincuantas veceshagafalta),sepuedeabandonarusandolasentenciabreak.Lasentenciabreak,aligualque enCyJava,seusaparaabandonarunbucleysepuedeusarenelcaso,tantode select,comodelos
100

5.2.- La sentencia select

buclesfor,whileyuntil.Pero,adiferenciadeCyJava,nosirveparaabandonarlasentenciacase, sinoquestaseabandonausandodospuntosycomas;;. El prompt queusalafuncin(mensajequesemuestraparapedirlaopcindelmen)esel definidoenlavariabledeentornoPS3,yeshabitualcambiarestepromptantesdeejecutarselect paraquemuestrealusuariounmensajemsdescriptivo.PordefectoelvalordePS3es#?,locual noesunmensajequesuelagustarespecialmentealosusuarios. Elsiguientescriptpidedosnmerosyacontinuacinmuestraunmenparaelegirquesequiere hacerconellos(sumar,restar,multiplicarodividir).


#!/bin/bash #Almacenamoslasopcionesdelmen OPCIONES="SumarRestarMultiplicarDividirSalir" #Cambiamoselpromptparaqueseamsdescriptivo PS3="Elijaunaopcin:" #Leemosdosnmeros readp"Numero1:"n1 readp"Numero2:"n2 selectoptin$OPCIONES do if[[$opt="Sumar"]] then echo$((n1+n2)) elif[[$opt="Restar"]] then echo$((n1n2)) elif[[$opt="Multiplicar"]] then echo$((n1*n2)) elif[[$opt="Dividir"]] then echo$((n1/n2)) elif[[$opt="Salir"]]

101

5.2.- La sentencia select

then echoFin break else echoopcinerrnea fi done

LavariableOPCIONESseutilizaparaalmacenarlasopcionesdelmen(laformadesepararlas opcionesdependerdelavariableIFS).Unejemplodeejecucineselsiguiente:
mluque@tweety:/tmp$./pru.sh Numero1:8 Numero2:2 1)Sumar 2)Restar 3)Multiplicar 4)Dividir 5)Salir Elijaunaopcion:4 4 Elijaunaopcion:5 Fin

5.3. Lasentenciashift
Lasentenciashift,pordefecto,desplazalosargumentosdelalneaderdenesunaposicina laizquierda,haciendoque$2paseaser$1,$3paseaser$2,yas sucesivamente.Elnmerode posicionesquesedesplazanpuedesermayorqueunoyseespecificacomoargumentodelaorden. Suformatoeselsiguiente:
shift[n]

donde n eselnmerodedesplazamientosalaizquierdaquequeremoshacerconlosargumentos pasadosalscript.Siseomiten,pordefectoseconsideraqueelnmerodedesplazamientosvale1.


102

5.3.- La sentencia shift

Luego,siejecutamoselcomando shift1,$1pasar acontenerelvalorde$2,$2elde$3yas sucesivamente.Elvalorde$1sepierde. Unejemploclsicodelusodeestecomandosonlosscriptsconopciones.Lasopciones,aligual quelosargumentosserecibenenlosparmetrosposicionales,esdecir,siejecutamos hacero esto.txtaquello.txt,en$1recibimoso,en$2esto.txtyen$3aquello.txt.En principio, paratratarlasopcionesnonos harafaltasabernadams.Elproblemaest en que normalmentelasopcionessonopcionales,esdecir,puedendarseono,conloqueenfuncinde quelaopcinsedeono,elscriptutilizarunosparmetrosposicionalesuotros
if[[$1=o]] then Ejecutalasoperacionescon$2y$3 else Ejecutalasoperacionescon$1y$2 fi

Utilizandoelcomandoshiftpodemosresolverestoyhacerelscriptanteriormssencillo:
if[[$1=o]];then Procesao shift fi Ejecutalaoperacincon$1y$2

5.4. Listas(Arrays)
Bashadmitelaslistasunidimensionales.Unalista(array)esunacoleccindeelementosdotada denombre;loselementossontodosdelmismotipoyestnalmacenadosenposicionesconsecutivas dememoria.Loselementosdelalistaestnnumerados,yelprimerelementodelistatiene el nmero0.Noexistelmiteparaeltamaodeunalista,ynoserequierequeloselementosdelalista seasignendeformacontigua. Creacindelistas Paradeclararunlistapodemosusarelcomandodeclareadelasiguienteforma:

103

5.4.- Listas (Arrays)

bash$ declareaA

SiahorapreguntamosporlavariableA,nosdicequeesunarrayvaco:
bash$ declarepA declareaA='()'

Realmente no hace falta declarar una lista con declare a, podemos crearla asignndole directamentevaloresdelasiguientemanera:
bash$ B=(Jamo n4 Melon) bash$ declarepB declareaB='([0]="Jamon"[1]="4"[2]="Melon")'

Loselementosenlaslistasempiezanacontaren0,aunquepodemoscambiarlosndicesdelos elementosindicndolosexplcitamente:
bash$ C=([5]= Melon [0]=Ja mon [3]=400) bash$ declarepC declareaC='([0]="Jamon"[3]="400"[5]="Melon")'

Obsrvesequenohacefaltasuministrarloselementosenorden,nisuministrarlostodos,los ndicesdondenocolocamosunvalor,simplementevaldrn"cadenanula". Sisloindicamosalgunos ndices,losdemslosasignacontinuandolascuentadesdeelltimo ndiceasignado:


bash$ C=([5]= Cosa Casa Per ro) bash$ declarepC declareaC='([5]="Cosa"[6]="Casa"[7]="Perro")'

Unaforma tilderellenarunalistaesapartirdelaslneasdevueltasporunasustitucinde comandosusandolaformadeinicializacinB=(...).Dentrodelosparntesisponemoslasustitucin decomandos.Porejemplo,paraobtenerunalistaconlosnombresdeficherosdeundirectorio podemosusar:


bash$ B=(`ls 1`) bash$ declarepB declare a B='([0]="Desktop" [1]="Documents" [2]="Library"

104

5.4.- Listas (Arrays)

[3]="Movies"[4]="Music"[5]=Pictures")

Accesoaloselementosdeunalista Paraaccederaloselementos,usamoseloperadorcorchete[]paraindicarelndicedelelemento aacceder,siendoobligatorioencerrarentrellaves{}lavariable:


bash$ echo${B [2]} Library

Sinoindicamosndicedeelemento,pordefectonoscogeelelementodendice0:
bash$ echo$B Desktop

Estaeslaraznporlaquehayqueencerrarloselementosentrellaves,porquesinosiemprenos cogeelprimerelemento:
bash$ echo$B[ 3] Movies[3]

Tambin podemos inicializar una lista introduciendo valores directamente con el operador corchete:
bash$ D[2]=Ca sa bash$ D[0]=A vion bash$ declarepD declareaD='([0]="Avion"[2]="Casa")'

Podemosusarlosndicesespeciales*y@,loscualesretornantodosloselementosdelalistade la misma forma que lo hacen los parmetros posicionales. Cuando no estn encerrados entre comillasdobles()ambosdevuelvenunacadenaconloselementosseparadosporespacio,pero cuandoseencierranentrecomillasdobles()@devuelveunacadenaconloselementosseparados por espacio, y * devuelve una cadena con los elementos separados por el valor de IFS. En cualquieradeloscasos,lalistasepierde,yloquerecibimosesunacadenadecaracteres
bash$ IFS=, bash$ echo${C [*]}

105

5.4.- Listas (Arrays)

CosaCasaPerro bash$ echo${C [@]} CosaCasaPerro bash$ echo"${ C[@]}" CosaCasaPerro bash$ echo"${ C[*]}" Cosa,Casa,Perro

Aligualqueenlosparmetrosposicionales,podemositerarsobreloselementosdeunalista usandounbuclefor:
forein${C[*]} do echo$e done

Dondealser${C[*]}unacadenadecaractereshubiramostambinpodidousar${C[@]}o "${C[@]}"perosihacemos"${C[*]}"loqueobtenemosesunacadenaconloselementosde staseparadosporelvalordeIFS(comaenesteejemplo),ynoporespacio.Sinembargoelbucle hubierafuncionadosiloselementosestnseparadosporelvalordeIFS,ydehechoenocasiones (p.e.cuandoloselementostienenespacios)convieneutilizarestaltimasolucin. Loselementosdeunalistaalosquenoseasignavalortienenunacadenanula,conloqueel bucleanteriorsloimprimiraloselementosqueexistanenlalistaC. Podemosconsultarlalongituddeunalistausandolaforma ${#lista[@]},donde lista esel nombredelalista.Porejemplo,enelejercicioanterior:
bash$ echo${# C[@]} 3

Elejemploanteriornosdicequehaytreselementosaunquelosndiceslleguenhastaelndice7, yaqueexistenposicionessinasignarenlalista.Elcomando # slonosdevuelveelnmerode posicionesocupadas. Tambindebemostenerencuentaquedentrodeloscorchetesvauna @,ynoun ndice.Si

106

5.4.- Listas (Arrays)

ponemosun ndice,nosdevuelvelalongitud(encaracteres)deeseelemento.Porejemplo,sienel ndice5tenamoslacadena"Casa":


bash$ echo${# C[5]} 4

Siqueremossaberqueelementossonnonulosenunalista,podemosusarlaforma ${!lista[@]}, dondelistaeselnombredelalistaaconsultar.Devuelvelosndicesdeloselementos(Estoest disponibleapartirdelaversin3delbash):


bash$ echo${! C[@]} 567

Siasignamosunalistaaotraexistentesepierdenlosvaloresexistentes,yseasignanlosnuevos. Porejemplo,siaCdelejemploanteriorleasignamos:
bash$ C=(Hola "Que t al" A dios) bash$ declarepC declareaC='([0]="Hola"[1]="Quetal"[2]="Adios")'

sepierdenloselementos5,6y7quetenamosasignados. Borrarelementosdeunalista Podemosborrarunaentradadeunalistausandounsetsobreesendice:


bash$ uns etC[2] bash$ declarepC declareaC='([0]="Hola"[1]="Quetal")'

Obienborrartodolalistausandounsetsobreelnombredelarray:
bash$ uns etC bash$ declarepC bash:declare:C:notfound

Obsrvesequeestecomportamientoesdistintoaldeasignarunvaloralnombredelalista,que loquehaceesasignrseloalelementodendice0.

107

5.4.- Listas (Arrays)

Opcinadelcomandoread Alasopcionesdelcomandoreadvistasenelguin3podemosaadirlaopcina.stapermite leerdatosportecladoyalmacenarloscomoelementosdeunarray.


bash$ r ead af rase Holaquetal bash$ declarepfr ase declareafrase='([0]="Hola"[1]="que"[2]="tal")'

5.5. Funciones
Comoencasitodolenguajedeprogramacin,podemosutilizarfuncionesparaagrupartrozosde cdigosdeunamaneramslgica,opracticareldivinoartedelarecursividad. LasfuncionesdeBashsonunaextensindelasfuncionesqueexistendesdeelBourneShell. stas,adiferenciadelosscripts,seejecutandentrodelamemoriadelpropioprocesodeBash, conloquesonmseficientesqueejecutarscriptsaparte,perotienenelinconvenientedequetienen queestarsiemprecargadasenlamemoriadelprocesoparapoderusarse.Actualmente,debidoala grancantidaddememoriaquetienenlosordenadores,eltenerfuncionescargadasenlamemoriade tieneuncosteinsignificante,conloquenoimportatenercargadasgrancantidadde stasenel entorno. Definicindefunciones Antesdeutilizarunafuncin,esprecisodefinirla.Laformadedefinirunafuncinenbashes:
nombre_funcin() { comandosbash }

Paraborrarunafuncinpodemosusarelcomandounsetconlasiguientesintaxis
unsetfnombre_funcin.

108

5.5.- Funciones

Cuandodefinimosunafuncin,sealmacenacomounavariabledeentorno.Paraejecutarla funcin,simplementeescribimossunombreseguidodeargumentos,comocuandoejecutamosun comando.Losargumentosactancomoparmetrosdelafuncin. Podemosverquefuncionestenemosdefinidasenunasesinusandoelcomandodeclaref.El shellimprimelasfunciones,ysudefinicin,ordenadasalfabticamente.Sipreferimosobtenerslo elnombredelasfunciones,podemosusarelcomandodeclareF. Siunafuncintieneelmismonombrequeunscriptoejecutable,lafuncintienepreferencia: Estareglasehausadomuchasvecespara,engaandoalosusuarios,violarlaintegridaddesu sistema. Unejemplosencillodelusodefuncioneeselsiguientescript.Enlsecreandosfunciones,una parasaliryotraparamostrarelmensajehola.
#!/bin/bash #Definimosdosfunciones salir(){ exit } hola(){ echo<Hola! } #Comienzaelscript hola #Llamamosalafuncionhola salir#Llamamosalafuncionsalir echoFindelscript

Lasfuncionesnonecesitanserdeclaradasenunordenespecfico.Elscriptalejecutarsellama primeroalafuncinhola,mostrandoelmensajedeHola!,acontinuacinllamaalafuncin salir yterminaelscript.Elprogramanuncallegaraalaltimalnea. Elsiguientescriptesprcticamenteidnticoalanterior.Ladiferenciaest enquelafuncin imprime muestra un mensaje que le pasemos como argumento. Los argumentos, dentro de las funciones,sontratadosdelamismamaneraquelosargumentossuministradosalscript.

109

5.5.- Funciones

#!/bin/bash #Definimosdosfunciones salir(){ exit } imprime(){ echo$1 } #Comienzaelscript imprimeHola#LlamamosalafuncineconelargumentoHola imprimeAdios#LlamamosalafuncineconelargumentoAdios salir#Llamamosalafuncinsalir echoFindelscript

5.6. Operadoresdecadena
Los operadores de cadena nos permiten manipular cadenas sin necesidad de escribir complicadas rutinas de procesamiento de texto. En particular, los operadores de cadena nos permitenrealizarlassiguientesoperaciones:

Asegurarnosdequeunavariableexiste(queestdefinidayquenoesnula). Asignarvalorespordefectoalasvariables. Tratarerroresqueseproducencuandounavariablenotieneunvalorasignado. Cogeroeliminarpartesdelavariablequecumplanunpatrn.

Empezaremosviendolosoperadoresdesustitucin,paraluegoverlosdebsquedadecadenas.

5.6.1. Operadoresdesustitucin
LaTabla5.1muestralosoperadoresdesustitucin. Operador ${var:valor} ${var:+valor} Descripcin Sivarexisteynoesnularetornasucontenido, sino,retornavalor. Sivarexisteynoesnularetornavalor,sino,
110

5.6.- Operadores de cadena

Operador

Descripcin retornaunacadenanula.

${var:=valor}

Sivarexisteynoesnularetornasucontenido, sino,asignavaloravaryretornasu contenido. Sivarexisteynoesnularetornasucontenido, sino,imprimevar:mensajeyabortaelscript queseestejecutando(sloenshellsno interactivos).Siomitimosmensajeimprimeel mensajepordefectoparameternullor notset. Retornaunasubcadenadevarqueempiezaen offsetytienelongitudcaracteres.El primercarcterdevarempiezaenlaposicin0. Siseomitelongitudlasubcadenaempiezaen offsetycontinuahastaelfinaldevar.
Tabla5.1:Operadoresdesustitucin

${var:?mensaje}

${var:offset:longitud}

Losdospuntos(:)enesteoperadorsonopcionales.Siseomitenenvezdecomprobarsiexistey noesnulo,slocompruebaqueexista(aunqueseanulo). ${var:valor} seutilizapararetornarunvalorpordefectocuandoelcontenidodelavariable var est indefinido.Porejemplo, ${nombre:1} devuelve1sielcontenidode nombre est indefinidooesnulo. ${var:+valor}porcontraseutilizaparacomprobarqueunavariabletengaasignadounvalorno nulo.Porejemplo,${nombre:+1}retorna1(quesepuedeinterpretarcomoverdadero)sinombre tieneunvalorasignado. Losdosoperadoresdecadenaanterioresnomodificanelvalordelavariablevar,simplemente devuelvensucontenido,siqueremosmodificar var podemosusar ${var:=valor} queasignaun valoralavariablesistaestindefinida.Porejemplo,${nombre:=Paco}asignaPacoala variablenombresistanotienevalor. Tambin podemos querer detectar errores producidos porque una variable no tenga valor
111

5.6.- Operadores de cadena

asignado. En estecaso,usamos ${var:?mensaje} quedetectasi var notienevalorasignado y produceunmensajedeerror.Porejemplo,${nombre:?'Eresunapersonaannima'} imprimenombre:Eresunapersonaannima Porltimo,podemoscogerpartesdeunacadenausando ${var:offset:longitud}.Porejemplo,si nombre valeFernandoLpez, ${nombre:0:8} devuelveFernandoy ${nombre:9} devuelve Lpez. Ejemplo Imaginemosquetenemosunficheroconelsaldoyelnombredeunconjuntodeclientesconla siguienteforma:
bash$ catcli en tes 45340JoseCarlosMartinez 24520MariCarmenGutierrez 450LuisGarciaSantos 44MarcosVallidoGrandes 500CarlosdelaFuenteLopez

Crearunscript,denombremejoresClientes.sh,queimprimalosNclientesquemssaldotengan. Elscriptrecibir comoprimerargumentoelficherodeclientesy,opcionalmentecomosegundo argumento,elnmero N declientesaimprimir.Sinoseproporciona N,pordefectoser 5.La formadelcomandopodraser:


mejoresclientes.shfichero[cuantos]

Paraellopodemosusarelcomandosortelcualordenalneas,ydespuselcomando headque sacalasprimeraslneasdelaforma:


sortnr$1|head${2:5}

Laopcinndiceasortqueordenenumricamente(noalfabticamente)ylaopcinrdicea sortquesaqueloselementosordenadosdemayoramenor.headrecibecomoargumentoelnmero delneasamostrar,porejemplohead2significacogerlasprimeras2lneas.Si$2esnulose tomapordefecto5.


112

5.6.- Operadores de cadena

Estescript,aunquefunciona,esunpococrptico;vamosahacerunoscambiosconvistasa mejorarsulegibilidad.Porunlado,vamosaponercomentarios(precedidospor#)alprincipiodel fichero,yvamosausarvariablestemporalesparamejorarlalegibilidaddelprograma.Elresultado eselsiguiente:


#Scriptquesacalosmejoresclientes #Tienelaforma: #mejoresclientes.sh<fichero>[<cuantos>] fichero=$1 cuantos=$2 defecto=5 sortnr$fichero|head${cuantos:$defecto}

Estoscambiosquehemoshechomejoranlalegibilidaddelscript,peronosutoleranciaaerrores, yaquesiporejemplonopasamoselargumento $1,conelnombredelfichero,seejecutarelscript as:


sortnr|head$5

ysortsequedar esperandoaqueentrendatosporsuentradaestndarhastaqueelusuariopulse Ctrl+DoCtrl+C.Estosedebeaque,aunquecontrolamosqueelsegundoargumentonoseanulo,no controlamoselprimero. Enestecasopodemosusareloperadordecadena:?paradarunmensajedeerrorcambiando:


fichero=$1

Por:
fichero=${1:?'nosuministrado'}

Ahora,sinosuministramoselargumentoseproduceelmensaje:
./mejoresclientes:1:nosuministrado

Podemosmejorarlalegibilidaddeestemensajesihacemos:
fichero_clientes=$1 fichero_clientes=${fichero_clientes:?'nosuministrado'}

Ahorasiolvidamosproporcionarelargumentovemoselmensaje:
./mejoresclientes.sh:fichero_clientes:nosuministrado
113

5.6.- Operadores de cadena

Paraverunejemplodeloperadordecadena:=podramoscambiar:
cuantos=$2

Por:
cuantos=${2:=5}

Peroestonofuncionaporqueestamosintentandoasignarunvaloraunparmetrosposicional (quesondeslolectura).Loquespodemoshaceres:
cuantos=$2 sortnr$fichero_clientes|head${cuantos:=$defecto}

Elscriptmstoleranteafallosseraelsiguiente:
#Scriptquesacalosmejoresclientes #Tienelaforma #mejoresclientes<fichero>[<cuantos>] fichero_clientes=$1 fichero_clientes=${fichero_clientes:?'nosuministrado'} cuantos=$2 defecto=5 sortnr$fichero_clientes|head${cuantos:=$defecto}

5.6.2. Operadoresdebsquedadepatrones
En la Tabla 5.2, se muestran los operadores de bsqueda de patrones existentes y una descripcindesucomportamiento. Operador ${var#patron} Descripcin Sipatroncoincideconeliniciodelvalordevar, borralapartemspequeaquecoincidey retornaelresto. Sipatroncoincideconeliniciodelvalorde var,borralapartemsgrandequecoincidey retornaelresto. Sipatroncoincideconelfinaldelvalordevar, borralapartemspequeaquecoincidey
114

${var##patron} ${var%patron}

5.6.- Operadores de cadena

Operador retornaelresto. ${var%%patron}

Descripcin

Sipatroncoincideconelfinaldelvalordevar, borralapartemsgrandequecoincideyretorna elresto. Lapartemsgrandedepatronquecoincideen varesreemplazadaporcadena.Laprimera formasloreemplazalaprimeraocurrencia,yla segundaformareemplazatodaslasocurrencias. Sipatronempiezapor#debeproducirsela coincidenciaalprincipiodevar,ysiempieza por%debeproducirselacoincidenciaalfinal devar.Sicadenaesnula,seborranlas ocurrencias.Enningncasovarsemodifica, sloseretornasuvalorconmodificaciones.

${var/patron/cadena} ${var//patron/cadena}

Tabla5.2:Operadoresdebsquedadepatrones

Unusofrecuentedelosoperadoresdebsquedadepatroneseseliminarpartesdelarutadeun fichero,comopuedasereldirectoriooelnombredelfichero.Algunosejemplosdecmofuncionan estosoperadoresson: Supongamosquetenemoslavariablerutacuyovalores:


ruta=/usr/local/share/qemu/bios.core.bin

Siejecutamoslossiguientesoperadoresdebsquedadepatrones,entonceslosresultadosseran lossiguientes: Operador Resultado


${ruta##/*/}bios.core.bin ${ruta#/*/}local/share/qemu/bios.core.bin ${ruta%.*}/usr/local/share/qemu/bios.core ${ruta%%.*}/usr/local/share/qemu/bios

En la bsqueda de patrones se pueden usar tanto los comodines tradicionales como los extendidos.

115

5.6.- Operadores de cadena

Ejemplo EnelmundodeGNUexistenunasherramientasllamadasNetPBM1quepermitenconvertir entremuchosformatosgrficos.Laherramientasueleconvertirdeformatosconocidos(gif,bmp, jpg) a un formato interno, o bien del formato interno a los formatos conocidos. Los formatos internosqueutilizason .ppm (PortablePixelMap)paraimgenesencolor,.pgm (PortableGray Map)paraimgenesenescaladegrises,y.pbm (PortableBitMap)paraimgenesformadaspor bitsdeblancoynegro.Avecesestosformatosaparecenbajolaextensingeneral.pnm,queabarca atodosellos.Nuestroobjetivoeshacerunscriptllamadobmptojpgquerecibaunoodosnombres defichero,elprimerodetipo.bmp yelsegundodetipo .jpg.Sinosesuministraelsegundo argumento,elnombredelficheroserelmismoqueeldelprimerargumentoperoconlaextensin .jpg.PararealizarlasconversionesusaremosloscomandosdeNetPBMbmptoppmyppmtojpeg. Loscomandosrecibencomoargumentoelficheroorigenyemitenporlasalidaestndarel ficheroenelformatodestino. Paraobtenerelprimerargumento,odarerrorsinosenossuministra,podemosusareloperador :?as:
fichero_entrada=${1:?'faltaargumento'}

Paraobtenerlosnombresdeficherointermedioydesalidausamos:
fichero_intermedio=${fichero_entrada%.bmp}.ppm fichero_salida=${2:${fichero_intermedio%.ppm}.jpg}

Obsrvesequeparaelnombredesalidausamoseloperador:paraquesinosehasuministrado elsegundoargumentousemoselnombredelficherodeentrada,peroconlaextensincambiada. Luegoelscriptquerealizaestaoperacineselsiguiente:


#Convierteun.bmpenun.jpg fichero_entrada=${1:?'faltaargumento'} fichero_intermedio=${fichero_entrada%.bmp}.ppm fichero_salida=${2:${fichero_intermedio%.ppm}.jpg} bmptoppm$fichero_entrada>$fichero_intermedio ppmtojpeg$fichero_intermedio>$fichero_salida

116

5.6.- Operadores de cadena

5.6.3. Eloperadorlongitud
Eloperadorlongitudnospermiteobtenerlalongitud(encaracteres)delvalordeunavariable. Tienelaforma${#var}dondevareslavariableacuyocontenidoqueremosmedirlalongitud.Por ejemplo,silavariablenombrevaleFernando,${#nombre}devolver8.

5.7. Sustitucindecomandos
Lasustitucindecomandospermiteusarlasalidadeuncomandocomosifueraelvalordeuna variable. Lasintaxisdelasustitucindecomandoses:
$(comando)

Tambinsepuedehacerutilizandolascomillasfrancesas,aunqueestanuevaformapermite anidarsustitucionesdecomandos. Unejemplodeusodelasustitucindecomandoses $(pwd),quenosdevuelveeldirectorio actual,yesequivalentealeerlavariabledeentorno$PWD. Otro ejemplo es el uso de $(ls $HOME), esta sustitucin de comandos nos devuelve una variablecontodoslosficherosdeldirectoriohome:
bash$ midir=$ (ls $HOME) bash$ echo$mi dir DesktopDocumentsLibraryMoviesMusicPicturesPublic Sitesautorjdevhometmpxcode

Tambin podemos cargar el contenido de un fichero en una variable de entorno usando $(<fichero),dondeficheroeselficheroacargar.Porejemplo,paracargarelcontenidodelfichero copyright.txtenlavariablecopyrighthacemos:
bash$ co pyr ight=$(< co pyr ight.tx t)

Si tenemos un conjunto de ficheros de la forma tema*.txt, podemos usar la sustitucin de comandosparaabrirtodoslosquetratendeBashas:

117

5.7.- Sustitucin de comandos

bash$ nedit $(g rep l'bas h't ema*.txt )

Laopcinlhacequegrepdevuelvaslolosnombresdeficherodondehaencontradolapalabra 'bash'.

5.8. LosficherosdeconfiguracindeBash
Cadavezqueentramosanuestracuentaseejecutaelcontenidodelfichero/etc/profile,yluego semiraaversieneldirectorio home existeelfichero.bash_profile,deseras seejecutasu contenidoparapersonalizaraspectosdenuestracuenta. Cualquierconfiguracinqueaadamosa.bash_profilenoserefectivahastaquesalgamosdela cuentayvolvamosaconectarnos,sihacemoscambiosenesteficheroyqueremosverlossinsalirde lacuentapodemosusarelcomandosource,elcualejecutaelcontenidodelficheroqueledigamos:
bash$ sour ce.ba sh_pr ofile

Alternativamentealcomando source est elcomandopunto(.),conloqueelcontenidode .bash_profiletambinsepuedeejecutaras:


bash$ ..bash _p rof ile

Bashpermiteusardosnombresalternativospara .bash_profile porrazonesdecompatibilidad histrica:.bash_login,nombrederivadodelfichero.logindelCShell,y.profilenombreusadopor elBourneShellyelKornShell.Encualquiercaso,slounodeestosficherosser ejecutado.Si .bash_profileexistelosdemssernignorados,sinoBashcompruebasiexiste.bash_loginy,slo si stetampocoexiste,compruebasiexiste .profile.Laraznporlaqueseeligi esteordende bsqueda es que podemos almacenar en .profile opciones propias del Bourne Shell, y aadir opcionesexclusivasdeBashenelfichero.bash_profileseguidodelcomandosource.profilepara queBashtambincarguelasopcionesdelfichero.profile. .bash_profileseejecutasloalentrarporprimeravez,siabrimosotroshell(ejecutandobash) desde la lneadecomandosdeBashloquese intenta ejecutar es elcontenidode .bashrc. Si .bashrcnoexiste,noseejecutanconfiguracionesadicionalesalabrirunnuevoshell.Esteesquema
118

5.8.- Los ficheros de configuracin de Bash

nospermitesepararconfiguracionesquesehacenunasolavez,alconectarnos,deconfiguraciones quesecambiancadavezqueseabreunnuevoshell.Sihayconfiguracionesen .bashrcquetambin queremosejecutaralconectarnos,podemosponersource.bashrcdentrodelfichero.bash_profile. Por ltimo, el fichero .bash_logout es un fichero que, de existir, contiene rdenes que se ejecutarnalabandonarlacuenta,porejemploeliminarficherostemporalesoalmacenardatosde actividaddeusuariosenunficherodelog.

119

5.9.- Ejercicios

5.9. Ejercicios
Todoslosscriptsplanteadosdeberntener

Uncomentarioalprincipioqueindiqueloquehace. Comentariosalolargodelscriptdeloquesevahaciendo En el caso de recibir parmetros, comprobacin de que el numero de parmetros recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.

1.Creaunscriptdenombreopciones.shquepuedatenerunadeestasdossintaxis: opciones.shofichero1fichero2 opciones.shfichero1fichero2 El script, en cualquiera de los dos casos, copiar el fichero1 en el fichero2, comprobando que fichero1 existe y que fichero2 no existe. Si se utiliza para su ejecucinlaprimerasintaxis(conlaopcino),elscriptcopiar fichero1enfichero2 peroordenandopreviamentefichero1.Utilizalasentenciashiftparacontrolarlaopcin. 2.Desarrolla el script mezclaFicheros.sh que reciba un nmero indeterminado de parmetros. Los n primeros sern ficheros con el mismo nmero de lneas, y el ltimo parmetroser elficherodesalida.Elscriptdeber mezclarlaslneasdelos n primeros ficherosyguardarlasenelficherodesalida.Elnmeromnimodeparmetrosaprocesarpor elscriptser de3,noestandolimitadoelnmeromximo.Sifuerainvocadoconmenos parmetrosmostrarelcorrespondientemensajedeerror. 3. Crea un script, de nombre ordenaParametros.sh, que enve ordenados a la salida estndarlosparmetrosquerecibeporlalneaderdenes.Elnmeromnimodeparmetrosa procesarporelscriptserde2,noestandolimitadoelnmeromximo.Sifuerainvocadocon menosparmetrosmostrar enlasalidadeerrorestndarunmensajeenelqueseindiquela

120

5.9.- Ejercicios

formadeinvocarlo. 4. Realizaunscriptllamado menuFicheros.sh querecibacomoargumentounficheroo directorio. El script, a travs de un men, realizar las siguientes operaciones sobre el argumentorecibido: a) Contarelnmerodeficherosquehayeneldirectorio.Sielargumentoqueselepasaes unfichero,debermostrarelcorrespondientemensajedeerror. b) Mostrareltamaodelfichero c) Crearelfichero(antesdeberasegurarsedequenoexiste). d) Mostrarinformacinsobreelfichero(nombre,permisosquetiene,propietario,...) 5.Crea un script de nombre cambiaExtension.sh que reciba como argumentos dos extensiones. El script deber cambiar la extensin de todos los ficheros que tengan la extensinpasadacomoprimerargumentoporlaextensinpasadacomosegundoargumento. 6.LosdirectoriosdebsquedaquealmacenalavariabledeentornoPATHavecesresultan difcilesdeverdebidoaquecuestaencontrareldelimitadordospuntos(:).Escribeunscript llamadoverpath.shquemuestrelosdirectoriosdelPATHunoencadalnea. 7.Hazunafuncinquerecibacomoparmetroelnombredeunficheroydevuelvaelnmero depalabrasqueempiezanporAenl.Utilizaestafuncinenunscriptllamadofunciones.sh. Elscriptpermitiralusuariointroducirnombresdeficherosportecladohastaquesemetauno vaco;paracadafichero,mostrar elnmerodepalabrasquecomienzanconAutilizandola funcinimplementadaanteriormente.

121

You might also like