Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Comandos Shell y PDF
Comandos Shell y PDF
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.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
2
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
copiararchivosdeunlugaraotrotenemoselcomandocp,conelcualsiempredebemosindicarleel
ficheroodirectorioorigenyellugaronombrededestino,aunqueseaeneldirectorioactual.Sien
lugardecopiarlosarchivosqueremosmoverlosdesitiopodemosutilizarelcomando mv.Este
comandotambinseutilizapararenombrararchivos.
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 buscarpor 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,enmuchoscasosnosinteresaraplicaralgunadelasoperacionesque
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.
4
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:
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]* Igualatodoslosarchivosquecomienzanconunaletramayscula.
*[aeiou] Igualacualquierarchivoquefinaliceconunavocal.
tema.*[13579] Igualalostemasquefinalizanconunnmeroimpar
tema.0[13] Igualatema.01,tema.02,tema.03.
[AZaz][09]* 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.Cadatemdelalistaseutilizaenturnopara
expandirunnombredearchivoqueigualalaexpresincompletaenlaqueestninmersaslasllaves.
1.5. Bsqueda
Otrotipodeoperacinmuytileslabsquedadeficheros.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.
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.
7
1.6.- Tipos y contenidos de ficheros
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
16.Visualizaelcontenidosdelarchivopracticas.txt
Otrotipodecomandomuytilsonlosquenosbuscanunciertopatrnenelcontenidodelos
ficheros.Conelcomandogreplepodemospasarcomosegundoparmetroelnombredelarchivoy
comoprimeroelpatternquequeramosbuscar.
losarchivosacabadosen.c
$gr ep p*.txt
practica_1.txt:p1
practica_2.txt:p2
practica_3.txt:p3
8
1.6.- Tipos y contenidos de ficheros
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,aquusuarioygrupoperteneceyqupermisostieneparacadaunodeellosyparael
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
Paracambiarelpropietariodeunfichero,existeelcomandochown,queslopuedeutilizarel
rootporrazonesdeseguridad.Paracambiarelgrupodeundeterminadoarchivosepuedeutilizarel
comandochgrp.Comopodemossuponer,cuandounusuariocreaunnuevoarchivo,elsistemapone
comopropietarioelusuarioquelohacreadoypertenecientealgrupoprimariodelmismousuario.
Lospermisosqueseponenpordefectoalcrearunnuevoarchivolospodemosconfigurarconel
comandoumask.
10
1.7.- Permisos
1.7.1. Resumendecomandos
EnlaTabla1.2sepuedenverlamayoradeloscomandosmencionadosanteriormente.
visualizaelcontenidodeun
cat ls listaelcontenidodeundirectorio
fichero
enseaelmanualsobreun
cd cambiadedirectorio man
comando
cambialospermisosdeun muestraeldirectorioenquenos
chmod pwd
archivoodirectorio encontramos
cambiaelpropietariodeun
chown rm borraarchivos
archivo
visualizanlineasdelfinaldel
find bsquedadeficheros tail
fichero
cambialospermisospordefecto
grep buscaunpatrnenunfichero umask
deunarchivoalsercreado
visualizanlineasdelcomienzo
head wc cuentalneas/palabras
delfichero
brevereferenciasobreun
info idemmanperomsextenso whatis
comando
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);ydecididoadesarrollarunsistemaqueexcedilos
estndaresdeMinix.Querallevaracabounsistemaoperativoqueaprovechaselaarquitecturade
32bitsparamultitareayeliminarlabarrerasdeldireccionamientodememoria.
Torvaldsempezescribiendoelncleodelproyectoenensamblador,yluegocomenzaaadir
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
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,ysobrel,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
Unintrpretederdenes,oshellenlaterminologaLinux,estconstruidocomounprograma
normaldeusuario.Estotienelaenormeventajadequepodemoscambiardeintrpretederdenes
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,tienesuspropiasrdenesyvariables,lo
queloconvierteenunlenguajedeprogramacin.Laventajaquepresentafrenteaotroslenguajeses
sualtaproductividad,unatareaescritaenellenguajedelshellsueletenermenoscdigoquesiest
escritaenunlenguajecomoC.
RespectoacuandoutilizarelshellycuandoutilizarotrolenguajedeprogramacincomoC,
indicarcomorecomendacingeneralquedebemosutilizarelshellcuandonecesitemoshaceralgo
conmuchosarchivos,odebamosdehacerlamismatarearepetitivamente.Nodeberamosusarel
shellcuandolatareaseamuycompleja,requieragraneficiencia,necesitedeunentornohardware
diferente,orequieradiferentesherramientassoftware.
Respecto alasrdenes,enelbash(elquenosotrosvamosautilizarenprcticas)podemos
encontrarlossiguientestipos:
1.Alias:sonabreviacionesparardenesexistentesquesedefinendentrodelamemoriadel
shell.
2.Ordenesempotradas:rutinasimplementadasinternamenteenelshell.
3.Programasejecutables:programasqueresidenendisco.
Cuandoelshellestpreparadoparaejecutarunaorden,evalaeltipodeordensegnelorden
queapareceenlalistaanterior:compruebasiesunalias;sino,siesunaordenempotrada;ypor
ltimo,unprogramaejecutable(enesteltimocasolaeficienciaesmenorpueshayqueaccedera
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:
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,siqueremosverquehaceycualessonlasopcionesdelaordenls,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.Enlapartemsaltadelrbol,
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.Entrestasencontramos: 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.
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
responsabledequelasrdenesdeLINUXrealicenfuncionesmuyconcretas,yseanparcasendar
informacinalusuario.
Metacarcter Descripcindelafuncin
; Separadorentrerdenesqueseejecutansecuencialmente
() 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
indicadorderdenes,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
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
lneaderdenes.Parailustrarlo,vamosausarlasordenes date,quenosdalafechayhoradel
$date;who|wc#ejecutadate;ejecutawhocuyasalidapasaawc
WedOct1110:12:04WET1995
1531
$(date;who)|wc#ejecutadateywho,sussalidassepasanawc
24
2.4.- Los procesos
21264
Porqu?
Ejecutandoordenesensegundoplanocon&
Linuxpermitedosformasdeejecucinderdenes:
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>
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.
Lassiguientesrdenesquevamosaveracontinuacinnospermitencambiarelestadodeun
trabajo.Lamayorpartedeellasadmitencomoargumentounidentificadordetrabajo.
fg
Laordenfgseusaparatraertrabajosdefondo,osuspendidos,aprimerplano:
fg[%[job]]
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
LassealessonenLINUXelmediobsicoparanotificardelaocurrenciadeeventosalos
procesos.Porejemplo,laspulsaciones<CTRL>C,<CTRL>Z,etc.loquehaceenrealidades
provocarqueelmanejadordetecladogeneredeterminadassealesquesonenviadasalprocesoen
ejecucin.Tambin,seenvansealescuandounprogramareferenciaunadireccininvlida(p.e.
unpunteronoinicializado)delproceso.Enestecaso,segeneralasealSIGSEGV,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 Descripcindelafuncin
>nombre Redireccionalasalidadeunaordenparaescribirenelarchivo
nombre.Sinombreexiste,losobreescribe.
2>nombre Redireccionaelerror(stderr)aunfichero.Sinombreexiste,lo
29
2.5.- Metacaracteres de entrada/salida o de direccin
Metacarcter Descripcindelafuncin
sobreescribe.
>>nombre Lasalidadelaordenseaadealfinaldelarchivonombre.
2>>nombre Lasalidadestderrseaadealfinaldelarchivonombre
>>&nombre Aadelasalidadestderr,combinadaconstdoutylasaadeal
finaldenombre.
| Creauncauceentredosrdenes.Lasalidaestndardelaorden
alaizquierdadesmboloseconectaalaentradaestndardela
ordendeladerechadelsigno.
Tabla2.2:Metacaracteresdeentrada/salidaodedireccin
Redireccindelaentradaestndarcon<
AlgunasordenesLINUXtomansuentradadearchivoscuyonombresepasacomoargumento,
perosiestosnoseespecifican,comovimosanteriormente,lalecturasellevaacabodestdin.Otras
rdenessloleendelaentradaestndar,porloquesiqueremosqueleandearchivodebemos
utilizarlaredireccin<.
Porejemplo,laordenmail(programabsicodecorreoelectrnico)leesuentradadestdinyno
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>&
Lassalidasdelasrdenesvannormalmentea stdout,ymuchasrdenesescribenmensajesde
erroroinformacinadicionalenstderr.Laredireccindelasalidapermiteenviarlassalidasaun
archivo.Enestecasolosmensajesquesalenporstderrsiguensaliendoporpantalla.Siqueremos
redireccionar el error a un fichero independiente utilizamos el metacarcter 2> y si queremos
combinarenunmismoficherolastdoutystderr,utilizamoselmetacaracter>&.
Losejemplosmuestranlosdiferentesmetacaracteresderedireccin.
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<<
Parautilizarlo,escribimosacontinuacinde<<undelimitador,esdecir,unconjuntonicode
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 acabarcuando
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
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,agruparvariosenunosolooverqucontieneunarchivocomprimido
sontareasqueutilizaremosfrecuentementeparahacercopiasdeseguridad,transportararchivosde
unsitioaotro,etc.Aunqueexistenmultituddeprogramasdiferentesquenospermitenhaceresta
clasedeoperaciones,generalmenteentodoslossistemasUNIXencontraremoslaherramientatar.
Esteprogramanospermitemanipulardecualquierformaunoovariosarchivosparacomprimirlos,
agruparlos,etc.
compresin.Comohemosdicho,paraelloutilizaprogramasexternoscomoelgzip.
Compresindearchivos
Lacompresindearchivosnospermiteahorrarespaciodediscoytiempoenlatransmisinde
losmismos.
Paracomprimirydescomprimirarchivospodemosutilizarlasrdenescuyasintaxisaparecea
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
Empaquetadodearchivos
Laordentarseutilizaparaempaquetarungrupodearchivosenunnicoarchivo,quetienela
estructuradeunencabezadode512bytesyelarchivo,tantasvecescomoarchivosempaquetemos.
Seutilizaparaalmacenarjerarquasdedirectorios,tenercopiasdeseguridadyahorrarespacio.Es
laformahabitualdesuministrarparchesydistribucionesdesistemas.
Lasintaxisdelaordentares:
tar[opciones][archivos]
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
Podemoscombinarlacapacidaddecompresinconladeempaquetayasreducireltamao.
Paraelloeltartienedosopcionesms:
zComprimeutilizandogzip
jComprimeutilizandobzip2
Lasextensionesdelosarchivossontgzytbz,respectivamente.Amododeejemplo:
$tarcvzfmisPracticas.tgzmispracticas
EmpaquetaycomprimeeldirectoriomisPracticasysucontenidoenunnicoarchivollamado
misPracticas.tgz
$tarxvzfmisPracticas.tgz
36
2.6.- Empaquetado y compresin de archivos con tar y gzip
37
2.7.- Ejercicios
2.7. Ejercicios
1.Desplzatehastaeldirectorio/binygeneralossiguienteslistadosdearchivos(siemprede
laformamscompactayutilizandolosmetacaracteresapropiados):
a) Todoslosarchivosquetengancomoterceraletradesunombreunaa
b) Todoslosarchivosquenocomiencenporunaconsonante
c) Todoslosarchivosquequecontenganunnmeroporda,df
d) Todoslosarchivosquecomiencenporbyacabenenunnmero
2.Construyelasiguienteestructuradedirectorios
SPAM SO IA
2006
EDI
ylossiguientesficherosdetextoconcontenidodetuinvencin.
Situadoeneldirectorio Nombredelfichero
SPAM banco.eml
compraTelefono.txt
Mail notas.eml
SO noticiasPracticas.eml
EDI febrero2007_notas.eml
IA anotaciones.txt
LOCAL listaAprobados.txt
2006 telefonosClase.eml
38
2.7.- Ejercicios
SitundoteeneldirectorioMail:
a) Utilizalaordenfindparaencontrartodoslosficherosqueacabenen.txt
3.Creaunalneaderdenesqueaadaelcontenidodetodoslosarchivoscontenidosen
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).
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.Escribeunalneaderdenesparavisualizarlaslneasdelarchivonotas.txtquecontengan
alumnosconlacadenazapensunombre
10.Busca archivos cuyo nombre contenga la cadena 86 a partir del directorio raz /.
Redireccionalasalidayelerrordeformaadecuadaparaenterartedelasalida.
11.Creaunfichero.tgzyotro.tbzconlajerarquadedirectoriosdeMail.
12.Escribelaslneasderdenesquellevenacabolastareassiguientes:
a) Contarelnmerodecaracteresylneasquehayenelarchivonotas.txtymostrarelresultado
porpantalla(nohayquemostrarelnombredelarchivo)
b) Contarelnmerodepalabrasylneasquehayenelresultadodelaordenls1ymostrarel
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
procesosycompruebaqueelnuevoprocesoestyquesuestadoseasuspendido.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$HISTSIZEcontieneelnmeroderdenesquesevanaalmacenarenlahistoria
antesdedescartarlaordenmsantiguaalmacenada.Elvalorpredeterminadoparaestavariablees
de500,sibienpodemoscambiarloasignndoleotrovaloralavariable.
Paraconsultarelvalordelasvariablesdeberemosteclearset.
$bash$ set
argv()
PWD/tmp/
HISTSIZE500
USER mluque
SHELL /bin/bash
...
Laprimeracolumnareflejaelnombredelavariableylasegundasuvalor.
Viendolahistoria
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
Repitiendordenesconeleditorderdenes
Enelbash,podemosutilizaruneditorderdenespararecuperaryejecutarrdenes.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.
44
3.1.- Historia de rdenes
Unavezseleccionaunaorden,yciertaspalabradentrodeesaorden,sepuedenaplicarunaoms
operacionesalaspalabrasseleccionadasmedianteelusodeunasucesindeoperadoresllamados
modificadores.Lomodificadoresvanprecedidosdelsignodospuntos(:)
o Palabra0(orden) oLaordengcc
N LaNsimapalabra 2Latercerapalabra(o)
^ Lapalabra1delaorden ^Lapalabraserlab1.c
$ Laltimapalabradelaorden $Lapalabralab1
* Todalaspalabrassalvoelnombredelaorden *Laspalabraslab1.c,oylab1
Tabla3.1:Indicadoresdepalabra
Los modificadores cambian la forma en la que el evento actual es tratado. Algunos de los
modificadoresmstilesaparecenenlaTabla3.2(elrestopuedenconsultarseenelmanualenlnea
sobrehistory).
Modificador Descripcin
p Imprimeelresultadodeunaordensinejecutarla
r Eliminalarazdelnombredearchivo
e Eliminalaextensindelnombredearchivo(partequesigue
alpunto)
h Sequedaconlacabeceradelaruta(todomenoselltimo
componente)
t Sequedaconelfinaldelaruta(ltimocomponente)
Tabla3.2:Modificadoresdelareferenciasdelahistoria
45
3.1.- Historia de rdenes
Vamosaveralgunosejemplos,:pestilcuandonoestamossegurossilareferenciaquevamosa
hacereslaquedeseamos.Conl,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),podemospulsardosveceseltabuladorysenosmostrarunalistaconlasposibles
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
() Seusanparaaislarrdenesseparadaspor;|.Lasrdenes
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
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
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 Descripcindelafuncin
>nombre Redireccionalasalidadeunaordenparaescribirenelarchivo
nombre.Sinombreexiste,losobreescribe.
2>nombre Lasalidadestderrseescribeennombre
>>nombre Lasalidadelaordenseaadealfinaldelarchivonombre.
| 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
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
usanparalaredefinicinderdenes.Unprogramashellpodranofuncionarcorrectamente
porqueesperaelcomportamientopordefectodeunaorden.
2. Definesiemprelosaliasmultipalabraentrecomillassimples.
3. Alcrearunalias,debemostenerlaprecaucindenollamarlosalias,nicrearaliasquese
referencienaellosmismosparanocrearunbucleenlasdefinicionesdestos.Ahorabien,s
podemoscrearaliasquereferencienaotrosalias.
4. Cuandodefinimosunalias,stesloestardisponibleenelterminalenelquesecrey,
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
ejecutarcorrectamentelasrdenesdelshell.Cuandodamosalshellunaordeninteractiva,Linux
inicia un nuevo proceso para ejecutar la orden. El nuevo proceso hereda algunos atributos del
entornoenelquesecre.Estosatributossepasandeunosprocesosaotrospormediodelas
variablesdeentorno,tambindenominadasvariablesglobales($HOME,$SHELL,$USER,...).
Elshelltrataporigualatodaslasvariables:lasidentificaporunprefijoespecial,elsignodolar
($),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 #asignaValoralavariablevar
var= #asignaunvalornuloalavariablevar
Dondevareselnombredelavariable,compuestoporletras,dgitosy/osubrayado(_).Sivarno
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
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 Descripcin
\A LahoraenformatoHH:MM
\d Lafechaenformatosemanamesdia
\H Hostname
\h Elnombredelamquinahastaelprimerpunto
\j Nmerodejobshijosdelshell
\n Retornodecarroynuevalnea
\r Retornodecarro
\s Nombredelshell
\t HoraenformatoHH:MM:SScon12horas
\T Horaenelformatoanteriorperocon24horas
\u Nombredeusuario
\v VersindeBash
\w Rutadeldirectorioactual
\W Nombredeldirectorioactual(sinruta)
\# Nmerodecomandosejecutado
56
3.5.- Variables
Opcin Descripcin
\$ #sisomosroot,o$encasocontrario
\nnn Cdigodecarcteramostrarenoctal
\\ Labarrahacaatrs
Tabla3.8:Opcionesdepersonalizacindelprompt
Conocereldirectoriodetrabajo
Alpromptpodemosaadirlemuchasopcionesquenosayudenatrabajar;quizslamsusadaes
\wquemuestraeldirectoriodondeestamossituadosencadamomento.
$bash$ PS1='\w>'
~>
Donde~significaqueestamoseneldirectoriohome.
Sabersisomosroot
ousuario
Esmuytpicoquerersabersisomosrootocualquierotrousuariodelamquina,paralocualse
usalaopcin\$quemuestrauna#sisomosroot,oun$encualquierotrocaso.
~> PS1='\w\$'
~$
Saberenquemquinaestamos
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
comandosestpreparadapararecibirunanuevaorden,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 Descripcin
SHELL Pathdelintrpretederdenesqueestamosusando
LINES Lneasdelterminalencaracteres
COLUMNS Columnasdelterminalencaracteres
HOME Directoriohomedelusuario
PWD Directorioactual
OLDPWD Anteriordirectorioactua
58
3.5.- Variables
Variable Descripcin
USER 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)comentamosquelosintrpretesderdenesoshellseranlenguajesde
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 estdiseadaparasuponerqueloquecontieneelarchivosonrdenesparaun
intrpretederdenes,porloqueejecutaunshellylepasaelcontenidodelarchivoparaquelo
interprete.Deaquelnombredearchivosinterpretados.Ahorabien,elshellcreadopor exec por
defectoesunBourneshell(bash)Quocurresiqueremosejecutarunprogramaescritoenotro
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.
Nuestroprimerscript
:Holamundo
Paracrearunscriptbastaconabrirunficheroconcualquiereditordetexto(nedit,pico,vi,gedit)
y,acontinuacin,indicarlasaccionesquequeramosquerealicenuestroscript.
#!/bin/bash
echoHolaMundo
Estescript(hello.sh)tieneslodoslneas.Laprimeraleindicaalsistemaquprogramausar
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.
Unscript
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
Comentariosenlosscripts
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
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
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"
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"
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
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.Creaunalneaderdenesqueindiquemedianteunmensajesilaejecucindelaordencat
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:
uestunombredeusuario
deselnombredeldirectorioenelqueteencuentras(rutacompleta)
rindicasieresrootousuario
heslahoraactual
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
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,elresultadoserque fich1 contendrlapalabraadisy
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,ledarpermisosdeejecucin.Elsegundoscriptrecibircomoargumentosel
nombredeunficheroyelnombredeundirectorio;creareldirectorioyharunacopiadel
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]]
Opcin Descripcin
a Lavariableesdetipoarray
f Mostrarelnombreeimplementacindelasfunciones
F Mostrarsloelnombredelasfunciones
i Lavariableesdetipoentero
r Lavariableesdeslolectura
x Exportalavariable(equivalenteaexport)
Tabla4.1:Opcionesdelcomandointernodeclare
Siescribimosdeclaresinargumentos,nosmuestratodaslasvariablesexistentesenelsistema.
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 tado
$bashresult ado=$var1*$var2
$bashecho$resul tado
20
Paraquelaoperacinaritmticatengaxito,noesnecesarioquedeclaremoscomoenterasa
var1yvar2,bastaconquerecojamoselvalorenunavariableresultadodeclaradacomoentera.
Esdecir,podramoshacer:
$bashresult ado=4*6
$bashecho$resul tado
24
Einclusopodemosoperarconvariablesinexistentes:
$bashresult ado=4*var_ine xi st ent e
$bashecho$resul tado
0
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:
EnlaTabla4.2,semuestranalgunosdelosoperadoresaritmticossoportadosporBash.
Operador Descripcin
+ Suma
* Multiplicacin
Resta
/ Divisinentera
% Restodeladivisinentera
() Agruparoperaciones
** Potencia
Tabla4.2:OperadoresaritmticosadmitidosporBash
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$((...)).
Vemosqueaesdetipocadena,mientrasquesiusamosdeclareinoslacreadetipoentero:
$bashdeclareia=3 *4
$bashdeclarepa
declareia="12"
75
4.2.- Expresiones aritmticas
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.Luegolaformanormaldeescribirunasentenciacondicionalif
es:
ifcomando;then
Procesamientonormal
else
Procesamoselerror
fi
Cmopodemosconocerelcdigodeterminacindeuncomando?
Alhaberfalladoelltimocomando $?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,ysistetienexito(elcdigodeterminacines0),ejecutael
segundocomando cp001.tmp$HOME,perosielprimercomandofalla,yanoseejecutael
segundoporqueparaquesecumplalacondicinamboscomandosdeberandetenerxito(siun
operandofallayanotienesentidoevaluarelotro).
Eloperador||porcontraejecutaelprimercomando,yslosistefallaseejecutaelsegundo.
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
Lasentenciaiflonicoquesabeesevaluarcdigosdeterminacin.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.
79
4.3.- Las sentencias condicionales
Comparacindecadenas
LosoperadoresdecomparacindecadenasseresumenenlaTabla4.3.Lascomparacionesque
serealizanconlossmbolos<y>sonlexicogrficas,esdecircomparacionesdediccionario,donde
porejemploqesmayorqueperro.Obsrvesequenoexistenoperadores<=y>=yaquesepueden
implementarmedianteoperacioneslgicas.
Operador Verdaderosi...
str1=str2 Lascadenassoniguales
str1!=str2 Lascadenassondistintas
str1<str2 str1esmenorlexicogrficamenteastr2
str1>str2 str1esmayorlexicogrficamenteastr2
nstr1 str1esnonulaytienelongitudmayoracero
zstr1 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 Descripcin
lt Menorque
le Menoroigualque
eq Igualque
ge Mayorigualque
gt Mayorque
ne 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 Verdaderosi...
afichero ficheroexiste
bfichero ficheroexisteyesundispositivodebloque
cfichero ficheroexisteyesundispositivodecarcter
dfichero ficheroexisteyesundirectorio
efichero ficheroexiste(equivalenteaa)
ffichero ficheroexisteyesunficheroregular
82
4.3.- Las sentencias condicionales
Operador Verdaderosi...
gfichero ficheroexisteytieneactivoelbitdeseguridad
Gfichero ficheroexisteyesposedoporelgrupoIDefectivo
hfichero ficheroexisteyesunenlacesimblico
kfichero ficheroexisteytieneelstrickybitactivado
Lfichero ficheroexisteyesunenlacesimblico
Nfichero ficheroexisteyfuemodificadodesdelaltimalectura
Ofichero ficheroexisteyesposedoporelgrupoIDefectivo
pfichero ficheroexisteyesunpipeonamedpipe
rfichero ficheroexisteypodemosleerlo
sfichero ficheroexisteynoestavaco
Sfichero ficheroexisteyesunsocket
ufichero ficheroexisteytieneactivoelbitdesetuid
wfichero ficheroexisteytenemospermisodeescritura
xfichero 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
ElbucleforenBashesunpocodistintoalosbuclesfortradicionalesdelenguajescomoCo
Java;enrealidad,separecemsalbucleforeachdeotroslenguajes,yaqueaqunoserepiteun
nmerofijodeveces,sinoqueseprocesanloselementosdeunalistaunoauno.
85
4.4.- El bucle for
Susintaxiseslasiguiente:
forvar[inlista]
do
listaderdenes
done
Ejecutalasrdenesdelistaderdenestantasvecescomopalabrashayaenlista.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
delimitadoreselespacio,aunqueenocasionesconvienecambiarlo.
Elejemplosiguienterecorredosveceslosargumentosdeunprogramacon$*.Laprimeravez
usamoscomodelimitadorelvalorpordefectodelavariableIFS(elespacio)ylasegundavez
cambiamoselvalordelavariablesIFSparaqueeldelimitadorseanlascomillasdobles().
86
4.4.- El bucle for
#Buclesquerecorrenlosargumentos
forargin$*
do
echo"Elemento:$arg"
done
IFS='' #Cambiamoseldelimitadoralascomillas
dobles()
forargin$*
do
echo"Elemento2:$arg"
done
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
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 untilcondicin
do do
listaderdenes listaderdenes
done done
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 Descripcin
e Activalainterpretacindecaracteresprecedidosporelcarcterdeescape.
E Desactivalainterpretacindecaracteresprecedidosporcarcterdeescape.Esla
opcinpordefecto.
n Omiteelcarcter\nalfinaldelalnea(esequivalentealasecuenciadeescape\c).
Tabla4.6:Opcionesdelcomandoecho
LaTabla4.7muestralassecuenciasdeescapequeaceptaecho(cuandoseusalaopcine).Para
questastenganxitodebendeencerrarseentrecomillassimplesodobles,yaquesinoelcarcter
90
4.6.- Entrada y salida de texto
deescape\esinterpretadoporelshellynoporecho.
Secuenciadeescape Descripcin
\a Produceunsonidopoom(alert)
\b Borrarhaciaatrs(backspace)
\c Omiteel\nalfinal(esequivalentealaopcinn.
Debecolocarsealfinaldelalnea
\f Cambiodepginadeimpresora
\n Cambiodelnea
\r Retornodecarro
\t Tabulador
Tabla4.7:Secuenciasdeescapedelcomandoecho
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
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 Descripcin
%c Imprimeelprimercarcterdeunavariablecadena
%d Imprimeunnmerodecimal
%i Igualque%d
%e Formatoexponencialb.precisione[+]e
%E Formatoexponencialb.precisionE[+]e
%f Nmeroencomaflotanteb.precision
%o Octalsinsigno
%s Cadena(string)
%b Interpretalassecuenciasdeescapedelargumentocadena
92
4.6.- Entrada y salida de texto
Especificador Descripcin
%q Escribeelargumentocadenadeformaquepuedaserusado
comoentradaaotrocomando
%u Nmerosinsigno(unsigned)
%x Hexadecimalconletrasenminscula
%X 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
Bashnopuedemanejarexpresionesconnmerosenpuntoflotante,sloenteros,perospuede
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 Descripcin
+ Precederpor+alosnmerospositivos
espacio Precederporunespacioalasnmerospositivos
0 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,lasltimaspalabrasse asignanalaltima
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 Descripcin
a Permiteleerlaspalabrascomoelementosdeunarray
d Permiteindicarundelimitadordefindelnea
nmax Permiteleercomomximomaxcaracteres
p 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
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.
3.Desarrollaunscriptdenombrecal.shqueimplementeunacalculadoraconlasoperaciones
bsicas(suma,resta,multiplicacin,divisin,potencia).Nota:Sepuedehacerenmenosde
cuatrolneasdecdigo.
97
4.7.- Ejercicios
sumadelosNprimerosnmeros.
5.DesarrollaunscriptdenombreficheroDirectorio.shquerecibaunnmeroindeterminado
deparmetros.Elscriptdeberclasificarlosargumentossegnseanficherosodirectoriosy
guardarlosendosarchivos(fich.txtydir.txt).
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$@.
Lasentenciageneraunmenconloselementosdelista,asignaunnmeroacadaelemento,y
pidealusuarioqueintroduzcaunnmero.Elvalorelegidosealmacenaenvariable,yelnmero
elegidoenlavariable REPLY.Unavezelegidaunaopcinporpartedelusuario,seejecutael
cuerpodelasentenciayelprocesoserepiteenunbucleinfinito.
veceshagafalta),sepuedeabandonarusandolasentenciabreak.Lasentenciabreak,aligualque
enCyJava,seusaparaabandonarunbucleysepuedeusarenelcaso,tantodeselect,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,yassucesivamente.Elnmerode
posicionesquesedesplazanpuedesermayorqueunoyseespecificacomoargumentodelaorden.
Suformatoeselsiguiente:
shift[n]
donde n eselnmerodedesplazamientosalaizquierdaquequeremoshacerconlosargumentos
pasadosalscript.Siseomiten,pordefectoseconsideraqueelnmerodedesplazamientosvale1.
102
5.3.- La sentencia shift
Luego,siejecutamoselcomando shift1,$1pasaracontenerelvalorde$2,$2elde$3yas
sucesivamente.Elvalorde$1sepierde.
Unejemploclsicodelusodeestecomandosonlosscriptsconopciones.Lasopciones,aligual
quelosargumentosserecibenenlosparmetrosposicionales,esdecir,siejecutamoshacero
esto.txtaquello.txt,en$1recibimoso,en$2esto.txtyen$3aquello.txt.En
principio, paratratarlasopcionesnonos harafaltasabernadams.Elproblemaesten 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".
Sisloindicamosalgunosndices,losdemslosasignacontinuandolascuentadesdeelltimo
ndiceasignado:
bash$ C=([5]= Cosa Casa Per ro)
bash$ declarepC
declareaC='([5]="Cosa"[6]="Casa"[7]="Perro")'
Unaformatilderellenarunalistaesapartirdelaslneasdevueltasporunasustitucinde
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.
Elejemploanteriornosdicequehaytreselementosaunquelosndiceslleguenhastaelndice7,
yaqueexistenposicionessinasignarenlalista.Elcomando # slonosdevuelveelnmerode
posicionesocupadas.
Tambindebemostenerencuentaquedentrodeloscorchetesvauna @,ynounndice.Si
106
5.4.- Listas (Arrays)
ponemosunndice,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,conloquenoimportatenercargadasgrancantidaddestasenel
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!,acontinuacinllamaalafuncinsalir
yterminaelscript.Elprogramanuncallegaraalaltimalnea.
Elsiguientescriptesprcticamenteidnticoalanterior.Ladiferenciaestenquelafuncin
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 Descripcin
Sivarexisteynoesnularetornasucontenido,
${var:valor}
sino,retornavalor.
${var:+valor} Sivarexisteynoesnularetornavalor,sino,
110
5.6.- Operadores de cadena
Operador Descripcin
retornaunacadenanula.
Sivarexisteynoesnularetornasucontenido,
${var:=valor} sino,asignavaloravaryretornasu
contenido.
Sivarexisteynoesnularetornasucontenido,
sino,imprimevar:mensajeyabortaelscript
queseestejecutando(sloenshellsno
${var:?mensaje}
interactivos).Siomitimosmensajeimprimeel
mensajepordefectoparameternullor
notset.
Retornaunasubcadenadevarqueempiezaen
offsetytienelongitudcaracteres.El
${var:offset:longitud} primercarcterdevarempiezaenlaposicin0.
Siseomitelongitudlasubcadenaempiezaen
offsetycontinuahastaelfinaldevar.
Tabla5.1:Operadoresdesustitucin
Losdospuntos(:)enesteoperadorsonopcionales.Siseomitenenvezdecomprobarsiexistey
noesnulo,slocompruebaqueexista(aunqueseanulo).
${var:valor} seutilizapararetornarunvalorpordefectocuandoelcontenidodelavariable
var estindefinido.Porejemplo, ${nombre:1} devuelve1sielcontenidode nombre est
indefinidooesnulo.
${var:+valor}porcontraseutilizaparacomprobarqueunavariabletengaasignadounvalorno
nulo.Porejemplo,${nombre:+1}retorna1(quesepuedeinterpretarcomoverdadero)sinombre
tieneunvalorasignado.
Losdosoperadoresdecadenaanterioresnomodificanelvalordelavariablevar,simplemente
Tambin podemos querer detectar errores producidos porque una variable no tenga valor
111
5.6.- Operadores de cadena
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.
Elscriptrecibircomoprimerargumentoelficherodeclientesy,opcionalmentecomosegundo
argumento,elnmero N declientesaimprimir.Sinoseproporciona N,pordefectoser5.La
formadelcomandopodraser:
mejoresclientes.shfichero[cuantos]
Paraellopodemosusarelcomandosortelcualordenalneas,ydespuselcomandoheadque
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
ysortsequedaresperandoaqueentrendatosporsuentradaestndarhastaqueelusuariopulse
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 Descripcin
Sipatroncoincideconeliniciodelvalordevar,
${var#patron} borralapartemspequeaquecoincidey
retornaelresto.
Sipatroncoincideconeliniciodelvalorde
${var##patron} var,borralapartemsgrandequecoincidey
retornaelresto.
${var%patron} Sipatroncoincideconelfinaldelvalordevar,
borralapartemspequeaquecoincidey
114
5.6.- Operadores de cadena
Operador Descripcin
retornaelresto.
Sipatroncoincideconelfinaldelvalordevar,
${var%%patron} borralapartemsgrandequecoincideyretorna
elresto.
Lapartemsgrandedepatronquecoincideen
varesreemplazadaporcadena.Laprimera
formasloreemplazalaprimeraocurrencia,yla
segundaformareemplazatodaslasocurrencias.
${var/patron/cadena} Sipatronempiezapor#debeproducirsela
${var//patron/cadena} coincidenciaalprincipiodevar,ysiempieza
por%debeproducirselacoincidenciaalfinal
devar.Sicadenaesnula,seborranlas
ocurrencias.Enningncasovarsemodifica,
sloseretornasuvalorconmodificaciones.
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
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
117
5.7.- Sustitucin de comandos
Laopcinlhacequegrepdevuelvaslolosnombresdeficherodondehaencontradolapalabra
'bash'.
5.8. LosficherosdeconfiguracindeBash
Cadavezqueentramosanuestracuentaseejecutaelcontenidodelfichero/etc/profile,yluego
Cualquierconfiguracinqueaadamosa.bash_profilenoserefectivahastaquesalgamosdela
cuentayvolvamosaconectarnos,sihacemoscambiosenesteficheroyqueremosverlossinsalirde
lacuentapodemosusarelcomandosource,elcualejecutaelcontenidodelficheroqueledigamos:
bash$ sour ce.ba sh_pr ofile
.bash_profiletambinsepuedeejecutaras:
bash$ ..bash _p rof ile
histrica:.bash_login,nombrederivadodelfichero.logindelCShell,y.profilenombreusadopor
elBourneShellyelKornShell.Encualquiercaso,slounodeestosficherosserejecutado.Si
.bash_profileexistelosdemssernignorados,sinoBashcompruebasiexiste.bash_loginy,slo
sistetampocoexiste,compruebasiexiste .profile.Laraznporlaqueseeligiesteordende
bsqueda es que podemos almacenar en .profile opciones propias del Bourne Shell, y aadir
opcionesexclusivasdeBashenelfichero.bash_profileseguidodelcomandosource.profilepara
queBashtambincarguelasopcionesdelfichero.profile.
.bash_profileseejecutasloalentrarporprimeravez,siabrimosotroshell(ejecutandobash)
.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
recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.
1.Creaunscriptdenombreopciones.shquepuedatenerunadeestasdossintaxis:
opciones.shofichero1fichero2
opciones.shfichero1fichero2
parmetros. Los n primeros sern ficheros con el mismo nmero de lneas, y el ltimo
parmetroserelficherodesalida.Elscriptdebermezclarlaslneasdelos n primeros
ficherosyguardarlasenelficherodesalida.Elnmeromnimodeparmetrosaprocesarpor
elscriptserde3,noestandolimitadoelnmeromximo.Sifuerainvocadoconmenos
parmetrosmostrarelcorrespondientemensajedeerror.
120
5.9.- Ejercicios
formadeinvocarlo.
a) Contarelnmerodeficherosquehayeneldirectorio.Sielargumentoqueselepasaes
unfichero,debermostrarelcorrespondientemensajedeerror.
b) Mostrareltamaodelfichero
c) Crearelfichero(antesdeberasegurarsedequenoexiste).
d) Mostrarinformacinsobreelfichero(nombre,permisosquetiene,propietario,...)
6.LosdirectoriosdebsquedaquealmacenalavariabledeentornoPATHavecesresultan
difcilesdeverdebidoaquecuestaencontrareldelimitadordospuntos(:).Escribeunscript
llamadoverpath.shquemuestrelosdirectoriosdelPATHunoencadalnea.
7.Hazunafuncinquerecibacomoparmetroelnombredeunficheroydevuelvaelnmero
depalabrasqueempiezanporAenl.Utilizaestafuncinenunscriptllamadofunciones.sh.
Elscriptpermitiralusuariointroducirnombresdeficherosportecladohastaquesemetauno
vaco;paracadafichero,mostrarelnmerodepalabrasquecomienzanconAutilizandola
funcinimplementadaanteriormente.
121