Documentos de Académico
Documentos de Profesional
Documentos de Cultura
apuntesSO PDF
apuntesSO 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. 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
Elcomandobsicoparacrearundirectorioesmkdir.Porsuparte,siqueremoscrearunarchivo
sepuedeutilizarcualquiereditordetexto,comosevermsadelante.
1.1.1. Movindonosporelsistemadeficheros
Para movernos por la estructura de directorios debemos utilizar los comandos para listar
contenidos y cambiar de carpeta. Si queremos ver lo que hay en el directorio donde estemos
situadospodemoslistarloscontenidosutilizandoelcomandols.Debemostenerencuentaquepor
defecto el comando nonos muestra losarchivos queempiezan por unpunto.Paracambiar de
directoriopodemosutilizarelcomando cd.Sinolepasamosningnparmetro,pordefectonos
situarennuestrodirectoriohome;silepasamoscomoargumentos..,nossituareneldirectorio
superior. Generalmente, se le suele indicar dnde queremos ir, pasndolo de forma absoluta o
relativa.Deformarelativasignificaquepartiremosdeldirectoriodondeestemosenelmomentode
ejecutar el comando. Por ejemplo, si estamos en el directorio /Directorio1/Directorio1_1/ y
queremosiral/Directorio3/,deberamosintroducirelsiguientecomando:cd../../Directorio3.
Deformaabsolutasiemprepartimosdelaraz,demaneraqueelcomandoqueutilizaramosparael
ejemploanteriorsera:cd/Directorio3.Parasaberenqudirectorioestamospodemosutilizarel
comandopwd.
1. Visualiceelcaminocompletodeldirectorioactual.
2.Visualicelosficherosdeldirectorioactual.
3.Cree la siguiente estructura de directorios dentro de su
directoriohome.
/curso0607
/pract1/pract2/pract3
1.2.- Manipulacin
1.2. Manipulacin
Ahora que ya sabemos movernos correctamente por la jerarqua de directorios tambin
necesitamossabercmocopiar,eliminarymanipularcorrectamenteotrosaspectosdelosficheros.
Elcomandormeselqueseencargadeeliminarlosarchivosqueleindiquemos.Paraeliminarun
directorio,podemosutilizarelcomandormdir,aunquesloloborrarcuandosteestvaco.Para
copiararchivosdeunlugaraotrotenemoselcomandocp,conelcualsiempredebemosindicarleel
ficheroodirectorioorigenyellugaronombrededestino,aunqueseaeneldirectorioactual.Sien
lugardecopiarlosarchivosqueremosmoverlosdesitiopodemosutilizarelcomando mv.Este
comandotambinseutilizapararenombrararchivos.
4.Crea en el directorio pract2 un archivo que se llame
apuntes.txtyotroquesellamaejercicios.txt
5.Escribealmenos5lneasencadauno
6.Copiaelficheroapuntes.txteneldirectoriopract3
7. Muevaelficheroejercicios.txtaldirectoriopract1
8.Borraelarchivoapuntes.txtdeldirectoriopract2
9.Borraeldirectoriopract2
10.Cmbialeelnombrealficheroapuntes.txpornotas.txt
1.3. Laayudadelsistema
Todosloscomandosqueveremostienenmultituddeopcionesyparmetrosdiferentesquenos
permitenmanipularlosdelaformaquequeramos.Desdeelprincipiosetuvomuyencuentaquees
imprescindible contar con una buena documentacin para todos ellos. Igualmente, toda esta
informacin tambin es necesaria para los ficheros de configuracin del sistema, las nuevas
aplicacionesqueutilizamos,etc.Esporestoqueelmismosistemaincorporaunmecanismode
manuales con el que podemos consultar casi todos los aspectos de los programas, utilidades,
comandosyconfiguracionesexistentes.Elcomandomsutilizadoesel man,quenosenseael
manual del programa que le indiquemos como parmetro. Por defecto esta documentacin es
mostradautilizandoelprogramaless,conelcualpodemosdesplazarnoshaciaadelanteyhaciaatrs
conlasteclasdeAVPGyREPG,buscarunapalabraconelcarcter/seguidodelapalabray
3
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.
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:
1.4.2. Igualandoceroomscaracterescon*
El carcter especial * iguala cero o ms caracteres. Por ejemplo, los archivos listados
5
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]*
[!AZ]*
Igualalosarchivosquenocomiencenporunaletramayscula
13.Sitateentuhome
14.Listartodoslosarchivosqueempiecenpors,
15.Listartodoslosarchivosquecontenganunaa
16.Listartodoslosarchivosqueempiecenpora'opor``b''y
quecontengancualquierotracadena.
1.4.4. Abreviandonombredearchivoscon{}
Elusodelasllaves({}),solasocombinadasconlosanteriorescaracteresespeciales(?,*,[]),nos
6
vanapermitirformasexpresionesdenombresdearchivosmscomplejas.Lasllavescontienenuna
listadeunoomscaracteresseparadosporcomas.Cadatemdelalistaseutilizaenturnopara
expandirunnombredearchivoqueigualalaexpresincompletaenlaqueestninmersaslasllaves.
Porejemplo, a{f,e,d}b seexpandeen afb,aeb y adb,enesteordenexactamente.Las
llavessepuedenutilizarmsdeunavezenunaexpresin.Laexpresin s{a,e,i,o,u}{n,t}se
expandeensan,sen,sin,son,sun,sat,set,sit,sotysut.
1.5. Bsqueda
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.
17.Busca todos los archivosqueempiecenpormeneldirectorio
/usr/bin
18.Buscalalocalizacindelcomandols
1.6. Tiposycontenidosdeficheros
Utilizarlaextensinparadeterminareltipodeunarchivonoesunsistemamuyeficazyaque
cualquierapuedecambiarlaygenerarconfusionesyerroresenelsistema.
Losarchivosquetenemosennuestrosistemapuedenserdemuchostiposdiferentes:ejecutables,
detexto,dedatos,etc.Adiferenciadeotrossistemas,queutilizanlaextensindelarchivopara
determinar de qu tipo son, GNU/Linux utiliza un sistema denominado de magic numbers,
determinandoconunnmeromgicoeltipodeficherosegnsusdatos.Elcomando file noslo
indica.
Sinecesitamosverelcontenidodeunfichero,unodeloscomandosmsbsicosesel cat.
Pasndoleelnombre/sdelarchivo/squequeramosver,sencillamentesemuestraporpantalla.
$/tmp/prueba$catpractica_1.txt
p1
Otrotipodecomandomuytilsonlosquenosbuscanunciertopatrnenelcontenidodelos
ficheros.Conelcomandogreplepodemospasarcomosegundoparmetroelnombredelarchivoy
comoprimeroelpatternquequeramosbuscar.
Buscalapalabraprintfentodosl
losarchivosacabadosen.c
$gr ep p*.txt
practica_1.txt:p1
practica_2.txt:p2
practica_3.txt:p3
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.
Comando
Descripcin
Comando
Descripcin
apropos
informasobreuncomando
locate
bsquedadeficheros
cat
visualizaelcontenidodeun
fichero
ls
listaelcontenidodeundirectorio
cd
cambiadedirectorio
man
enseaelmanualsobreun
comando
cmp,diff
comparaficheros
mdkir
creaundirectorio
cp
copiaarchivos
more
igualacat
chgrp
cambiaelgrupodeunarchivo
mv
muevearchivos
chmod
cambialospermisosdeun
archivoodirectorio
pwd
muestraeldirectorioenquenos
encontramos
chown
cambiaelpropietariodeun
archivo
rm
borraarchivos
file
indicaeltipodefichero
rmdir
borradirectorios
find
bsquedadeficheros
tail
visualizanlineasdelfinaldel
fichero
grep
buscaunpatrnenunfichero
umask
cambialospermisospordefecto
deunarchivoalsercreado
head
visualizanlineasdelcomienzo
delfichero
wc
cuentalneas/palabras
info
idemmanperomsextenso
whatis
brevereferenciasobreun
comando
less
igualacat
whereis
bsquedadearchivosbinarios
Tabla1.2:Comandosmsusuales
11
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
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
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
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
Lospropiosshellsecomportancomounaorden,esdecirsepuedenejecutar.
Miradequeshellsdisponeelsistemayentraenalgunadeellas.
Entrarenunashell=nombredelashell(lasshellseencuentran
en/bin/)
Salirdeunashell=exit,oCtrl+D
2.3. Unasesindetrabajo
Cuandoarrancamoselsistema,trasmuchosmensajesdeinicializacin,apareceunapantalla
grficaquenospedirlassiguienteinformacin
login:i62xxxx
password:
Porejemplo,siqueremosverquehaceycualessonlasopcionesdelaordenls,quelistael
contenidodeundirectorio,podemosejecutar
16
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
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
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.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
psu#procesosdeunusuarioespecificado
psl#formatolargo
pso#formatodefinidoporelusuario,...
ps,sinopcionesniargumentos,dainformacinsobrelosprocesosdelasesinactual.
Muestra los porcentajes de uso de la CPU de los procesos del
sistema
Pruebaelcomandotop
Elcomandokillnospermiteenviarsealesalosprocesosquenosinterese.Haymuchostipos
diferentesdeseales,quepodemosverenelmanualdekill,aunquelasmsutilizadassonlasque
nossirvenparaobligaraunprocesoaquetermineopausesuejecucin.ConCTRL+Zpodemos
pausarunprogramayrevivirlocon fg.Siqueremosqueelprocesoseejecuteensegundoplano
utilizaremosbg.
comando&
ctr+z
fg<idproceso>
bg<idproceso>
kill<idproceso>
2.4.2. Metacaracteressintcticos
Unavezaprendidocomoutilizaralgunosdeloscomandosdelsistema,esmuyprobablequeen
algunos casos nos interese utilizarlos de forma simultnea para agilizar ms las acciones que
queramosrealizar.Losmetacaracteressintcticosnosayudanenestesentido.
SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran
una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 2.1
muestraestoscaracteresydaunadescripcindesufuncin.
21
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
$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
$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
sistema,y la orden wc,quenos permiteconocercuantaslneas,palabrasycaracteres, tiene el
archivo que se pasa como argumento. Por ejemplo, las siguientes rdenes tienen resultados
diferentes:
$date;who|wc#ejecutadate;ejecutawhocuyasalidapasaawc
WedOct1110:12:04WET1995
1531
$(date;who)|wc#ejecutadateywho,sussalidassepasanawc
24
21264
Porqu?
Ejecutandoordenesensegundoplanocon&
Linuxpermitedosformasdeejecucinderdenes:
rdenesnoaparecehastaquehafinalizadolaordenquemandamosejecutar.Porejemplo,
lasrdenesquehemosejecutadohastaahora.
Ejecucinensegundoplano(background):enestesegundocaso,elindicadorreaparece
$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]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
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]]
[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
kill
Laordenkillenviaunasealaun(os)proceso(s).Tienedosformas:
kill[sig]{pid|%job}...
killl
Laaccinpordefectodekillesenviarlasealdefinalizaralproceso(s)indicado(s)porPIDo
nmerodejob.Lasseales, sig,seindicanpornmerosonombres.Conlaopcin l,listalos
nombresdelasealesquepuedenserenviadas.
LassealessonenLINUXelmediobsicoparanotificardelaocurrenciadeeventosalos
procesos.Porejemplo,laspulsaciones<CTRL>C,<CTRL>Z,etc.loquehaceenrealidades
provocarqueelmanejadordetecladogeneredeterminadassealesquesonenviadasalprocesoen
ejecucin.Tambin,seenvansealescuandounprogramareferenciaunadireccininvlida(p.e.
unpunteronoinicializado)delproceso.Enestecaso,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
>nombre
Redireccionalasalidadeunaordenparaescribirenelarchivo
nombre.Sinombreexiste,losobreescribe.
2>nombre
Redireccionaelerror(stderr)aunfichero.Sinombreexiste,lo
29
Metacarcter
Descripcindelafuncin
sobreescribe.
>&nombre
>>nombre
Lasalidadelaordenseaadealfinaldelarchivonombre.
2>>nombre
Lasalidadestderrseaadealfinaldelarchivonombre
>>&nombre
Aadelasalidadestderr,combinadaconstdoutylasaadeal
finaldenombre.
Creauncauceentredosrdenes.Lasalidaestndardelaorden
alaizquierdadesmboloseconectaalaentradaestndardela
ordendeladerechadelsigno.
|&
Creauncauceentredosordenes,conlassalidasde stderr y
stdout delaordendelaizquierdacombinadasyconectadas
conlaentradadelaordendeladerecha.
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
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.
$ls>temporal
# El resultado de ls se almacena en
temporal
$cattemporal
archiv1
practicas
proyecto
$cattemporil#Suponemosquetemporilnoexiste
cat:temporil:Noexisteelficherooeldirectorio
$cattemporil>errores
cat:temporil:Noexisteelficherooeldirectorio
Observamos,comosiguesaliendoporpantallaelmensajeaunquetenemosredirigidalasalida
estndaraunarchivo.Estosedebeaque,comodijimosantes,algunasrdenesgeneraninformacin
porelerrorestndar,nosloporlasalidaestndar.Porello,debemosutilizarlaredireccin2>o
&>paranoseguirvindoloporpantalla.
$cattemporil2>errores
$caterrores
ca:temporil:Noexisteelficherooeldirectorio
$_
31
Redireccindeentradadentrodeprogramascon<<
Elmetacarcter << nospermiteredireccionarlneasdesdeunprogramaalaentradadeuna
orden dentro del programa. La redireccin se realiza mediante un mecanismo conocido como
documentacinaqu.Estaredireccinpermiteescribirmensajesmultilneadesdeunprogramasin
necesidaddeusarmltiplesrdenesecho.
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
Algomssobrecaucesyredirecciones
Sideseamosmezclarlosmecanismosdecaucesyredireccionamiento,encontramosqueelnico
lugardondelaredireccindearchivosseacomodadentrodeuncauceesalfinaldelaltimaorden
delcauce.Enestecaso,podemosusarlaredireccindelasalidaparacapturarlasalidafinalenun
archivo. Si intentsemos redireccionar la salida de una orden al principio o en medio de un
encauzamiento,todos losdatos irn alarchivoynada fluir atravs del restodelcauce. Para
permitirintroducirredireccionamientoencualquierordendeuncauce,existelaorden tee quea
partirdeunflujodeentradadesdoblasteendos:unodeellospuedeirredireccionadoaunarchivo
yelotroalcauce.Conlaredireccindestdinpasaalgosimilar,slopodemosusarlaenlaprimera
ordendelcauce.Silausamosenmedio,seignoralainformacinquefluyeporelcauce.
tee<opciones><fichero>
Archivosdedispositivosyredirecciones
En Linux, el directorio /dev contiene los archivos de dispositivos y pseudodispositivos
(dispositivoslgicosquenosecorrespondenconundispositivohardware).Unodeestospseudo
dispositivoses/dev/nullqueactacomounsumiderodeinformacin,deformaquetodoloquesele
enva es descartado por el sistema y, por tanto, podemos enviarle la informacin que no
necesitemos.Porejemplo,laorden time ejecutaotraordenpasadacomoargumentoynosdalos
tiemposdeejecucindelamisma(modokernel,usuarioytiempodereloj).
$timels
COORDINA.PSarchsurvey.pscomplete.wavwoods.ps
real0m0.003s
user0m0.001s
sys0m0.002s
Comovemos,timemuestraelresultadodeejecutarlaordenlsyeltiempodeejecucin.Sino
estamosinteresadosenelresultadodels,podemosdescartarlaenvindolaa/dev/null.Nota:como
se puede observar los tiempos de ejecucin siguen vindose en pantalla aunque hemos
redireccionadolasalidaestndar.Estosedebeaquelostiempossalenporelerrorestndar.
33
%timels>/dev/null
real0m0.003s
user0m0.001s
sys0m0.002s
2.6. Empaquetadoycompresindearchivoscontarygzip
Comprimirunarchivo,agruparvariosenunosolooverqucontieneunarchivocomprimido
sontareasqueutilizaremosfrecuentementeparahacercopiasdeseguridad,transportararchivosde
unsitioaotro,etc.Aunqueexistenmultituddeprogramasdiferentesquenospermitenhaceresta
clasedeoperaciones,generalmenteentodoslossistemasUNIXencontraremoslaherramientatar.
Esteprogramanospermitemanipulardecualquierformaunoovariosarchivosparacomprimirlos,
agruparlos,etc.
Aunqueconelmismo tar podemoscomprimirarchivos,laaplicacinensmismanoesde
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
gunzip,bzip2d,bunzip2,
Veamosalgunosejemplos.
$gziparchivo1archivos.gz
$bzip2archivo2archivos2.bz
Podemosdescomprimirlosarchivosenlasalidaestndarenlasdosformassiguientes:
$gunziparchivos.gz
$bzip2darchivos2.bz
fEspecificaelarchivoenelquesecrearelpaquete
xExtraelosarchivosdelpaquete
vUtilizaenmodoverboso
35
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
37
2.7.- Ejercicios
2.7. Ejercicios
1.Desplzatehastaeldirectorio/binygeneralossiguienteslistadosdearchivos(siemprede
laformamscompactayutilizandolosmetacaracteresapropiados):
a) Todoslosarchivosquetengancomoterceraletradesunombreunaa
b) Todoslosarchivosquenocomiencenporunaconsonante
c) Todoslosarchivosquequecontenganunnmeroporda,df
d) Todoslosarchivosquecomiencenporbyacabenenunnmero
2.Construyelasiguienteestructuradedirectorios
Mail
Inbox
SPAM
Local
Sent
2006
SO
IA
EDI
ylossiguientesficherosdetextoconcontenidodetuinvencin.
Situadoeneldirectorio
SPAM
Nombredelfichero
banco.eml
compraTelefono.txt
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
b) Utilizalaorden find paraencontrartodoslosficheroscuyonombrecontengala
cadenafono
c) Utilizalaorden find paraencontrartodoslosficheroscuyonombrecontengala
cadenanot
d) Utilizalaorden find ysuopcinexecparamostrarelcontenidodelosficheros
cuyonombrecontengalacadenaeml.
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).
5.Construya un archivo llamado agenda.txt en el directorio INBOX y configure sus
privilegiosdeacceso,detalmodo,queelusuariopuedaleeryescribir,elgrupopuedaleery
losotrosnopuedanhacernada.
6.Sin utilizar un editor de texto grfico, crea, en el directorio SO, un fichero llamado
notas.txtcon10lneas,cadaunadelascualestengaesteformato:
NombreDNICalificacin
7.Visualicelaprimeraylassieteltimaslneasdelarchivonotas.txt
39
2.7.- Ejercicios
8.Creaunalneaderdenesparaeliminartodaslaslneasduplicadas,menosuna,delarchivo
telefonosClase.eml
9.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. 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
La orden history muestraunalistadelasrdenesdelahistoriaderdenes;cadaorden va
42
precedidadeunnmeroqueindicalaocurrenciadelamismaenlahistoria,empezandopor1para
laordenmsantigua.Ennuestrocaso
$bash$ history
1echo$SHELL
2ls
3psax
4find.name*.txt
5history
history[opciones]
N:mostrarnicamentelasNltimaslneasdelhistrico
c:borrarlalistahistrica
Pruebaelcomandohistory.Quocurresilolanzasendiferentes
terminales
Almacenandolahistoriaderdenes
Cuandoabandonamosunashell(bienutilizandoelcomando exit ocerrandoelterminal),las
rdenesquesehayanejecutado(listadohistrico)seguardanenelarchivohistrico.Larutadeeste
archivoseencuentraalmacenadaenlavariable$HISTFILE;elarchivohistricopredeterminado
sueleser~/.bash_history.
Repitiendordenesconeleditorderdenes
Enelbash,podemosutilizaruneditorderdenespararecuperaryejecutarrdenes.Conlas
flechasarribayabajodelteclado,podemosmovernoshaciaadelanteyhaciaatrsenlahistoriade
rdenes.Cadaordenvaapareciendoenpantallasegnlarecuperemosconelcursorsituadoalfinal.
Podemospulsar<RETURN>paraejecutarla<CONTROL>Cparacancelarla.Tambin,podemos
editarlasrdenesparareciclarlas.Utilizandolasflechasizquierdayderechapodemosmovernospor
lalnea(ordenrecuperada)yborraroinsertarparamodificar,segnnuestranecesidad,laorden
recuperada.
43
Expansinhistrica:repitiendordenesconelsignobang(!)
Otraformaparareutilizarrdenesesusarelsignodeadmiracin,denominadobang.Lasformas
pararecuperarunaordenson:
!numeroorden#Invocaunaordenconocidasuposicinenlahistoria
!!#Invocalaltimaordenejecutada
!n#Invocalaordensituadanlugaresatrsenlahistoria
!cadena_texto#Invocalaordenquecomienzaporcadena_texto
!?cadena_texto[?]#Invocalaordenquecontienecadena_texto
Supongamosqueestamosenlaorden6,diferentesformasdeinvocarlaorden4(find.name
*.txt)son:
$bash$!4#Damoselvalorabsolutolaposicinenlahistoria
$bash$!2#Damoslaposicinrelativaenlahistoria
$bash$!fi#Ejecutamoslaordenquecomienzapor"fi"
$bash$!?in#Ejecutamoslaordenquecontienelasubcadena"in"
Enelltimoejemplo,indicamosquequeremoslaordenmsrecientequecontieneeltextoin
encualquierpartedelacadenadelaorden.
Podremosseguiraadiendotextoaunaordenanteriorsifinalizamosconuna ?.Delejemplo
anterior,reutilizamoslaescrituradelaorden2(ls)paramodificarlasopciones!?ls?l
lsl
Modificacindeusocomnparalaexpansindellistadohistrico
Laspalabrasdelaordenseleccionadasenumerandetalmodoquelaprimera(nombredela
orden)tieneelnmero0,ylasdemspalabrassenumeranconsecutivamenterespectoalaanterior.
Sepuedeemplearunindicadordepalabraparaidentificarlapalabraopalabrasdeseadasdentrode
laordenoeventoseleccionado.Elsignodospuntos(:)seinsertaentreelindicadordelsucesoyel
indicadordepalabra.
!or den [:pala bra]
44
Indicador
Significado
Ejemplo
Palabra0(orden)
oLaordengcc
LaNsimapalabra
2Latercerapalabra(o)
Lapalabra1delaorden
^Lapalabraserlab1.c
Laltimapalabradelaorden
$Lapalabralab1
Todalaspalabrassalvoelnombredelaorden
*Laspalabraslab1.c,oylab1
N1N2
ElintervalodepalabrasdesdeelnmeroN1alN2 23Laspalabrasoylab1
Tabla3.1:Indicadoresdepalabra
Los modificadores cambian la forma en la que el evento actual es tratado. Algunos de los
modificadoresmstilesaparecenenlaTabla3.2(elrestopuedenconsultarseenelmanualenlnea
sobrehistory).
Modificador
Descripcin
Imprimeelresultadodeunaordensinejecutarla
Eliminalarazdelnombredearchivo
Eliminalaextensindelnombredearchivo(partequesigue
alpunto)
Sequedaconlacabeceradelaruta(todomenoselltimo
componente)
Sequedaconelfinaldelaruta(ltimocomponente)
Tabla3.2:Modificadoresdelareferenciasdelahistoria
45
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
Evitaquelacadenadecaracteresencerradaentredoblescomillas
seainterpretadacomometacaracteres.
'
Eludirmetacaracterescon\
Cuandoelshellprocesaunaorden,loprimeroquehaceessustituirlosmetacaracteresporsus
respectivosvaloresparaqueenlaejecucinaparezcanlosvaloresreales,nolosmetacaracteres.
"Eludir" metacaracteres significa evitar su interpretacin por el shell, de forma que stos
permanezcanenlalneaderdenesparaserprocesadosenlaejecucin.
48
3.3.- Metacaracteres
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
>nombre
Redireccionalasalidadeunaordenparaescribirenelarchivo
nombre.Sinombreexiste,losobreescribe.
&>nombre
2>nombre
Lasalidadestderrseescribeennombre
>>nombre
Lasalidadelaordenseaadealfinaldelarchivonombre.
&>>nombre
Creauncauceentredosrdenes.Lasalidaestndardelaorden
alaizquierdadesmboloseconectaalaentradaestndardela
ordendeladerechadelsigno.
Tabla3.6:Metacaracteresdeentrada/salidaodedireccin
3.3.5. Metacaracteresdeexpansin/sustitucin
Losmetacaracteresdeexpansin/sustitucinactancomoindicadoresespecialesparaelBash.
LaTabla3.7muestraloscuatrometacaracteresdeestetipo.
50
3.3.- Metacaracteres
Metacarcter
Descripcindelafuncin
Indicalasustitucindevariables.Unapalabraprecedidade$se
interpretacomovariable,y$palabrasesustituyeporsuvalor.
Indicadordesustitucindehistoria(historiaderdenesenbash).
Precedealosmodificadoresdesustitucin.
Tabla3.7:Metacaracteresdeexpansin/sustitucin
Estosmodificadoresnoshanidoapareciendoalolargodelosguiones,veamosquesignifican:
"$" sirveparaindicaralshellquesustituyaunavariableporsuvalor; "!" eselindicadordela
historiaderdenes;ylos ":" separanlaordendelosdesignadoresdepalabraenlahistoriade
rdenes.
3.4. Losalias
3.4.1. Definicinyeliminacindealias
Unaliasesunnombremscorto(seudnimo)parauncomandoqueusamosmuyamenudo.El
mecanismodealiaspermiteadaptarelcomportamientodelasrdenesLINUXcuandoseejecutan.
Essimilaralacapacidaddedefinicindemacrosenotroslenguajes.EnBash,laorden alias,se
encargadecrearunseudnimoparaunaorden.
alias[nombre_alias]=[definicin_orden]
Asociaunnombre_aliasconladefinicin_orden.
$bash$ aliasdir=lsl#asignaalslelnombrededir
Cuandoveamosqueyanonosestilladefinicindeunalias,podemosborrarlasinsalirdel
sistema.Lasintaxises
unaliasnombre_alias
dondenombre_aliaseselnombredelaliasquesevaaborrar.
51
3.4.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
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
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,...).
Porcontra,las variablesdefinidasporelusuarioolocales nosepasandeunosprocesosa
otrosysuscontenidossedescartancuandosalimosdelshellenelcualsedefinieron.
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
Muchasvecesel prompt nosayudaasaberenquemquinaestamossituados,estoestil,por
ejemplo,cuandotenemoslacostumbredehacermuchostelnetosshaotrasmquinas.Enestecaso,
podemosusarlaopcin\Hquenosdaelnombredelamquinadondeestamossituados,olaopcin
\hquenosdaelnombredelamquinaslohastaelprimerpunto:
~$ PS1='\h\w\$'
rabinf1 41~$ PS1='\H\w\$'
rabinf1 41.uco. es~$
57
3.5.- Variables
Mostrarelnombredelusuario
Laopcin\unosmuestraelusuarioconelqueestamosconectados.Esteesunpromptbastante
til:
rabinf1 41.uco. es~$ PS1='\u@h:\w\$
mluq ue@r abinf1 41:~$
Apartedelpromptbsico(suvalorseobtienedelavariablePS1)quenosindicasilalneade
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
$bash$ ./ejem plo2
FulanitodeCopas(asignadoentrecomillas)
Siloasignosincomillaspasaesto:
./demo04.variables:line7:de:commandnotfound
Alasignarunacadenaquecontieneespaciosaunavariable,sinutilizarcomillas,nosdaunerror.
Otroejemploconvariables
#!/bin/bash
#Ejemplo3:asignacindevariables
echon"Asignosincomillasaunavariablelacadena
demo*ylaescribo"
nombre=demo*
echo$nombre
echonAsignoahoraconcomillaslamismacadenayescribo
lavariable"
nombre=demo*
63
3.6.- Scripts
echo$nombre
El script anteriordacomoresultadodelprimerecho,unlistadocontodoslosarchivosque
empiezancondemo,ycomoresultadodelsegundoecho,lacadenademo*
mluq ue@r abinf1 41:/tm p/bash $./ej em pl o3
Asignosincomillasaunavariablelacadenademo*ylaescribo
demo01.hola_mundodemo02.hola_mundodemo03.entorno
demo04.variablesdemo04.variables~demo05.variables
Asignoahoraconcomillaslamismacadenayescribolavariable
demo*
Porqu?
3.6.3. Pasodeargumentosalosscripts
Enocasiones,puedesertilquenuestrosscriptsrecibanalgntipodeargumento(undirectorio
sobreelqueactuarountipodearchivoquebuscar)alserejecutados.Parahacerreferenciaaestos
argumentos,dentrodelosscriptsseempleanunaseriedevariablesquesiempreestarndisponibles,
los parmetrosposicionales $1,$2,$3,..., ,siendo $0 elnombredelpropioprograma.Reciben
estenombreporqueselesreconoceporsuubicacin,esdecirelprimerargumentoes$1,elsegundo
$2yassucesivamente.
Porejemploimaginemosquecreamoselscriptsiguiente:
#!/bin/bash
#Ejemplo4:scriptquerecibeparmetrosylosimprime
echo"Elscript$0"
echo"Recibelosargumentos$1$2"
64
3.6.- Scripts
Nosepuedemodificarelvalordelasvariablesposicionales,slosepuedenleer;sise
intentaasignarlesunvalorseproduceunerror.
Sielargumentoposicionalalquealudimosnosepasacomoargumento,entoncestieneelvalor
nulo.
#!/bin/bash
#Ejemplo5:scriptquerecibeparmetrosylosimprime
echo"Elscript$0"
echo"Recibelosargumentos$1$2$3$4"
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
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. PROGRAMACINBASHI
4.1. Variablescontipo
Hastaahoratodaslasvariablesquehemosusadosondetipocadenadecaracteres.Aunqueenlos
primerosshellslasvariablesslopodancontenercadenasdecaracteres,despusseintrodujola
posibilidaddeasignaratributosalasvariablesqueindiquen,porejemplo,quesonenterasodeslo
lectura.Parafijarlosatributosdelasvariables,tenemoselcomandointernodeclare,elcualtienela
siguientesintaxis:
declare[opciones][nombre[=valor]]
Descripcin
Lavariableesdetipoarray
Mostrarelnombreeimplementacindelasfunciones
Mostrarsloelnombredelasfunciones
Lavariableesdetipoentero
Lavariableesdeslolectura
Exportalavariable(equivalenteaexport)
Tabla4.1:Opcionesdelcomandointernodeclare
Siescribimosdeclaresinargumentos,nosmuestratodaslasvariablesexistentesenelsistema.
Siusamosla opcinf, nosmuestraslolosnombresdefunciones(lasveremosenlaprctica
siguiente)ysuimplementacin,ysiusamosla opcinF,nosmuestraslolosnombresdelas
funcionesexistentes.
71
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
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
expanden(sesustituyenlasvariablesporsusvaloresenlaexpresin)ysetraducenaltipoentero
largoantesdeefectuarlaevaluacindelaexpresin.
4.2.1. Expansindelshell$((expresin))
Paraqueelshellevaleunaoperacinaritmticaynolatomecomoargumentosdeuncomando,
lasexpresionesaritmticasdebernirencerradasentre$((y)).
$((expresin))
Lasexpresionesaritmticas,aligualquelasvariablesylasustitucindecomandos,seevalan
dentrodelascomillasdoble().
Basndonosenelcomandodate+%j,quenosdevuelveelnmerode
da Juliano, hacer un script que nos diga cuantos das quedan
hastaelprximo31deDiciembre.
Elcomandosepuedeimplementarrestandoa365daselnmerode
dastranscurridosas:
$bash echo "$( ( 365 $(dat e +%j ) )) dias par a el 31 de
Dic"
EnlaTabla4.2,semuestranalgunosdelosoperadoresaritmticossoportadosporBash.
Operador
Descripcin
Suma
Multiplicacin
Resta
Divisinentera
Restodeladivisinentera
()
Agruparoperaciones
**
Potencia
Tabla4.2:OperadoresaritmticosadmitidosporBash
74
4.2.2. SimilitudconlasexpresionesaritmticasC
LasexpresionesaritmticasdeBashsehandiseadodeformaequivalentealasexpresionesde
C.Porejemplo$((x+=2))aade2ax.
Aunquealgunosoperadores(p.e.*olosparntesis)soncaracteresespecialesparaBash,nohace
faltaprecederlosporelcarcterdeescapesiemprequeestndentrode $((...)).Igualmente,alas
variablesqueestndentrodelaexpresinaritmticanohacefaltaprecederlaspor$paraobtenersu
valor.
Bash,adems,nospermiteusarlosoperadoresrelacionales(<,>,<=,>=,==,!=)ylgicosdeC
(!,&&,||)interpretando,aligualqueC,el1comociertoyel0comofalso.
4.2.3. Elcomandointernolet
El comando interno let nos permite asignar el resultado de una expresin aritmtica a una
variable.Tienelasiguientesintaxis:
letvar=expresion
expresionescualquierexpresinaritmticaynonecesitaestarencerradaentre$((...)).
Elcomando let,adiferenciadelcomando declarei,nocreaunavariabledetipoentero,sino
unavariabledetipocadenadecaracteresnormal.Porejemplo:
$bashleta=4 *3
$bashdeclarepa
declarea="12"
Vemosqueaesdetipocadena,mientrasquesiusamosdeclareinoslacreadetipoentero:
$bashdeclareia=3
*4
$bashdeclarepa
declareia="12"
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.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?
Para ello podemosusar lavariableespecial ?,cuyovalores $?,yqueindicaelcdigo de
terminacindelltimocomandoejecutadoporelshell.Porejemplo:
$bashcddire rroneo
bash:cd:direrroneo:Nosuchfileordirectory
$bashecho$?
1
Alhaberfalladoelltimocomando $?vale1.Sinembargo,sielcomandoseejecutabien $?
valdr0:
$bashcddirexi stent e
77
$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
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.
Usandolos test condicionales podemosevaluaratributosdeunfichero(siexiste,quetipode
ficheroes,quepermisostiene,etc.),comparardosficherosparavercualdeellosesmsreciente,
comparar cadenas, e incluso comparar los nmeros que almacenan las cadenas (comparacin
numrica).
79
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
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
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
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
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
#!/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
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
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
queusaelbucle for paralavariablelistaeselqueindiquemosen IFS,ypordefectoeste
delimitadoreselespacio,aunqueenocasionesconvienecambiarlo.
Elejemplosiguienterecorredosveceslosargumentosdeunprogramacon$*.Laprimeravez
usamoscomodelimitadorelvalorpordefectodelavariableIFS(elespacio)ylasegundavez
cambiamoselvalordelavariablesIFSparaqueeldelimitadorseanlascomillasdobles().
86
#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
87
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
EstescriptemulalaestructurafordeC,Pascal,...
Otroejemploconuntil:
#!/bin/bash
i=20
88
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
while((expresionaritmtica))
do
cuerpo
done
4.6. Entradaysalidadetexto
Enesteapartadocomentaremosdetalladamenteloscomandos echo,printfyread,loscuales
nospermitenrealizarlasoperacionesdeentrada/salidaquerequiereunscript.
4.6.1. Elcomandointernoecho
Comoyasabemos,echosimplementeescribeenlasalidaestndarlosargumentosquerecibe.
LaTabla4.6muestralasopcionesquepodemospasarleaecho.
Opcin
Descripcin
Activalainterpretacindecaracteresprecedidosporelcarcterdeescape.
Desactivalainterpretacindecaracteresprecedidosporcarcterdeescape.Esla
opcinpordefecto.
Omiteelcarcter\nalfinaldelalnea(esequivalentealasecuenciadeescape\c).
Tabla4.6:Opcionesdelcomandoecho
LaTabla4.7muestralassecuenciasdeescapequeaceptaecho(cuandoseusalaopcine).Para
questastenganxitodebendeencerrarseentrecomillassimplesodobles,yaquesinoelcarcter
90
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
Elbucleserepitede0a9;sinembargo,siqueremoshacerlode0a100,estosecomplicayaque
estosnmerostienendistintonmerodedgitos.Parasolucionarlopodemosusar\rqueretornael
cursorenelterminalsinintroduciruncambiodelnea(comohace \n).El script quedaradela
siguienteforma:
for((i=0;i<10;i++))
do
echon"Procesado$i"
sleep1
echone"\r"
done
91
4.6.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
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
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
Rellenarcon0'salaizquierda
Precederpor0alosnmerosenoctal%oypor0xalos
94
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
Lasprincipalesopcionesdelcomandoread,seresumenenlaTabla4.10.
Opcin
Descripcin
Permiteleerlaspalabrascomoelementosdeunarray
Permiteindicarundelimitadordefindelnea
nmax
Permiteleercomomximomaxcaracteres
Permiteindicaruntextodeprompt
Tabla4.10:Opcionesdelcomandoread
Laopcindnospermiteindicarundelimitadordefindelneadeformaquelalneaseleehasta
encontrarestedelimitador.
Laopcin n nospermiteespecificarunnmeromximodecaracteresaleer.Siseintentan
escribirmscaracteresquelosindicadosenestaopcin,simplementeseacabalaoperacinde
lectura.
Laopcinpnospermiteaportaruntextodepromptalcomando,queseimprimeantesdepedir
eldato:
$bashread p"Cual estu nombre:"nombre
Cualestunombre:Fernando
96
4.7.- Ejercicios
4.7. Ejercicios
Todoslosscriptsplanteadosdeberntener
Uncomentariosalprincipioqueindiqueloquehace.
Comentariosalolargodelscriptparadocumentarloquesevahaciendo
1.CreaunscriptdenombrepositivoNegativo.shquepidaunnumeroportecladoydetermine
siespositivo,negativoocero.
2.Creaunscriptquesellamecopiar.shyqueaceptedosargumentos.Elprimerargumento
representaelnombredeunarchivoexistentecuyocontenidoqueremoscopiaryelsegundo
argumento es el nombre del fichero donde se copiar el contenido. El scritp copiar el
contenido del primer fichero en el segundo fichero, haciendo todas la comprobaciones
pertinentes
a) Elnmerodeargumentosalllamaralprogramadebeserelcorrecto,sinomandarun
mensajeindicandolasintaxiscorrecta.
b) Elficheroodirectoriodadocomoprimerargumentodebeexistir,sinoexistedebe
mandarseunmensajedeerroralusuarioyfinalizar.
c) El segundo argumento no debe corresponder con ningn archivo o directorio
existentes,siloes,sedebemandarunmensajealusuarioyfinalizar.
3.Desarrollaunscriptdenombrecal.shqueimplementeunacalculadoraconlasoperaciones
bsicas(suma,resta,multiplicacin,divisin,potencia).Nota:Sepuedehacerenmenosde
cuatrolneasdecdigo.
4.Escribeunscriptllamado sumaN.sh quepidaunnmero(N)eimprimaporpantallala
97
4.7.- Ejercicios
sumadelosNprimerosnmeros.
5.DesarrollaunscriptdenombreficheroDirectorio.shquerecibaunnmeroindeterminado
deparmetros.Elscriptdeberclasificarlosargumentossegnseanficherosodirectoriosy
guardarlosendosarchivos(fich.txtydir.txt).
6.Creaunscriptdenombre muestraLinea.sh querecibadosargumentosenlalnea de
rdenes;elprimeroserunficheroyelsegundounnmeron.Elscriptmostrarporpantalla
lalneanmerondelficheropasadocomoargumento.Silalneanoexistiese,elscriptdeber
mostrarelmensajecorrespondiente.
7.Hazunscriptllamado ocupaTxt.sh quedadoundirectoriocomoargumentonosdigael
tamaototaldelosficheroconextensin.txtquehayaenl.
98
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
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.
Aunqueelbuclede select esinfinito(locualnospermitevolverapedirunaopcincuantas
veceshagafalta),sepuedeabandonarusandolasentenciabreak.Lasentenciabreak,aligualque
enCyJava,seusaparaabandonarunbucleysepuedeusarenelcaso,tantodeselect,comodelos
100
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
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
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
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
[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
CosaCasaPerro
bash$ echo${C [@]}
CosaCasaPerro
bash$ echo"${ C[@]}"
CosaCasaPerro
bash$ echo"${ C[*]}"
Cosa,Casa,Perro
Aligualqueenlosparmetrosposicionales,podemositerarsobreloselementosdeunalista
usandounbuclefor:
forein${C[*]}
do
echo$e
done
Dondealser${C[*]}unacadenadecaractereshubiramostambinpodidousar${C[@]}o
"${C[@]}"perosihacemos"${C[*]}"loqueobtenemosesunacadenaconloselementosde
staseparadosporelvalordeIFS(comaenesteejemplo),ynoporespacio.Sinembargoelbucle
hubierafuncionadosiloselementosestnseparadosporelvalordeIFS,ydehechoenocasiones
(p.e.cuandoloselementostienenespacios)convieneutilizarestaltimasolucin.
Loselementosdeunalistaalosquenoseasignavalortienenunacadenanula,conloqueel
bucleanteriorsloimprimiraloselementosqueexistanenlalistaC.
Podemosconsultarlalongituddeunalistausandolaforma ${#lista[@]},donde lista esel
nombredelalista.Porejemplo,enelejercicioanterior:
bash$ echo${# C[@]}
3
Elejemploanteriornosdicequehaytreselementosaunquelosndiceslleguenhastaelndice7,
yaqueexistenposicionessinasignarenlalista.Elcomando # slonosdevuelveelnmerode
posicionesocupadas.
Tambindebemostenerencuentaquedentrodeloscorchetesvauna @,ynounndice.Si
106
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
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
${var:valor}
Sivarexisteynoesnularetornasucontenido,
sino,retornavalor.
${var:+valor}
Sivarexisteynoesnularetornavalor,sino,
110
Operador
Descripcin
retornaunacadenanula.
${var:=valor}
Sivarexisteynoesnularetornasucontenido,
sino,asignavaloravaryretornasu
contenido.
${var:?mensaje}
Sivarexisteynoesnularetornasucontenido,
sino,imprimevar:mensajeyabortaelscript
queseestejecutando(sloenshellsno
interactivos).Siomitimosmensajeimprimeel
mensajepordefectoparameternullor
notset.
${var:offset:longitud}
Retornaunasubcadenadevarqueempiezaen
offsetytienelongitudcaracteres.El
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
devuelvensucontenido,siqueremosmodificar var podemosusar ${var:=valor} queasignaun
valoralavariablesistaestindefinida.Porejemplo,${nombre:=Paco}asignaPacoala
variablenombresistanotienevalor.
Tambin podemos querer detectar errores producidos porque una variable no tenga valor
111
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
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
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
${var#patron}
Sipatroncoincideconeliniciodelvalordevar,
borralapartemspequeaquecoincidey
retornaelresto.
${var##patron}
Sipatroncoincideconeliniciodelvalorde
var,borralapartemsgrandequecoincidey
retornaelresto.
${var%patron}
Sipatroncoincideconelfinaldelvalordevar,
borralapartemspequeaquecoincidey
114
Operador
Descripcin
retornaelresto.
${var%%patron}
Sipatroncoincideconelfinaldelvalordevar,
borralapartemsgrandequecoincideyretorna
elresto.
${var/patron/cadena}
${var//patron/cadena}
Lapartemsgrandedepatronquecoincideen
varesreemplazadaporcadena.Laprimera
formasloreemplazalaprimeraocurrencia,yla
segundaformareemplazatodaslasocurrencias.
Sipatronempiezapor#debeproducirsela
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
Ejemplo
EnelmundodeGNUexistenunasherramientasllamadasNetPBM1quepermitenconvertir
entremuchosformatosgrficos.Laherramientasueleconvertirdeformatosconocidos(gif,bmp,
jpg) a un formato interno, o bien del formato interno a los formatos conocidos. Los formatos
internosqueutilizason .ppm (PortablePixelMap)paraimgenesencolor,.pgm (PortableGray
Map)paraimgenesenescaladegrises,y.pbm (PortableBitMap)paraimgenesformadaspor
bitsdeblancoynegro.Avecesestosformatosaparecenbajolaextensingeneral.pnm,queabarca
atodosellos.Nuestroobjetivoeshacerunscriptllamadobmptojpgquerecibaunoodosnombres
defichero,elprimerodetipo.bmp yelsegundodetipo .jpg.Sinosesuministraelsegundo
argumento,elnombredelficheroserelmismoqueeldelprimerargumentoperoconlaextensin
.jpg.PararealizarlasconversionesusaremosloscomandosdeNetPBMbmptoppmyppmtojpeg.
Loscomandosrecibencomoargumentoelficheroorigenyemitenporlasalidaestndarel
ficheroenelformatodestino.
Paraobtenerelprimerargumento,odarerrorsinosenossuministra,podemosusareloperador
:?as:
fichero_entrada=${1:?'faltaargumento'}
Paraobtenerlosnombresdeficherointermedioydesalidausamos:
fichero_intermedio=${fichero_entrada%.bmp}.ppm
fichero_salida=${2:${fichero_intermedio%.ppm}.jpg}
Obsrvesequeparaelnombredesalidausamoseloperador:paraquesinosehasuministrado
elsegundoargumentousemoselnombredelficherodeentrada,peroconlaextensincambiada.
Luegoelscriptquerealizaestaoperacineselsiguiente:
#Convierteun.bmpenun.jpg
fichero_entrada=${1:?'faltaargumento'}
fichero_intermedio=${fichero_entrada%.bmp}.ppm
fichero_salida=${2:${fichero_intermedio%.ppm}.jpg}
bmptoppm$fichero_entrada>$fichero_intermedio
ppmtojpeg$fichero_intermedio>$fichero_salida
116
5.6.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
Laopcinlhacequegrepdevuelvaslolosnombresdeficherodondehaencontradolapalabra
'bash'.
5.8. LosficherosdeconfiguracindeBash
Cadavezqueentramosanuestracuentaseejecutaelcontenidodelfichero/etc/profile,yluego
semiraaversieneldirectorio home existeelfichero.bash_profile,deserasseejecutasu
contenidoparapersonalizaraspectosdenuestracuenta.
Cualquierconfiguracinqueaadamosa.bash_profilenoserefectivahastaquesalgamosdela
cuentayvolvamosaconectarnos,sihacemoscambiosenesteficheroyqueremosverlossinsalirde
lacuentapodemosusarelcomandosource,elcualejecutaelcontenidodelficheroqueledigamos:
bash$ sour ce.ba sh_pr ofile
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
1.Creaunscriptdenombreopciones.shquepuedatenerunadeestasdossintaxis:
opciones.shofichero1fichero2
opciones.shfichero1fichero2
El script, en cualquiera de los dos casos, copiar el fichero1 en el fichero2,
comprobando que fichero1 existe y que fichero2 no existe. Si se utiliza para su
ejecucinlaprimerasintaxis(conlaopcino),elscriptcopiarfichero1enfichero2
peroordenandopreviamentefichero1.Utilizalasentenciashiftparacontrolarlaopcin.
2.Desarrolla el script mezclaFicheros.sh que reciba un nmero indeterminado de
parmetros. Los n primeros sern ficheros con el mismo nmero de lneas, y el ltimo
parmetroserelficherodesalida.Elscriptdebermezclarlaslneasdelos n primeros
ficherosyguardarlasenelficherodesalida.Elnmeromnimodeparmetrosaprocesarpor
elscriptserde3,noestandolimitadoelnmeromximo.Sifuerainvocadoconmenos
parmetrosmostrarelcorrespondientemensajedeerror.
3. Crea un script, de nombre ordenaParametros.sh, que enve ordenados a la salida
estndarlosparmetrosquerecibeporlalneaderdenes.Elnmeromnimodeparmetrosa
procesarporelscriptserde2,noestandolimitadoelnmeromximo.Sifuerainvocadocon
menosparmetrosmostrarenlasalidadeerrorestndarunmensajeenelqueseindiquela
120
5.9.- Ejercicios
formadeinvocarlo.
4. Realizaunscriptllamado menuFicheros.sh querecibacomoargumentounficheroo
directorio. El script, a travs de un men, realizar las siguientes operaciones sobre el
argumentorecibido:
a) Contarelnmerodeficherosquehayeneldirectorio.Sielargumentoqueselepasaes
unfichero,debermostrarelcorrespondientemensajedeerror.
b) Mostrareltamaodelfichero
c) Crearelfichero(antesdeberasegurarsedequenoexiste).
d) Mostrarinformacinsobreelfichero(nombre,permisosquetiene,propietario,...)
5.Crea un script de nombre cambiaExtension.sh que reciba como argumentos dos
extensiones. El script deber cambiar la extensin de todos los ficheros que tengan la
extensinpasadacomoprimerargumentoporlaextensinpasadacomosegundoargumento.
6.LosdirectoriosdebsquedaquealmacenalavariabledeentornoPATHavecesresultan
difcilesdeverdebidoaquecuestaencontrareldelimitadordospuntos(:).Escribeunscript
llamadoverpath.shquemuestrelosdirectoriosdelPATHunoencadalnea.
7.Hazunafuncinquerecibacomoparmetroelnombredeunficheroydevuelvaelnmero
depalabrasqueempiezanporAenl.Utilizaestafuncinenunscriptllamadofunciones.sh.
Elscriptpermitiralusuariointroducirnombresdeficherosportecladohastaquesemetauno
vaco;paracadafichero,mostrarelnmerodepalabrasquecomienzanconAutilizandola
funcinimplementadaanteriormente.
121