Está en la página 1de 125

COMANDOS SHELL Y

PROGRAMACIN EN LA SHELL
DEL BASH

SISTEMAS OPERATIVOS
I.T. INFORMTICA DE GESTIN
NDICE

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

I
NDICE

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

II
NDICE

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

III
1.- REPASO CONCEPTOS BSICOS DE UNIX/LINUX

1. REPASOCONCEPTOSBSICOSDEUNIX/LINUX

1.1. Elsistemadeficheros
Todosistemaoperativonecesitaguardarmultituddearchivos:desdelosdelaconfiguracindel
sistema,losdelog,losdelosusuarios,etc.Engeneral,cadasistemaoperativoutilizasupropio
sistema de ficheros, caracterizndolo en muchos aspectos como pueden ser el rendimiento,
seguridad,fiabilidad,etc.

Loprimeroquedebemostenerclaroesquetodoelsistemadeficherospartedeunamismaraz,
alacualnosreferiremosconelcarcter'/'.Eselorigendetodoelsistemadeficherosysloexiste
una. Para organizar los ficheros adecuadamente, el sistema proporciona lo que llamaremos
directorios(ocarpetas),dentrodelascualespodemosponerarchivosymsdirectorios.Deesta
formaconseguimosunaorganizacinjerrquicacomolaquevemosenlasiguientefigura:

Figura1.1:Sistemadearchivos

1
1.1.- El sistema de ficheros

Elcomandobsicoparacrearundirectorioesmkdir.Porsuparte,siqueremoscrearunarchivo
sepuedeutilizarcualquiereditordetexto,comosevermsadelante.

1.1.1. Movindonosporelsistemadeficheros
Para movernos por la estructura de directorios debemos utilizar los comandos para listar
contenidos y cambiar de carpeta. Si queremos ver lo que hay en el directorio donde estemos
situadospodemoslistarloscontenidosutilizandoelcomandols.Debemostenerencuentaquepor
defecto el comando nonos muestra losarchivos queempiezan por unpunto.Paracambiar de
directoriopodemosutilizarelcomando cd.Sinolepasamosningnparmetro,pordefectonos

situarennuestrodirectoriohome;silepasamoscomoargumentos..,nossituareneldirectorio
superior. Generalmente, se le suele indicar dnde queremos ir, pasndolo de forma absoluta o
relativa.Deformarelativasignificaquepartiremosdeldirectoriodondeestemosenelmomentode
ejecutar el comando. Por ejemplo, si estamos en el directorio /Directorio1/Directorio1_1/ y
queremosiral/Directorio3/,deberamosintroducirelsiguientecomando:cd../../Directorio3.
Deformaabsolutasiemprepartimosdelaraz,demaneraqueelcomandoqueutilizaramosparael
ejemploanteriorsera:cd/Directorio3.Parasaberenqudirectorioestamospodemosutilizarel

comandopwd.

1. Visualiceelcaminocompletodeldirectorioactual.
2.Visualicelosficherosdeldirectorioactual.
3.Cree la siguiente estructura de directorios dentro de su
directoriohome.

/curso0607

/pract1/pract2/pract3

2
1.2.- Manipulacin

1.2. Manipulacin
Ahora que ya sabemos movernos correctamente por la jerarqua de directorios tambin
necesitamossabercmocopiar,eliminarymanipularcorrectamenteotrosaspectosdelosficheros.
Elcomandormeselqueseencargadeeliminarlosarchivosqueleindiquemos.Paraeliminarun
directorio,podemosutilizarelcomandormdir,aunquesloloborrarcuandosteestvaco.Para
copiararchivosdeunlugaraotrotenemoselcomandocp,conelcualsiempredebemosindicarleel
ficheroodirectorioorigenyellugaronombrededestino,aunqueseaeneldirectorioactual.Sien
lugardecopiarlosarchivosqueremosmoverlosdesitiopodemosutilizarelcomando mv.Este
comandotambinseutilizapararenombrararchivos.

4.Crea en el directorio pract2 un archivo que se llame


apuntes.txtyotroquesellamaejercicios.txt
5.Escribealmenos5lneasencadauno
6.Copiaelficheroapuntes.txteneldirectoriopract3
7. Muevaelficheroejercicios.txtaldirectoriopract1
8.Borraelarchivoapuntes.txtdeldirectoriopract2
9.Borraeldirectoriopract2
10.Cmbialeelnombrealficheroapuntes.txpornotas.txt

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

3
1.3.- La ayuda del sistema

qparasalir.

Sihaymsdeunmanualdisponibleparaunamismapalabra,podemosespecificarlopasndole
el nmero correspondiente de la seccin deseada antes de la palabra, por ejemplo man 3

printf. Como los otros comandos, man tambin tiene multitud de opciones diferentes
documentadasensupropiomanualmanman.Unadeestasopcionesquenospuedeirmuybien
en las ocasiones que no sepamos exactamente el programa que estamos buscando es k' (el
comandoaproposhacecasiexactamentelomismo).Conmankseguidodeunapalabraque
haga referenciaalaaccinquequeramosrealizarse buscarpor entretodoslosmanuales del
sistemaysemostrarnlosqueensudescripcinonombreaparezcalapalabraindicada.Deesta
forma,podemosencontrartodolosqueramossintenerquerecurriraningnlibrooreferencia
externaalsistema.

Sielmanualnonosproporcionatodalainformacinquenecesitemostambinpodemosusarel
comandoinfo,queeslomismoqueelmanualperoanmsextendido.Silonicoquequeremoses
tenerunabrevereferenciadeloquehaceundeterminadoprogramapodemosutilizarelcomando
whatis.

11.Pidaayudasobreloscomandosmarcadosennegrita
12.Busquecomandosquepermitancomparar(cmp).

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

4
1.4.- Patrones (metacaracteres de sustitucin)

Metacaracter Descripcindelafuncin

? Comodnacualquiercarctersimple

* Igualacualquiersecuenciadeceroomscaracteres

[] Designauncarcterorangodecaracteresque,comounaclase,
sonigualadosporunsimplecarcter.Paraindicarunrango,
mostramoselprimeryelltimocarcterseparadosporunguin
().Conelsmbolo!indicamosnegacin.

{} Abreviarconjuntosdepalabrasquecompartenpartescomunes

~ Seusaparaabreviarelcaminoabsoluto(path)deldirectorio
home

Tabla1.1:Patrones

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

$ls lpr actica_1 .txt practica_ 2.txt p racti ca_3.t xt


rwrr1mluquemluque3Oct119:44practica_1.txt
rwrr1mluquemluque3Oct119:44practica_2.txt
rwrr1mluquemluque3Oct119:44practica_3.txt

$ls lpr actica_?. txt #Formamscompacta;cada?igualauncarcter.

rwrr1mluquemluque3Oct119:44practica_1.txt
rwrr1mluquemluque3Oct119:44practica_2.txt
rwrr1mluquemluque3Oct119:44practica_3.txt

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

5
1.4.- Patrones (metacaracteres de sustitucin)

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

RecordadqueenLinuxnoexisteelconceptodenombreyextensinalahoradenombrar
archivos.Elpuntoesuncarctermspermitidoenelnombredeunarchivo.

1.4.3. Igualandoceroomscaracterescon[]
Loscorchetesdefinenunalista,oclasedecaracteres,quesepuedenigualarconunslocarcter.
Acontinuacin,ilustramosalgunasformasdecaracterizargruposdearchivos:

[AZ]* Igualatodoslosarchivosquecomienzanconunaletramayscula.

*[aeiou] Igualacualquierarchivoquefinaliceconunavocal.

tema.*[13579] Igualalostemasquefinalizanconunnmeroimpar

tema.0[13] Igualatema.01,tema.02,tema.03.

[AZaz][09]* Iguala los archivos que comienzan con una letra (mayscula o
minscula),seguidadeundgito,yceroomscaracteres.

[!AZ]* Igualalosarchivosquenocomiencenporunaletramayscula

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

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

6
1.4.- Patrones (metacaracteres de sustitucin)

vanapermitirformasexpresionesdenombresdearchivosmscomplejas.Lasllavescontienenuna
listadeunoomscaracteresseparadosporcomas.Cadatemdelalistaseutilizaenturnopara
expandirunnombredearchivoqueigualalaexpresincompletaenlaqueestninmersaslasllaves.

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.

7
1.6.- Tipos y contenidos de ficheros

$/tm p/pr ueb a$f ile*


practica_1.txt:ASCIItext
practica_2.txt:ASCIItext
practica_3.txt:ASCIItext

14.Miradequetiposonlosarchivoscontenidoseneldirectorio
pract3
15.Averigua de que tipo son los archivos que empiezan por m en
/usr/bin

Sinecesitamosverelcontenidodeunfichero,unodeloscomandosmsbsicosesel cat.
Pasndoleelnombre/sdelarchivo/squequeramosver,sencillamentesemuestraporpantalla.
$/tmp/prueba$catpractica_1.txt
p1

Paraficherosmuyextensosnosirnmuchomejorloscomandos less o more,quepermiten


desplazarnosporelficherodeformaprogresiva.Sieltipodeficheroesbinarioyqueremosverqu
contienepodemosutilizarloscomandoshexdumpuodparaverelcontenidodeformahexadecimal
uotrasrepresentaciones.

16.Visualizaelcontenidosdelarchivopracticas.txt

Otrotipodecomandomuytilsonlosquenosbuscanunciertopatrnenelcontenidodelos
ficheros.Conelcomandogreplepodemospasarcomosegundoparmetroelnombredelarchivoy
comoprimeroelpatternquequeramosbuscar.

greppr intf *.c Buscalapalabraprintfentodosl

losarchivosacabadosen.c

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

8
1.6.- Tipos y contenidos de ficheros

Con cut podemossepararencamposelcontenidodecadalneadelficheroespecificandoqu


carctereselseparador,muytilentareasdeadministracindelsistemaparasuautomatizacin.De
igualforma,conpastepodemosconcatenarlalneasdediferentesficheros.Tambinpodemoscoger

undeterminadonmerodelneasdelprincipioofindeunarchivoconloscomandosheady tail
respectivamente.Con wc podemoscontarelnmerodelneasopalabras,lamximalongitudde
lneadeunfichero,etc.

17.Buscalaslabamaenelficheroapuntes.txt
18.Visualizalasprimeraslineasdelficheroasignatura.txt
19.Visualizalasultimaslneasdelficheroapuntes.txt

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

1.7. Permisos
Encualquiersistemaoperativomultiusuarionecesitamosquelosficherosqueguardamosen
nuestro disco puedan tener una serie de propiedades que nos permitan verlos, modificarlos o
ejecutarlosparalosusuariosquenosotrosdefinamos.Aunquehayvariasalternativasparahaceresto
UNIXutilizaelsistemaclsico,quecombinadocontodoslosmecanismosdegestindeusuariosy
grupos nos permite cualquier configuracin posible. La idea es definir, para cada fichero o
directorio,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

Para cambiarlospermisosdeundeterminadoarchivopodemosutilizarelcomando chmod.


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

Paracambiarelpropietariodeunfichero,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

visualizaelcontenidodeun
cat ls listaelcontenidodeundirectorio
fichero

enseaelmanualsobreun
cd cambiadedirectorio man
comando

cmp,diff comparaficheros mdkir creaundirectorio

cp copiaarchivos more igualacat

chgrp cambiaelgrupodeunarchivo mv muevearchivos

cambialospermisosdeun muestraeldirectorioenquenos
chmod pwd
archivoodirectorio encontramos

cambiaelpropietariodeun
chown rm borraarchivos
archivo

file indicaeltipodefichero rmdir borradirectorios

visualizanlineasdelfinaldel
find bsquedadeficheros tail
fichero

cambialospermisospordefecto
grep buscaunpatrnenunfichero umask
deunarchivoalsercreado

visualizanlineasdelcomienzo
head wc cuentalneas/palabras
delfichero

brevereferenciasobreun
info idemmanperomsextenso whatis
comando

less igualacat whereis bsquedadearchivosbinarios

Tabla1.2:Comandosmsusuales

11
2.- COMANDOS SHELL I

2. COMANDOSSHELLI

2.1. ElsistemaOperativoLinux
Linuxesun Unixlibre,esdecir,unsistemaoperativo,comoelWindowsoelMSDOS(sin
embargo,adiferenciadeestosyotrossistemasoperativospropietarios,hasidodesarrolladopor
milesdeusuariosdecomputadoresatravsdelmundo,yladesventajadeestosesqueloquetedan
esloquetuobtienes,dichodeotraformanoexisteposibilidadderealizarmodificacionesnide
sabercomoserealizdichosistema),quefuecreadoinicialmentecomounhobbieporunestudiante
joven,LinusTorvalds,enlauniversidaddeHelsinkienFinlandia,conasistenciaporungrupode
hackersatravsdeInternet.LinuxtenaunintersenMinix,unsistemapequeooabreviadodel
UNIX(desarrolladoporAndyTanenbaum);ydecididoadesarrollarunsistemaqueexcedilos
estndaresdeMinix.Querallevaracabounsistemaoperativoqueaprovechaselaarquitecturade
32bitsparamultitareayeliminarlabarrerasdeldireccionamientodememoria.

Torvaldsempezescribiendoelncleodelproyectoenensamblador,yluegocomenzaaadir
cdigoenC,locualincrementlavelocidaddedesarrollo,ehizoqueempezaraatomarseenserio
suidea.

Comenzsutrabajoen1991cuandorealizlaversin0.02,lacualnosedioaconocerporqueni
siquieratenadriversdedisquete,ademsdellevarunsistemadealmacenamientodearchivosmuy
defectuoso.Trabajconstantementehasta1994enquelaversin1.0delncleo(KERNEL)deLinux
seconcret.Actualmente,laversincompletamenteequipadaesla2.6.18.1(versindeoctubrede
2006),yeldesarrollocontina(sepuedenconsultarenkernel.org).

LinuxtienetodaslasprestacionesquesepuedenesperardeunUnixmodernoycompletamente
desarrollado: multitarea real, memoria virtual, bibliotecas compartidas, carga de sistemas a
demanda,compartimiento,manejodebidodelamemoriaysoportederedesTCP/IP.

LapartecentraldeLinux(conocidacomoncleookernel)sedistribuyeatravsdelaLicencia
PblicaGeneralGNU,loquebsicamentesignificaquepuedesercopiadolibremente,cambiadoy

12
2.1.- El sistema Operativo Linux

distribuido, pero no es posible imponer restricciones adicionales a los productos obtenidos y,


adicionalmente,sedebedejarelcdigofuentedisponible,delamismaformaqueestdisponibleel
cdigodeLinux.AncuandoLinuxtengaregistrodeCopyright,ynoseaestrictamentededominio
pblico,lalicenciatieneporobjetoasegurarqueLinuxsigasiendogratuitoyalavezestndar.

Por su naturaleza Linux se distribuye libremente y puede ser obtenido y utilizado sin
restriccionesporcualquierpersona,organizacinoempresasqueaslodesee,sinnecesidaddeque
tenga que firmar ningn documento ni inscribirse como usuario. Por todo ello, es muy difcil
establecer quienesson losprincipalesusuariosdeLinux.Noobstantesesabequeactualmente
LinuxestsiendoutilizadoampliamenteensoportarserviciosenInternet,loutilizanUniversidades
alrededor del todo el mundo para sus redes y sus clases, lo utilizan empresas productoras de
equipamientoindustrialparavendercomosoftwaredeapoyoasumaquinaria,loutilizancadenasde
supermercados,estacionesdeservicioymuchasinstitucionesdelgobiernoymilitaresdevarios
pases.Obviamente,tambinesutilizadopormilesdeusuariosensuscomputadorespersonales.El
apoyomsgrande,sinduda,hasidoInternetyaqueatravsdeellasehapodidodemostrarquese
puedecrearunsistemaoperativoparatodoslosusuariossinlanecesidaddefineslucrativos.

Linuxtieneunamascotaoficial,elpinginodeLinux,quefueseleccionadoporLinusTorvalds
pararepresentarlaimagenqueseasociaalsistemaoperativoquelcre.

BsicamentepodemosdecirquehoyLinuxesunsistemamuycompleto.ElproyectodeLinus
Torvaldsannohaterminado,ysepiensaquenuncaseterminarporstacontinuaevolucindela
Informtica.

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

13
2.1.- El sistema Operativo Linux

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

Figura2.1:LascapasdelsistemaUNIX

Elobjetivodenuestrasprcticasesaprenderamanejarlainterfazdeusuariomedianteelusode
rdenesyshell.

2.2. Losinterpretesderdenes
Unintrpretederdenes,oshellenlaterminologaLinux,estconstruidocomounprograma

normaldeusuario.Estotienelaenormeventajadequepodemoscambiardeintrpretederdenes

segnnuestrasnecesidadesopreferencias.Existendiferentesshells:elBourneAgainShell(bash),

elTCshell(tcsh),yelZshell.EstosshellsnosonexclusivosdeLinux,sedistribuyenlibrementey

puedencompilarseencualquiersistemaUNIX.Podemosverlosshelldelosquedisponenuestro

sistemamirandoenelarchivo/etc/shells.

Elshellesunprogramaquebsicamenterealizalassiguientestareas:
for(;;){
imprimeindicadorderdenes;
leelalneadeordenes;
analizalalneadeordenes(arg0,arg1,...,>,<,|,&,...);
preparaentornosegnloqueapareceenlneadeordenes;
creaunprocesoparaejecutarorden;

14
2.2.- Los interpretes de rdenes

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

Cadashell,ademsdeejecutarlasrdenesdeLINUX,tienesuspropiasrdenesyvariables,lo
queloconvierteenunlenguajedeprogramacin.Laventajaquepresentafrenteaotroslenguajeses
sualtaproductividad,unatareaescritaenellenguajedelshellsueletenermenoscdigoquesiest
escritaenunlenguajecomoC.

RespectoacuandoutilizarelshellycuandoutilizarotrolenguajedeprogramacincomoC,
indicarcomorecomendacingeneralquedebemosutilizarelshellcuandonecesitemoshaceralgo
conmuchosarchivos,odebamosdehacerlamismatarearepetitivamente.Nodeberamosusarel
shellcuandolatareaseamuycompleja,requieragraneficiencia,necesitedeunentornohardware
diferente,orequieradiferentesherramientassoftware.

Respecto alasrdenes,enelbash(elquenosotrosvamosautilizarenprcticas)podemos
encontrarlossiguientestipos:

1.Alias:sonabreviacionesparardenesexistentesquesedefinendentrodelamemoriadel

shell.

2.Ordenesempotradas:rutinasimplementadasinternamenteenelshell.

3.Programasejecutables:programasqueresidenendisco.

Cuandoelshellestpreparadoparaejecutarunaorden,evalaeltipodeordensegnelorden
queapareceenlalistaanterior:compruebasiesunalias;sino,siesunaordenempotrada;ypor
ltimo,unprogramaejecutable(enesteltimocasolaeficienciaesmenorpueshayqueaccedera
discoparalocalizarelejecutabledelaorden).Portanto,sitenemosunaliasconelmismonombre
queunprogramaejecutable,primeroejecutaraelalias.

15
2.2.- Los interpretes de rdenes

Lospropiosshellsecomportancomounaorden,esdecirsepuedenejecutar.

Miradequeshellsdisponeelsistemayentraenalgunadeellas.

Entrarenunashell=nombredelashell(lasshellseencuentran
en/bin/)

Salirdeunashell=exit,oCtrl+D

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

En este momento, el programa /bin/login verifica nuestra identidad comprobando el primer


campodelarchivo/etc/passwdquecontienenuestronombreusuario.Sinuestronombreestaall,
compara el passworddado,opalabracalve,conlaformaencriptadadelmismoquehayen el
archivo/etc/shadow.Unavezverificado,elprogramaloginestableceelentornodetrabajoquese
pasar alshell,esdecir,seasignanalasvariablesHOME,SHELL,USER,yLOGNAMElos
valoresextradosdelarchivo/etc/passwd.Despus,secreaelshelldeentradaologinshell,conlo
quepodemosiniciarlasesindetrabajo.

Lapalabraclavedebemantenerseensecretoparanuestraproteccinycambiarseconcierta
frecuencia(almenosdosvecesalao).Podemoscambiarlaclavedeaccesoconlaordenpasswd.

Unavezenelsistema,disponemosdeunmanualenlneaparaconsultarlasintaxisyopciones
de sus rdenes, e incluso algunos ejemplos de como se utiliza. El manual en lnea se puede
consultarconlaordenman,cuyasintaxises:

man[opciones][seccin]orden

Porejemplo,siqueremosverquehaceycualessonlasopcionesdelaordenls,quelistael
contenidodeundirectorio,podemosejecutar

16
2.3.- Una sesin de trabajo

manls

Slocomentarlaopcink quemuestralasseccionesqueestnrelacionadasconunapalabra
clave.Estaesmuytilcuandosabemosloquequeremoshacerperonoconocemoslaordenquelo
hace.Laordenaproposrealizalamismafuncin.

mank<palabraclave>

apropos<palabraclave>

Buscalaspginasdeayudarelacionadasconlosprogramasshell

2.3.1. Elsistemadearchivos

Figura2.2:ElsistemadearchivosdeLinux

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

17
2.3.- Una sesin de trabajo

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

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

milesdeusuarios,losdirectorioshomeestnubicadosenotrosdirectorios.

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

18
2.3.- Una sesin de trabajo

Determinacindelshelldeentrada

Cuandoentramosalsistemadespusdedarnuestronombredeusuarioynuestracontraseao
palabraclave,Linuxiniciaunshellpordefectoqueeselquenosmuestraelindicadorderdenesde
lasesin.Este shelldeentrada sedenomina loginshell.Eseladministradordelsistemaelque
estableceesteshellcuandocreaunusuario.

Cmosabemoscualeselshellasignadopordefecto?Cuandoseiniciaelshell,esteasignaa
unavariableelvalordelshellactual(enlasprcticassiguienteshablaremosdetenidamentedelas
variables). Esta variable se llama $SHELL. Podemos ver el valor de la variable con la orden
empotradaecho:

echo$SHELL

bin/tcsh

Averiguacualeselshellasignadoatusesindetrabajo

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

chshs<shell><user>

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

19
2.4.- Los procesos

2.4.1. Algunasherramientasparavigilarprocesos
Laformahabitualdeverelestadodenuestrosistemaesmedianteelusodeherramientasque
permitenvigilarlaejecucindelosprocesos.EnLinux,estasherramientasestncontenidasenel
paquete procps.Entrestasencontramos: top,vmstat,free,uptime, w,,etc.Estasherramientas
utilizanelpseudosistemadearchivos /proc paraobtenerlainformacin.EnelcasodeRedHat,
algunasherramientastambinestndisponiblesenlosentornosdeventanas,comoeselcasode
ktop,kpmyprocinfoenkde,gtopengnome.

Comprobacindelosdispositivos

Elpseudosistemadearchivos/procpermiteconsultarlosdispositivosreconocidosporelkernel
deLinux.Lasiguienteordennosmuestrapartedelainformacinquepodemosobtenerdeestetipo:

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

Ordenps

Laordenpsnosdaunainstantneadelosprocesosdelsistemaactuales(cuandoseejecutala

orden).Siqueremostomardiferentesinstantneas,debemosdeutilizar top,quenosinformade
formainteractivadelosprocesosdelsistema,delestadodeutilizacindelaCPU,lamemoria
utilizadaylibre,laRAMqueutilizacadaproceso,etc.

Algunasdelasopcionesmsutilizadas:

pse#muestratodoslosprocesos

psx#procesossinterminaldecontrol(tty)

20
2.4.- Los procesos

psu#procesosdeunusuarioespecificado

psl#formatolargo

pso#formatodefinidoporelusuario,...

ps,sinopcionesniargumentos,dainformacinsobrelosprocesosdelasesinactual.

Muestra los porcentajes de uso de la CPU de los procesos del


sistema
Pruebaelcomandotop

Elcomandokillnospermiteenviarsealesalosprocesosquenosinterese.Haymuchostipos

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

utilizaremosbg.

comando&

ctr+z

fg<idproceso>

bg<idproceso>

kill<idproceso>

2.4.2. Metacaracteressintcticos
Unavezaprendidocomoutilizaralgunosdeloscomandosdelsistema,esmuyprobablequeen
algunos casos nos interese utilizarlos de forma simultnea para agilizar ms las acciones que
queramosrealizar.Losmetacaracteressintcticosnosayudanenestesentido.

SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran
una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 2.1
muestraestoscaracteresydaunadescripcindesufuncin.

21
2.4.- Los procesos

LosmetacaracteressintcticospermitenmaterializarlafilosofadetrabajodeLINUXdecajade
herramientas: dadas las ordenes que necesitamos para realizar un trabajo, los metacaracteres
sintcticospermitencomponerlas("pegarlas")pararesolverlo.Estafilosofaesengranmedidala
responsabledequelasrdenesdeLINUXrealicenfuncionesmuyconcretas,yseanparcasendar
informacinalusuario.

Metacarcter Descripcindelafuncin

; Separadorentrerdenesqueseejecutansecuencialmente

| Separacin entre rdenes que forman parte de un cauce


(pipeline).Lasalidadelaordendelaizquierdadelseparador
eslaentradadelaordendeladerechadelseparador.

() Seusanparaaislarordenesseparadaspor;|.Lasordenes
dentro de los parntesis, ejecutadas en su propio shell, son
tratadas como una nica orden. Incluir un cauce dentro de
parntesis,nospermiteasuvezincluirloenotroscauces.

& Indicadordetrabajoensegundoplano(background).Indicaal
shellquedebeejecutareltrabajoensegundoplano.

|| Separadorentrerdenes,dondelaordenquesigueal||slose
ejecutasilaordenprecedentefalla.

&& Separadorentreordenes,enlaquelaordenquesigueal&&se
ejecutaslosilaordenprecedentetienexito.

Tabla2.1:Metacaracteressintcticos

Uniendordenescon;

Elusodelpuntoycoma(;)permiteescribirdosomsrdenesenlamismalnea.Lasrdenesse
ejecutansecuencialmente,comosisehubiesendadoenlneassucesivas.Enprogramasshell,se
utiliza por razones estticas (permite una asociacin visual entre ordenes relacionadas). En el
indicadorderdenes,permiteejecutarvariasordenessintenerqueesperaraquesecompleteuna
ordenparaintroducirlasiguiente.

Enelejemplosiguiente,utilizamoslaordenpwdquenospermiteverelcaminoabsolutodel

directoriodetrabajoactual,ylaordencd(paracambiardedirectorio).

22
2.4.- Los procesos

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

Creandocaucescon|

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

Figura2.3:Entrada,salidayerror,estndares

LoscaucessonunacaractersticadistintivadeLINUX.Uncauceconectalasalidaestndardela
ordenqueaparecealaizquierdadelsmbolo|conlaentradaestndardelaordenqueapareceala
derecha.Elflujodeinformacinentreambasrdenesserealizaatravsdelsistemaoperativo.

Paraverunejemplo,usaremoslaordenwhoqueproduceuninformedelosusuariosqueestn
conectadosactualmentealsistema.Cadaunadelaslneasquemuestrahacereferenciaaunusuario,
ydasunombredeusuario,elterminalalqueestconectado,ylafechayhoradeentradaalsistema.

23
2.4.- Los procesos

$who
mariatty2May1013:35
luistty6May109:00

Qu debemos hacer si queremos obtener esta misma informacin pero ordenada


alfabticamente?Lasolucinessencilla,usarlaordensortquesirveparaclasificar.
$who|sort#Lasalidadewhoseutilizacomoentradadesort
luistty6May109:00
mariatty2May1013:35

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

sort<opciones><fichero>

Pruebaelcomandosortsinargumentos.RecuerdaqueCtrl+dindica
findearchivo

Combinadoordenescon()

Enocasiones,necesitaremosaislaruncauce,ounasecuenciadepuntoycoma,delrestodeuna
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
2.4.- Los procesos

21264
Porqu?

Ejecutandoordenesensegundoplanocon&

Linuxpermitedosformasdeejecucinderdenes:

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


rdenesnoaparecehastaquehafinalizadolaordenquemandamosejecutar.Porejemplo,
lasrdenesquehemosejecutadohastaahora.

Ejecucinensegundoplano(background):enestesegundocaso,elindicadorreaparece
inmediatamente, locual nos permiteejecutarotrasordenes aunquelaquese lanz en
segundoplanonohayaterminado.

Paraejecutarunaordenensegundoplanoslodebemosfinalizarlalneadeordenescon &.
SupongamosquedeseamosrealizarlacompilacindeunprogramaescritoenCyquelamisma
duraalgunosminutos,siqueremosseguirtrabajandomientraselsistemarealizaeltrabajo,podemos
ejecutarlaensegundoplano:

$gccmiprograma.c&#compilacinlanzadadefondo
[1]1305
10%ls#seguimosmientrasotroprocesorealizalacompilacin

Vemoscomoelshellrespondealcarcter&indicandoelnmerodeltrabajoquehemoslanzado.
Esteapareceentrecorchetes,seguidodelidentificadordelprocesoqueejecutalaorden.Elnmero
detrabajonosservirparacontrolarlosprocesosensegundoplano.Otrosejemplos:
$who |wc &#lazamosdefondouncauce
[2]13561357
$(cd midi rect orio ;ls) &#lanzamosdefondounasecuenciade
[3]1400ordenes
$cd midi rect orio& ls& #&sirvedeseparador;perdemosla
secuencialidad
[1]1402

25
2.4.- Los procesos

[2]1403

Ejecucincondicionaldeordenescon||y&&

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

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

find<ruta>name<nombre><otrasopciones>

find<ruta>size<tamao><otrasopciones>

find<ruta>atime<numerodias><otrasopciones>

Muestra un mensaje que te indique si esta conectado o no un


usuario.Utilizalaordenechoparamostrarelmensaje

echo<mensaje>

Nohayrestriccinquelimiteelnmeroderdenesqueaparecenantesdel||,perosloseevala
elestadodelaltima.

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

26
2.4.- Los procesos

jobs

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

jobs[l]

Listalostrabajosactivosbajoelcontroldelusuario.Conlaopcinlselistan,ademsdela
informacinnormal,losidentificadoresdelosprocesos.

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

Siuntrabajocontieneuncauce,lasordenesdelcaucequehanacabadosonmostradasenuna
lneadiferentedeaquellasqueestnanejecutndose.

Lassiguientesrdenesquevamosaveracontinuacinnospermitencambiarelestadodeun
trabajo.Lamayorpartedeellasadmitencomoargumentounidentificadordetrabajo.

fg

Laordenfgseusaparatraertrabajosdefondo,osuspendidos,aprimerplano:

fg[%[job]]

Sin argumentos,ocon%, fg traeeltrabajoactualaprimerplano.Conunidentificador de


trabajo,traeaprimerplanoeltrabajoespecificado.

Supongamosquehaydostrabajosensegundoplano,comomuestraelejemplo:
$jobs

27
2.4.- Los procesos

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

Sideseamosponerenprimerplanoxterm,dadoqueestasuspendido,podemosejecutar
$fg%1
xterm

Ahora,elshellnorespondehastaquefinalicemoselprocesoxtermolodevolvamosasegundo
plano. Este tipode transferencia,nos permitelanzardefondoprogramas quenecesitenmucho
procesamiento inicial tal como crear una base de datos y retomarlos cuando necesitemos
interactuarconl.

bg

Contrariaalaordenfg,bgenvaasegundoplanounprograma:

bg[%job]

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

Laorden%

Laorden%seutilizaparacambiarelestadodeuntrabajo.

%[job][&]

Estallevaaprimerplanoeltrabajoactual,sinotieneargumento,oelespecificadoporjob.Sial
finaldelordenestpresenteel&,envaeltrabajoasegundoplano.

Laorden%esenrealidadunaabreviacindefgybg.

28
2.4.- Los procesos

kill

Laordenkillenviaunasealaun(os)proceso(s).Tienedosformas:

kill[sig]{pid|%job}...

killl

Laaccinpordefectodekillesenviarlasealdefinalizaralproceso(s)indicado(s)porPIDo

nmerodejob.Lasseales, sig,seindicanpornmerosonombres.Conlaopcin l,listalos


nombresdelasealesquepuedenserenviadas.

LassealessonenLINUXelmediobsicoparanotificardelaocurrenciadeeventosalos
procesos.Porejemplo,laspulsaciones<CTRL>C,<CTRL>Z,etc.loquehaceenrealidades
provocarqueelmanejadordetecladogeneredeterminadassealesquesonenviadasalprocesoen
ejecucin.Tambin,seenvansealescuandounprogramareferenciaunadireccininvlida(p.e.
unpunteronoinicializado)delproceso.Enestecaso,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 Redirecciona la entrada de una orden para leer del archivo


nombre.

>nombre Redireccionalasalidadeunaordenparaescribirenelarchivo
nombre.Sinombreexiste,losobreescribe.

2>nombre Redireccionaelerror(stderr)aunfichero.Sinombreexiste,lo

29
2.5.- Metacaracteres de entrada/salida o de direccin

Metacarcter Descripcindelafuncin

sobreescribe.

>&nombre Lasalidade stderr secombinacon stdout,yseescribenen


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
2.5.- Metacaracteres de entrada/salida o de direccin

Como podemos observar, la orden cat >mimensaje indica al shell que el contenido de la
entradaestndardebeserincluidoenelarchivomimensaje.

Redireccindesalidacon>,2>y>&

Lassalidasdelasrdenesvannormalmentea stdout,ymuchasrdenesescribenmensajesde
erroroinformacinadicionalenstderr.Laredireccindelasalidapermiteenviarlassalidasaun
archivo.Enestecasolosmensajesquesalenporstderrsiguensaliendoporpantalla.Siqueremos
redireccionar el error a un fichero independiente utilizamos el metacarcter 2> y si queremos

combinarenunmismoficherolastdoutystderr,utilizamoselmetacaracter>&.

Losejemplosmuestranlosdiferentesmetacaracteresderedireccin.

$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
2.5.- Metacaracteres de entrada/salida o de direccin

Redireccindeentradadentrodeprogramascon<<

Elmetacarcter << nospermiteredireccionarlneasdesdeunprogramaalaentradadeuna


orden dentro del programa. La redireccin se realiza mediante un mecanismo conocido como
documentacinaqu.Estaredireccinpermiteescribirmensajesmultilneadesdeunprogramasin
necesidaddeusarmltiplesrdenesecho.

Parautilizarlo,escribimosacontinuacinde<<undelimitador,esdecir,unconjuntonicode
caracteresquemarcarnelfindelaslneasdeentradaparaladocumentacinaqu.Cadaunadelas
lneas deentradaquesevayaintroduciendoseexaminaparaigualareldelimitadorsinrealizar
ningunasustitucin,oexpansindemetacaracteres.Unavezintroducidoeldelimitador,seejecuta
laorden.Estonosvaapermitirajustardinmicamentelosmensajesuordenes.

Elsiguienteejemplomuestracomousarestemecanismoparagenerarunmensajedebienvenida
paraunusuarioadaptndoloasuentorno.Paraello,hacemosusodelasvariables$usery$PWD
quenosdanellogindeusuarioyeldirectoriodetrabajoactual,respectivamente.
$cat<<FIN_BIENVENIDA
Hola$user
Sudirectorioactuales$PWD
Noolvidemirarlasnoticias
FIN_BIENVENIDA
Holax3333333
Sudirectorioactuales/d5/home/x3333333
Noolvidemirarlasnoticias
$_

Comovemos,catestaaceptandoinformacinhastaqueencuentralapalabraclavequelehemos
indicadotrasel<<,ennuestroejemplo,FIN_BIENVENIDA;cuandolaencuentraentiendequela
entradadeinformacinporstdinhafinalizado.
Genera una secuencia de nmeros.Dichasecuencia acabarcuando
seintroduzcaun0.

32
2.5.- Metacaracteres de entrada/salida o de direccin

Algomssobrecaucesyredirecciones

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

tee<opciones><fichero>

Archivosdedispositivosyredirecciones

En Linux, el directorio /dev contiene los archivos de dispositivos y pseudodispositivos


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

Comovemos,timemuestraelresultadodeejecutarlaordenlsyeltiempodeejecucin.Sino

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

33
2.5.- Metacaracteres de entrada/salida o de direccin

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

2.6. Empaquetadoycompresindearchivoscontarygzip
Comprimirunarchivo,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
2.6.- Empaquetado y compresin de archivos con tar y gzip

gunzip,bzip2d,bunzip2,

Veamosalgunosejemplos.
$gziparchivo1archivos.gz
$bzip2archivo2archivos2.bz

Podemosdescomprimirlosarchivosenlasalidaestndarenlasdosformassiguientes:
$gunziparchivos.gz
$bzip2darchivos2.bz

Por ltimo,indicarquesiqueremoscrearunnicoarchivoconmltiplescomponentes que


puedanextraerseposteriormentedeformaindependiente,esrecomendableutilizar tar,pues gzip
estapensadoparacomplementaratar,noparasustituirlo.

Empaquetadodearchivos

Laordentarseutilizaparaempaquetarungrupodearchivosenunnicoarchivo,quetienela
estructuradeunencabezadode512bytesyelarchivo,tantasvecescomoarchivosempaquetemos.
Seutilizaparaalmacenarjerarquasdedirectorios,tenercopiasdeseguridadyahorrarespacio.Es
laformahabitualdesuministrarparchesydistribucionesdesistemas.

Lasintaxisdelaordentares:

tar[opciones][archivos]

Lasopcionesde tar puedenironoprecedidasdel.Sibientienenumerosasopciones,slo


vamosaveralgunasdeellas:

cCreaunnuevopaqueteparaalmacenarlosarchivos.

rGrabaarchivosalfinaldelpaquete

tEnumeraelcontenidodelpaquete.

fEspecificaelarchivoenelquesecrearelpaquete

xExtraelosarchivosdelpaquete

vUtilizaenmodoverboso

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

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

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

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

Combinandolacompresinyelempaquetado

Podemoscombinarlacapacidaddecompresinconladeempaquetayasreducireltamao.
Paraelloeltartienedosopcionesms:

zComprimeutilizandogzip

jComprimeutilizandobzip2

Lasextensionesdelosarchivossontgzytbz,respectivamente.Amododeejemplo:
$tarcvzfmisPracticas.tgzmispracticas

EmpaquetaycomprimeeldirectoriomisPracticasysucontenidoenunnicoarchivollamado
misPracticas.tgz
$tarxvzfmisPracticas.tgz

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

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


directoriosinicial.

37
2.7.- Ejercicios

2.7. Ejercicios
1.Desplzatehastaeldirectorio/binygeneralossiguienteslistadosdearchivos(siemprede
laformamscompactayutilizandolosmetacaracteresapropiados):

a) Todoslosarchivosquetengancomoterceraletradesunombreunaa

b) Todoslosarchivosquenocomiencenporunaconsonante

c) Todoslosarchivosquequecontenganunnmeroporda,df

d) Todoslosarchivosquecomiencenporbyacabenenunnmero

2.Construyelasiguienteestructuradedirectorios

Mail

Inbox Sent Local

SPAM SO IA
2006
EDI

ylossiguientesficherosdetextoconcontenidodetuinvencin.
Situadoeneldirectorio Nombredelfichero

SPAM banco.eml
compraTelefono.txt

Mail notas.eml

SO noticiasPracticas.eml

EDI febrero2007_notas.eml

IA anotaciones.txt

LOCAL listaAprobados.txt

2006 telefonosClase.eml

38
2.7.- Ejercicios

SitundoteeneldirectorioMail:

a) Utilizalaordenfindparaencontrartodoslosficherosqueacabenen.txt

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.- COMANDOS SHELL II

3. COMANDOSSHELLII

3.1. Historiaderdenes
Lasrdenesqueseescribenenelterminalsevanguardandoenunarchivohistrico,esloquese
llamahistoriaderdenes.stavaalmacenandolasrdenesconsusrespectivosparmetrosquesele
vandandoalashellparaqueejecute.Elsentidodemantenerlahistoriaesfacilitaryhacerms
rpidalarepeticindealgunaordenqueyahabamosejecutadoypoderreutilizarsusargumentos.

Enesteapartado,vamosaestudiarcomoconseguirqueelshellmantengaunahistoriadelas
rdenesdadas,ycmovolverallamarardenesdadasconanterioridad,modificarlasyreutilizarlas.

Asignandolavariablehistoria

Lavariable$HISTSIZEcontieneelnmeroderdenesquesevanaalmacenarenlahistoria
antesdedescartarlaordenmsantiguaalmacenada.Elvalorpredeterminadoparaestavariablees
de500,sibienpodemoscambiarloasignndoleotrovaloralavariable.

Paraconsultarelvalordelasvariablesdeberemosteclearset.
$bash$ set
argv()
PWD/tmp/
HISTSIZE500
USER mluque
SHELL /bin/bash

...

Laprimeracolumnareflejaelnombredelavariableylasegundasuvalor.

Viendolahistoria

La orden history muestraunalistadelasrdenesdelahistoriaderdenes;cadaorden va

42
3.1.- Historia de rdenes

precedidadeunnmeroqueindicalaocurrenciadelamismaenlahistoria,empezandopor1para
laordenmsantigua.Ennuestrocaso
$bash$ history
1echo$SHELL
2ls
3psax
4find.name*.txt
5history

history[opciones]

N:mostrarnicamentelasNltimaslneasdelhistrico

c:borrarlalistahistrica

Pruebaelcomandohistory.Quocurresilolanzasendiferentes
terminales

Almacenandolahistoriaderdenes

Cuandoabandonamosunashell(bienutilizandoelcomando exit ocerrandoelterminal),las


rdenesquesehayanejecutado(listadohistrico)seguardanenelarchivohistrico.Larutadeeste
archivoseencuentraalmacenadaenlavariable$HISTFILE;elarchivohistricopredeterminado
sueleser~/.bash_history.

Repitiendordenesconeleditorderdenes

Enelbash,podemosutilizaruneditorderdenespararecuperaryejecutarrdenes.Conlas
flechasarribayabajodelteclado,podemosmovernoshaciaadelanteyhaciaatrsenlahistoriade
rdenes.Cadaordenvaapareciendoenpantallasegnlarecuperemosconelcursorsituadoalfinal.
Podemospulsar<RETURN>paraejecutarla<CONTROL>Cparacancelarla.Tambin,podemos
editarlasrdenesparareciclarlas.Utilizandolasflechasizquierdayderechapodemosmovernospor
lalnea(ordenrecuperada)yborraroinsertarparamodificar,segnnuestranecesidad,laorden
recuperada.

43
3.1.- Historia de rdenes

Expansinhistrica:repitiendordenesconelsignobang(!)

Otraformaparareutilizarrdenesesusarelsignodeadmiracin,denominadobang.Lasformas
pararecuperarunaordenson:

!numeroorden#Invocaunaordenconocidasuposicinenlahistoria

!!#Invocalaltimaordenejecutada

!n#Invocalaordensituadanlugaresatrsenlahistoria

!cadena_texto#Invocalaordenquecomienzaporcadena_texto

!?cadena_texto[?]#Invocalaordenquecontienecadena_texto

Supongamosqueestamosenlaorden6,diferentesformasdeinvocarlaorden4(find.name
*.txt)son:
$bash$!4#Damoselvalorabsolutolaposicinenlahistoria

$bash$!2#Damoslaposicinrelativaenlahistoria

$bash$!fi#Ejecutamoslaordenquecomienzapor"fi"

$bash$!?in#Ejecutamoslaordenquecontienelasubcadena"in"

Enelltimoejemplo,indicamosquequeremoslaordenmsrecientequecontieneeltextoin
encualquierpartedelacadenadelaorden.

Podremosseguiraadiendotextoaunaordenanteriorsifinalizamosconuna ?.Delejemplo
anterior,reutilizamoslaescrituradelaorden2(ls)paramodificarlasopciones!?ls?l
lsl

Modificacindeusocomnparalaexpansindellistadohistrico

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

!or den [:pala bra]

44
3.1.- Historia de rdenes

LaTabla 3.1 enumeraalgunodelosindicadoresdepalabramsfrecuentes.Comoejemplo


utilizamoslaordengcclab1.colab1

Unavezseleccionaunaorden,yciertaspalabradentrodeesaorden,sepuedenaplicarunaoms
operacionesalaspalabrasseleccionadasmedianteelusodeunasucesindeoperadoresllamados
modificadores.Lomodificadoresvanprecedidosdelsignodospuntos(:)

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

Indicador Significado Ejemplo

o Palabra0(orden) oLaordengcc

N 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

p Imprimeelresultadodeunaordensinejecutarla

r Eliminalarazdelnombredearchivo

e Eliminalaextensindelnombredearchivo(partequesigue
alpunto)

h Sequedaconlacabeceradelaruta(todomenoselltimo
componente)

t Sequedaconelfinaldelaruta(ltimocomponente)

Tabla3.2:Modificadoresdelareferenciasdelahistoria

45
3.1.- Historia de rdenes

Vamosaveralgunosejemplos,:pestilcuandonoestamossegurossilareferenciaquevamosa
hacereslaquedeseamos.Conl,veremoslaordensinejecutarla,yunavezqueestemosseguros
slotenemosquehacer!!
$!ech:p
echo$SHELL
$!!

3.2. Autocompletarconeltabulador
UnateclamuyconocidaenBasheseltabulador,quenosayudaaterminarderellenarunaorden
conelnombredeuncomando,deunavariable,deunficheroodirectorio,oconelnombredeuna
funcinBash.Paraello,sesiguenlassiguientesreglascuandosepulsaeltabulador:

1. Sinohaynadaqueempieceporeltextodelapalabraqueprecedealcursorseproduceun
pitidoqueinformadelproblema.

2. Sihayuncomando(enelPATH),unavariable(siempreprecedidapor$),unnombrede
ficheroofuncinBashquecomienzaporeltextoescrito,Bashcompletalapalabra.

3. Sihayundirectorioquecomienzaporelnombreescrito,Bashcompletaelnombrede
directorioseguidoporunabarradeseparacindenombresdedirectorios,/.

4. Sihaymsdeunaformadecompletarlapalabra,elshellcompletalomsquepuedey
emiteunpitidoinformandodequenolapudoterminardecompletar.

5. CuandoBashnopuedecompletarunacadena(porhabervariasposiblesqueempiezan
igual),podemospulsardosveceseltabuladorysenosmostrarunalistaconlasposibles
cadenas.

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

46
3.3.- Metacaracteres

3.3.1. Metacaracteressintcticos
SirvenparacombinarvariasrdenesdeLINUXyconstruirunanicaordenlgica.Suministran
una forma de ejecucin condicional basada en el resultado de la orden anterior. La Tabla 3.3
muestraestoscaracteresydaunadescripcindesufuncin(verprctica1XXXXX).

Metacarcter Descripcindelafuncin

; Separadorentrerdenesqueseejecutansecuencialmente

| Separacin entre rdenes que forman parte de un cauce


(pipeline).Lasalidadelaordendelaizquierdadelseparador
eslaentradadelaordendeladerechadelseparador.

() 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

\ Evita que el carcter que le sigue sea interpretado como un


metacarcterporelshell.
Evitaquelacadenadecaracteresencerradaentredoblescomillas
seainterpretadacomometacaracteres.

' Evita que la cadena de caracteres encerrada entre comillas


simplesseainterpretadacomordenesometacaracteres.

` La cadena de caracteres encerrada entre acentos se interpreta


comounaordenyseejecuta

Tabla3.5:Metacaracteresdecitacin

Eludirmetacaracterescon\

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

48
3.3.- Metacaracteres

Supongamosquequeremoscrearunosarchivosconnombres abc;1 y TrabajoParaCasa.Si


escribisemos estos nombres como tal, el shell interpretar el ; y el espacio en blanco como
separadores,respectivamente(prubaloparaverquedice).

Paraevitarlopodemosescribir:

$bash$mvabc1abc\;1

$bash$mvTrabajoParaCasaTrabajo\Para\Casa

Protegiendometacaracterescon

Labarrainvertidasloprotegealcarcterquelasigueinmediatamente,porloquenoescmodo
para proteger cadenaslargas. En estos casos, podemosprotegerla cadenacompletausando las
comillasdobles.stasdesactivanelsignificadoespecialdeloscaracteresentreellas,salvolosde!

evento,$vary`cmd`querepresentanlasustitucindelahistoria,variablesyejecucinderdenes,
respectivamente.Ejemplo:
$bash$ echo"****Hola$USER"
****HolaPepito
$bash$

Observadcomolosmetacaracteres*nosehanexpandido,perolavariable$USER sihasido
sustituidaporsuvalor.

Protegiendocon''rdenes,variablesymetacaracteres

Lascomillassimplessonparecidasalascomillasdobles,desactivanelsignificadoespecialde
algunoscaracteressalvolaexpansindelahistoriaderdenes(!evento).
$bash$ texto="mivariable"
$bash$ dentro="valorde$texto"
$bash$ echo$dentro
valorde miva riable
$bash$ setdentro='valorde$texto'
$bash$ echo$dentro
valorde $ text o

49
3.3.- Metacaracteres

Tenedpresentequelaacotacindecadenasescompleja,especialmentelascadenasqueasuvez
contienenmetacaracteresdecitacin.Recordadquelosmetacaracteresdecitacinnoseutilizan
igualqueenlaescrituranormal.

3.3.4. Metacaracteresdeentrada/salidaodedireccin
Losmetacaracteresdeentrada/salidasonotradelascaractersticasdistintivasdeLINUX.Con
ellos,podemosredireccionar(tomar)laentradadeunaordendesdeunarchivoenlugardelteclado,
redireccionar (llevar) la salida estndar a un archivo en lugar de a la pantalla, o encauzar su
entrada/salidaa/desdeotraorden.Tambin,podemosmezclarlosflujosdeinformacindelasalida
yelerrorestndaresparaquesalganjuntosporlasalidaestndar.VemosunresumenenlaTabla
3.6.

Metacarcter Descripcindelafuncin

<nombre Redirecciona la entrada de una orden para leer del archivo


nombre.

>nombre Redireccionalasalidadeunaordenparaescribirenelarchivo
nombre.Sinombreexiste,losobreescribe.

&>nombre Lasalidade stderr secombinacon stdout,yseescribenen


nombre.

2>nombre Lasalidadestderrseescribeennombre

>>nombre Lasalidadelaordenseaadealfinaldelarchivonombre.

&>>nombre Aadelasalidade stderr,combinadacon stdout alfinalde


nombre.

| Creauncauceentredosrdenes.Lasalidaestndardelaorden
alaizquierdadesmboloseconectaalaentradaestndardela
ordendeladerechadelsigno.

Tabla3.6:Metacaracteresdeentrada/salidaodedireccin

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

50
3.3.- Metacaracteres

Metacarcter Descripcindelafuncin

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

: Precedealosmodificadoresdesustitucin.

Tabla3.7:Metacaracteresdeexpansin/sustitucin

Estosmodificadoresnoshanidoapareciendoalolargodelosguiones,veamosquesignifican:
"$" sirveparaindicaralshellquesustituyaunavariableporsuvalor; "!" eselindicadordela

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.- Los alias

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

$bash$ alias ll#muestraladefinicindelaliasll
lllslcolor=tt

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

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

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

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

52
3.4.- Los alias

Precauciones!

1. Aveces,losaliaspuedenentrarenconflictoconprogramasdelshell,especialmentesise
usanparalaredefinicinderdenes.Unprogramashellpodranofuncionarcorrectamente
porqueesperaelcomportamientopordefectodeunaorden.

2. Definesiemprelosaliasmultipalabraentrecomillassimples.

3. Alcrearunalias,debemostenerlaprecaucindenollamarlosalias,nicrearaliasquese
referencienaellosmismosparanocrearunbucleenlasdefinicionesdestos.Ahorabien,s
podemoscrearaliasquereferencienaotrosalias.

4. Cuandodefinimosunalias,stesloestardisponibleenelterminalenelquesecrey,
adems,cuandoseapagueelordenadorseperder.Siqueremosqueunaliasestdisponible
ennuestrosistemasiemprequearranquemos,podemosdefinirlodentrodelfichero~/.bashrc.
EsteficheroseejecutasiemprequesearrancaBash.

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

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

53
3.5.- Variables

Lasvariablesdeentornosirvenparapersonalizarelentornoenelqueseejecutalashellypara
ejecutarcorrectamentelasrdenesdelshell.Cuandodamosalshellunaordeninteractiva,Linux
inicia un nuevo proceso para ejecutar la orden. El nuevo proceso hereda algunos atributos del
entornoenelquesecre.Estosatributossepasandeunosprocesosaotrospormediodelas
variablesdeentorno,tambindenominadasvariablesglobales($HOME,$SHELL,$USER,...).

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

$bash$ echo$var pr ueba


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

Observadquelascomillasoelcarcterdeescapenoformanpartedelvalordelavariableuna
vezqueserealizalaasignacin.

Enelltimoejemplo,utilizamoselacentoparaindicarlealashellqueelcomandoqueremosque
loejecuteynoquelotratecomounacadenams.

Paraeliminarunavariabledeentornopodemosusarelcomandounset.Porejemplo:

55
3.5.- Variables

$unsetNOMBRE

3.5.3. Personalizarelprompt
Elprompteselindicadordequelalneadecomandosestlibreparaaceptarunanuevaorden.
Enlasaulasdeprcticas,el prompt pordefectoes $bash$,sinembargopodemospersonalizarlo
paraquepongaloquenosotrosqueramos.

LacadenaquesemuestraenelpromptsealmacenaenlavariabledeentornoPS1,porlotanto,
bastarconcambiarelvalordeesavariable,paracambiarelpromptdenuestrosistema.

LaTabla3.8muestraalgunasopcionesquepodemosusarparapersonalizarelprompt,veamos
algunasdeellas.

Opcin 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

Este script (misdatos.sh)muestraporpantallaunaseriededatossobreelusuario.Paraello,


utilizavariablesdeentorno.

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

62
3.6.- Scripts

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

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

Elscriptanteriordaracomoresultadolosiguiente

$bash$ ./ejem plo2


FulanitodeCopas(asignadoentrecomillas)
Siloasignosincomillaspasaesto:
./demo04.variables:line7:de:commandnotfound

Alasignarunacadenaquecontieneespaciosaunavariable,sinutilizarcomillas,nosdaunerror.

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

63
3.6.- Scripts

echo$nombre

El script anteriordacomoresultadodelprimerecho,unlistadocontodoslosarchivosque
empiezancondemo,ycomoresultadodelsegundoecho,lacadenademo*
mluq ue@r abinf1 41:/tm p/bash $./ej em pl o3
Asignosincomillasaunavariablelacadenademo*ylaescribo
demo01.hola_mundodemo02.hola_mundodemo03.entorno
demo04.variablesdemo04.variables~demo05.variables
Asignoahoraconcomillaslamismacadenayescribolavariable
demo*

Porqu?

3.6.3. Pasodeargumentosalosscripts
Enocasiones,puedesertilquenuestrosscriptsrecibanalgntipodeargumento(undirectorio
sobreelqueactuarountipodearchivoquebuscar)alserejecutados.Parahacerreferenciaaestos
argumentos,dentrodelosscriptsseempleanunaseriedevariablesquesiempreestarndisponibles,
los parmetrosposicionales $1,$2,$3,..., ,siendo $0 elnombredelpropioprograma.Reciben

estenombreporqueselesreconoceporsuubicacin,esdecirelprimerargumentoes$1,elsegundo

$2yassucesivamente.

Porejemploimaginemosquecreamoselscriptsiguiente:
#!/bin/bash
#Ejemplo4:scriptquerecibeparmetrosylosimprime
echo"Elscript$0"
echo"Recibelosargumentos$1$2"

Silohemos guardado enunficherollamado ejemplo4.sh conelpermisoxactivadopodemos

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

64
3.6.- Scripts

Nosepuedemodificarelvalordelasvariablesposicionales,slosepuedenleer;sise

intentaasignarlesunvalorseproduceunerror.

Sielargumentoposicionalalquealudimosnosepasacomoargumento,entoncestieneelvalor

nulo.

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

Silohemos guardado enunficherollamado ejemplo5.sh conelpermisoxactivadopodemos

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

Lasvariables$*,$@y$#

Lavariabledeentorno$#almacenaelnmerototaldeargumentosoparmetrosrecibidosporel

scriptsincontaral$0.Elvaloresdetipocadenadecaracteres,peromsadelanteveremoscomo

podemosconvertirestevaloranmeroparaoperarconl.Lavariables$*y$@contienen,ambas,

losvaloresdetodoslosargumentosrecibidosporelscript.

Comoejemplo,elscriptdelEjemplo4lovamosamodificartalcomomuestraelEjemplo6para
queuseestasvariablesparasacarlosargumentosrecibidos.
#!/bin/bash
#Ejemplo5:scriptquerecibeparmetrosylosimprime
echo"Elscript$0recibe$#argumentos:"$*
echo"Elscript$0recibe$#argumentos:"$@

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

65
3.6.- Scripts

Elscript./ejemplo5.shrecibe2argumentos:holaadios

Aunque cuando no entrecomillamos $* o $@ no existen diferencias entre usar uno y otro,

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

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

Vemoscomo,enelcasode $*,losargumentosseseparanporelsmbolocoma(,)(separador
establecidoenlavariableIFS),mientrasqueenelcasode$@sesiguenseparandoporespacios(no
leafectaelvalordelavariableIFS).

Siempre conviene entrecomillar las variables $* y $@ para evitar que los argumentos que
contenganespaciosseanmalinterpretados.

Expansindevariablesusandollaves

Realmentelaformaqueusamosparaveraccederalcontenidodeunavariable,$variable,esuna

simplificacindelaformamsgeneral${variable}.Lasimplificacinsepuedeusarsiemprequeno
existanambigedades.Enesteapartadoveremoscuandoseproducenlasambigedadesquenos
obliganausarlaforma${variable}.

Laforma${variable}seusasiemprequelavariablevaseguidaporunaletra,dgitooguinbajo

66
3.6.- Scripts

(_);encasocontrario,podemosusarlaformasimplificada $variable.Porejemplo,siqueremos
escribirnuestronombre(almacenadoenlavariablenombre)ynuestroapellido(almacenadoenla
variableapellido)separadosporunguinpodramospensarenhacer:
$bash$ nombre=Fernando
$bash$ apellido=Lopez
$bash$ echo"$nombre_$apellido"
Lopez

PeroestoproduceunasalidaincorrectaporqueBashhaintentadobuscarlavariable$nombre_
quealnoexistirlahaexpandidoporunacadenavaca.

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

Otro lugar donde necesitamos usar llaves es cuando vamos a sacar el dcimo parmetro
posicional.Siusamos$10,Bashloexpandirpor$1seguidodeun0,mientrasquesiusamos${10}
Bashnosdareldcimoparmetroposicional

Tambinnecesitamosusarlasllavescuandoqueremosaccederaloselementosdeunavariable
multipalabra.Porejemplo:
$bash$ matr iz=(uno dos tres)
$bash$ echo $mat riz
uno
$bash$ echo $mat riz[ 2]
uno[2]
$bash$ echo ${matr iz[2]}
tres

67
3.7.- Ejercicios

3.7. Ejercicios

1.Despusdeejecutarlassiguientesrdenes:i)lsii)dateiii)cat>pru.txtiv)wclpru.txt

v)lslvi)chmod644pru.txtvii)echo$PATHviii)cd..ix)pwdx)echoHolamundo

Visualizalas5ltimardenesejecutadas

Muestraeltamaomximodellistadohistrico

Culestuarchivohistrico?Cmolohasencontrado?

2.Suponiendoellistadoderdenesdelejercicioanterioryutilizandoelsignobang(!):

Muestralaordenqueocupalaposicin7

Ejecuta,unaordenquecomienceporlacadenaecho

Muestrasinejecutarlaltimapalabradelaltimaordenejecutada

3.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

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

informacion.txt

69
3.7.- Ejercicios

12.Realizaunscript,connombreinfoDir.sh,querecibacomoprimerparmetroelcamino
completodeundirectorioymuestreporpantalla:a)Losficherosqueempiezanporunavocal
yb)elnmerototaldeficherosydirectoriosquehayenesedirectorio.

13.Creaunscript,connombremueveFicherosTexto.sh,querecibacomoprimerparmetro
el nombre de un directorio que no existe y como segundo parmetro el nombre de un
directorioqueexiste.Elscriptdebercrearelprimerdirectorioymovertodoslosficherosque
acaben en .txt del directorio pasadocomo segundo argumento al directorio pasadocomo
primerargumento.

14.Crea un script, que se llame intercambiar.sh, que acepte dos argumentos. Los dos
argumentossecorrespondernconlosnombresdedosarchivosexistentescuyoscontenidos
sernintercambiadosalejecutarelscript.Porejemplo,sielarchivofich1contienelapalabra
holayelarchivofich2contienelapalabraadis,alejecutarelscriptydarlecomoargumentos
losnombresdeestosdosarchivos,elresultadoserque fich1 contendrlapalabraadisy
fich2contendrlapalabrahola.

15.CreaunscriptllamadocopiaSeguridad.shquerecibacomoprimerparmetroelnombre
de un directorio y como segundo parmetro el nombre de un fichero. El script deber
empaquetarycomprimireldirectoriopasadocomoprimerparmetroenunarchivoconel
nombredelsegundoparmetro.

16.CreaunscriptllamadocrearScript.shalcualselepasacomoargumentoelnombredel
scriptacrear.CrearScript.hcrearotroscript,cuyonombreserelargumentorecibido,yuna
vezcreado,ledarpermisosdeejecucin.Elsegundoscriptrecibircomoargumentosel
nombredeunficheroyelnombredeundirectorio;creareldirectorioyharunacopiadel
ficheroeneldirectoriorecincreado.

70
4.- PROGRAMACIN BASH I

4. PROGRAMACINBASHI

4.1. Variablescontipo
Hastaahoratodaslasvariablesquehemosusadosondetipocadenadecaracteres.Aunqueenlos
primerosshellslasvariablesslopodancontenercadenasdecaracteres,despusseintrodujola
posibilidaddeasignaratributosalasvariablesqueindiquen,porejemplo,quesonenterasodeslo
lectura.Parafijarlosatributosdelasvariables,tenemoselcomandointernodeclare,elcualtienela
siguientesintaxis:

declare[opciones][nombre[=valor]]

LaTabla 4.1 describelasopcionesquepuederecibirestecomando.Unapeculiaridaddeeste


comandoesqueparaactivarunatributoseprecedelaopcinporunguin,conloquepara
desactivarunatributodecidieronprecederlaopcinporun+.

Opcin Descripcin

a Lavariableesdetipoarray

f Mostrarelnombreeimplementacindelasfunciones

F Mostrarsloelnombredelasfunciones

i Lavariableesdetipoentero

r Lavariableesdeslolectura

x Exportalavariable(equivalenteaexport)

Tabla4.1:Opcionesdelcomandointernodeclare

Siescribimosdeclaresinargumentos,nosmuestratodaslasvariablesexistentesenelsistema.

Siusamosla opcinf, nosmuestraslolosnombresdefunciones(lasveremosenlaprctica

siguiente)ysuimplementacin,ysiusamosla opcinF,nosmuestraslolosnombresdelas
funcionesexistentes.

71
4.1.- Variables con tipo

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

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

Paraquelaoperacinaritmticatengaxito,noesnecesarioquedeclaremoscomoenterasa
var1yvar2,bastaconquerecojamoselvalorenunavariableresultadodeclaradacomoentera.
Esdecir,podramoshacer:
$bashresult ado=4*6
$bashecho$resul tado
24

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

Podemossabereltipodeunavariableconlaopcinp.Porejemplo:
$bashdeclarepresultado
declareiresultado="24"

Laopcinxesequivalenteausarelcomandoexportsobrelavariable.Ambassonformasde

72
4.1.- Variables con tipo

exportarunavariable.

Laopcinrdeclaraunavariablecomodeslolectura,conloqueapartirdeesemomentono

podremosmodificarlaniejecutarunsetsobreella.Existeotrocomandointernollamadoreadonly

quenospermitedeclararvariablesdeslolectura,peroquetienemsopcionesquedeclarer.En

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

Ademssenosindicasilavariableesdetipoarray(a)oentero(i)

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

Afortunadamente,enlashelldeBashexistenvariasmanerasderealizaroperacionesaritmticas
condatosnumricos:

Utilizandolaexpansindelshell$((expresin))

Utilizandolaordenlet

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

73
4.2.- Expresiones aritmticas

expanden(sesustituyenlasvariablesporsusvaloresenlaexpresin)ysetraducenaltipoentero
largoantesdeefectuarlaevaluacindelaexpresin.

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

$((expresin))

Lasexpresionesaritmticas,aligualquelasvariablesylasustitucindecomandos,seevalan
dentrodelascomillasdoble().
Basndonosenelcomandodate+%j,quenosdevuelveelnmerode
da Juliano, hacer un script que nos diga cuantos das quedan
hastaelprximo31deDiciembre.
Elcomandosepuedeimplementarrestandoa365daselnmerode
dastranscurridosas:

$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.- Expresiones aritmticas

4.2.2. SimilitudconlasexpresionesaritmticasC
LasexpresionesaritmticasdeBashsehandiseadodeformaequivalentealasexpresionesde
C.Porejemplo$((x+=2))aade2ax.

Aunquealgunosoperadores(p.e.*olosparntesis)soncaracteresespecialesparaBash,nohace
faltaprecederlosporelcarcterdeescapesiemprequeestndentrode $((...)).Igualmente,alas
variablesqueestndentrodelaexpresinaritmticanohacefaltaprecederlaspor$paraobtenersu
valor.

Bash,adems,nospermiteusarlosoperadoresrelacionales(<,>,<=,>=,==,!=)ylgicosdeC
(!,&&,||)interpretando,aligualqueC,el1comociertoyel0comofalso.

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

letvar=expresion

expresionescualquierexpresinaritmticaynonecesitaestarencerradaentre$((...)).

Elcomando let,adiferenciadelcomando declarei,nocreaunavariabledetipoentero,sino


unavariabledetipocadenadecaracteresnormal.Porejemplo:
$bashleta=4 *3
$bashdeclarepa
declarea="12"

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

Aligualquepasaconlasvariablesnormales,lasdeclaradascon let nopuedentenerespacios


entrelavariableyelsigno=,nientreelsigno=yelvalor.Noobstante,spuedentenerespaciossi
encerramoslaexpresinentrecomillas:

75
4.2.- Expresiones aritmticas

$bashletx=" (9*5) /7 "


$bashecho$x
6

4.3. Lassentenciascondicionales

4.3.1. Lassentenciasif,elifyelse
Lasentenciacondicionaltieneelsiguienteformato:

ifcondicin

then

sentenciasthenif

elifcondicin

then

sentenciasthenelif

else

sentenciaselse

fi

Ellenguajenosobligaaquelassentenciasestnorganizadasconestosaltosdelnea,aunque
tambin se puedenponerlos then enlamismalneaquelos if,paralocualdebemosusar el

separadordecomandos,queenBasheselpuntoycoma(;),as:

ifcondicin;then

sentenciasthenif

elifcondicin;then

sentenciasthenelif

else

sentenciaselse

fi

76
4.3.- Las sentencias condicionales

4.3.2. Loscdigosdeterminacin
EnUNIXloscomandosterminandevolviendouncdigonumricoalquesellamacdigode
terminacin(exitstatus)queindicasielcomandotuvoxitoono.

Aunquenoesobligatorioqueseaas,normalmenteuncdigodeterminacin0significaqueel
comandotermincorrectamente,yuncdigoentre1y255correspondeaposiblescdigosdeerror.
Encualquiercasosiempreconvieneconsultarladocumentacindelcomandoparainterpretarmejor
sus cdigos de terminacin. Por ejemplo, el comando diff devuelve 0 cuando no encuentra
diferenciasentrelosficheroscomparados,1cuandohaydiferencias,y2cuandoseproducealgn
error(p.equeunodelosficherospasadoscomoargumentonosepuedeleer).

Lasentenciaifcompruebaelcdigodeterminacindeuncomandoenlacondicin,sistees0

lacondicinseevalacomocierta.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
4.3.- Las sentencias condicionales

$bashecho$?
0

Lavariable?debedeserledajuntodespusdeejecutarelcomando,siendomuytpicoguardar
suvalorenunavariablect=$?parasuposterioruso.

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

4.3.4. Operadoreslgicosycdigosdeterminacin
Podemoscombinarvarioscdigosdeterminacindecomandosmediantelosoperadoreslgicos
and(representadacon&&)or(representadacon||)ynot(representadacon!).

Estasoperaciones,aligualqueenotroslenguajescomoCoJava,funcionanenshortcut,esdecir,
elsegundooperandosloseevalasielprimeronodeterminaelresultadodelacondicin.Segn
estolaoperacin:
ifcd/tmp&&cp001.tmp$HOME;then

fi

Ejecutaelcomandocd/tmp,ysistetienexito(elcdigodeterminacines0),ejecutael
segundocomando cp001.tmp$HOME,perosielprimercomandofalla,yanoseejecutael
segundoporqueparaquesecumplalacondicinamboscomandosdeberandetenerxito(siun
operandofallayanotienesentidoevaluarelotro).

Eloperador||porcontraejecutaelprimercomando,yslosistefallaseejecutaelsegundo.
Porejemplo:
ifcp/tmp/001.tmp~/d.tmp||cp/tmp/002.tmp~/d.tmp
then

78
4.3.- Las sentencias condicionales

fi

Aqu,sielprimercomandotienexito,yanoseejecutaelsegundocomando(yaquesetienela
condicinconquesecumpleunodesusoperandos).

Obsrvese,queadiferenciadeC,elcdigodeterminacin0eselqueindicaverdadero,y
cualquierotrocdigoindicafalso.

Porltimoeloperador!niegauncdigodeterminacin.Porejemplo:
if!cp/tmp/001.tmp~/d.tmp;then
Procesaelerror
fi

4.3.5. Testcondicionales
Lasentenciaiflonicoquesabeesevaluarcdigosdeterminacin.Peroestonosignificaque

slopodamoscomprobarsiuncomandosehaejecutadobien.Elcomandointernotestnospermite
comprobarotrasmuchascondiciones,quelepasamoscomoargumento,paraacabardevolvindonos
uncdigodeterminacin.

test[condicin]

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

[[condicin]]

esdecir,testcadena1=cadena2esequivalentea[[cadena1=cadena2]].Los
espaciosentreloscorchetesylosoperandos,oentrelosoperandosyeloperadordecomparacin=
sonobligatorios.

Usandolos test condicionales podemosevaluaratributosdeunfichero(siexiste,quetipode


ficheroes,quepermisostiene,etc.),comparardosficherosparavercualdeellosesmsreciente,
comparar cadenas, e incluso comparar los nmeros que almacenan las cadenas (comparacin
numrica).

79
4.3.- Las sentencias condicionales

Comparacindecadenas

LosoperadoresdecomparacindecadenasseresumenenlaTabla4.3.Lascomparacionesque
serealizanconlossmbolos<y>sonlexicogrficas,esdecircomparacionesdediccionario,donde

porejemploqesmayorqueperro.Obsrvesequenoexistenoperadores<=y>=yaquesepueden
implementarmedianteoperacioneslgicas.

Operador Verdaderosi...

str1=str2 Lascadenassoniguales
str1!=str2 Lascadenassondistintas
str1<str2 str1esmenorlexicogrficamenteastr2
str1>str2 str1esmayorlexicogrficamenteastr2
nstr1 str1esnonulaytienelongitudmayoracero
zstr1 str1esnula(tienelongitudcero)

Tabla4.3:Operadoresdecomparacindecadenas

Cuandoseutilizanoperadoresdecomparacindecadenas,lasvariablesqueaparezcanenla
comparacindebenirencerradasentrecomillasdobles.

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

Aunquenormalmenteseconsideramejortcnicadeprogramacinelencerrartodoelcdigo
dentrodeunbloque if yelcomportamientoerrneodentrodeotrobloque else,enestecasoel

bloqueifcorrespondeaunasituacindeerrorquedeberaabortartodoelscript,conloquevamosa

ponerunexit,ydejamoselejemplocomosemuestraacontinuacin:
#Scriptquemuestralaslneasdeunfichero
#Tienelaforma
#muestraFichero<fichero>

80
4.3.- Las sentencias condicionales

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

Comparacinnumricadeenteros

Elshelltambinpermitecompararvariablesquealmacenennmeros,paraellosedebende
utilizarlosoperadoresdelaTabla4.4

Operador Descripcin

lt Menorque
le Menoroigualque
eq Igualque
ge Mayorigualque
gt Mayorque
ne Diferente

Tabla4.4:Operadoresdecomparacinnumricadecadenas

Combinacindecondiciones.Operadoreslgicos

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

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

Tambinesposiblecombinarcomandosdelshellcontestdecondicin:

ifcomando&&[[condicion]];then

Adems,aniveldetestdecondicin(dentrodelos [[]])tambinsepuedenusaroperadores

lgicos,peroenestecasodebemosdeusarlosoperadoresa(paraand)yo(paraor).

81
4.3.- Las sentencias condicionales

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

fi

Aunqueeloperadorlgicoatienemenorprecedenciaqueeloperadordecomparacinle,en
expresiones complejasconvieneusar parntesisqueayudenaentenderlaexpresin.Siusamos
parntesisdentrodeuntestdecondicinconvienerecordardosreglas:

Losparntesisdentrodeexpresionescondicionalesdebenirprecedidosporelcarcterde
escape\(paraevitarqueseinterpretencomounasustitucindecomandos).

Losparntesis,aligualqueloscorchetes,debendeestarseparadosporunespacio.

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

fi

Comprobaratributosdeficheros

Eltercertipodeoperadoresdecomparacinnospermitencompararatributosdefichero.Existen
22operadoresdeestetipoqueseresumenenlaTabla4.5.

Operador Verdaderosi...

afichero ficheroexiste
bfichero ficheroexisteyesundispositivodebloque
cfichero ficheroexisteyesundispositivodecarcter
dfichero ficheroexisteyesundirectorio
efichero ficheroexiste(equivalenteaa)
ffichero ficheroexisteyesunficheroregular

82
4.3.- Las sentencias condicionales

Operador Verdaderosi...

gfichero ficheroexisteytieneactivoelbitdeseguridad
Gfichero ficheroexisteyesposedoporelgrupoIDefectivo
hfichero ficheroexisteyesunenlacesimblico
kfichero ficheroexisteytieneelstrickybitactivado
Lfichero ficheroexisteyesunenlacesimblico
Nfichero ficheroexisteyfuemodificadodesdelaltimalectura
Ofichero ficheroexisteyesposedoporelgrupoIDefectivo
pfichero ficheroexisteyesunpipeonamedpipe
rfichero ficheroexisteypodemosleerlo
sfichero ficheroexisteynoestavaco
Sfichero ficheroexisteyesunsocket
ufichero ficheroexisteytieneactivoelbitdesetuid
wfichero ficheroexisteytenemospermisodeescritura
xfichero fichero existe y tenemos permiso de ejecucin, o de
bsquedasiesundirectorio
fich1ntfich2 Lafechademodificacindefich1esmsmodernaque
ladefich2
fich1otfich2 Lafechademodificacindefich1esmsantiguaque
ladefich2
fich1effich2 fich1yfich2sonelmismofichero

Tabla4.5:Operadoresparacomprobaratributosdeunfichero

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

83
4.3.- Las sentencias condicionales

#!/bin/bash

#Declaraciondevariables
numArg=$#

if[[$numArg!=2]]
then
echo$0"<fichero><directorio>"
else
#Comprobacionessobreelprimerargumento:fichero
if[[a$1]]#Miramossiexisteelprimerargumento
then
echo"$1existe"
if[[f$1]]#Miramossielargumentoesunfichero
then
echo"$1esunfichero"
else
echo"$1noesunfichero"
exit
fi
else
echo"$1noexiste"
exit
fi

#Comprobacionessobreelsegundoargumento:directorio
if[[a$2]]
then
echo"$2existe"
if[[d$2]]#Comprobamossiesundirectorio
then
echo"$2esundirectorio"
else
echo"$2noesundirectorio"
exit
fi
else
echo"$2noexiste"

84
4.3.- Las sentencias condicionales

exit
fi

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

4.3.6. Ifaritmtico
Lasexpresionesaritmticaspuedenusarseenlasdistintassentenciasdecontroldeflujo,encuyo
casolaexpresinvaentredoblesparntesis,perosinel $ delante,porejemplo,el if aritmtico
tendralaforma:

if((expresinaritmtica))

then

cuerpo

fi

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

4.4. Elbuclefor
ElbucleforenBashesunpocodistintoalosbuclesfortradicionalesdelenguajescomoCo

Java;enrealidad,separecemsalbucleforeachdeotroslenguajes,yaqueaqunoserepiteun
nmerofijodeveces,sinoqueseprocesanloselementosdeunalistaunoauno.

85
4.4.- El bucle for

Susintaxiseslasiguiente:

forvar[inlista]

do

listaderdenes

done

Ejecutalasrdenesdelistaderdenestantasvecescomopalabrashayaenlista.Encada
vueltadelbucle,sealmacenaunelementodelistaenvar.

Siseomiteinlista,serecorreelcontenidode$@,peroaunquevayamosarecorrerestavariable,
espreferibleindicarlaexplcitamenteporclaridad.

Porejemplosiqueremosrecorrerunalistadeplanetaspodemoshacer:
forplanetainMercurioVenusTierraMarteJupiterSaturno
do
echo$planeta#Imprimecadaplanetaenunalnea
done

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

Pararecorrerlosargumentosrecibidosporelscript,locorrectoesutilizar$*.Eldelimitador

queusaelbucle for paralavariablelistaeselqueindiquemosen IFS,ypordefectoeste

delimitadoreselespacio,aunqueenocasionesconvienecambiarlo.

Elejemplosiguienterecorredosveceslosargumentosdeunprogramacon$*.Laprimeravez
usamoscomodelimitadorelvalorpordefectodelavariableIFS(elespacio)ylasegundavez
cambiamoselvalordelavariablesIFSparaqueeldelimitadorseanlascomillasdobles().

86
4.4.- El bucle for

#Buclesquerecorrenlosargumentos
forargin$*
do
echo"Elemento:$arg"
done
IFS='' #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

En este casolosespaciosen ((inicializacin;condicin;actualizacin))no


sonnecesarios.

Elejemplosiguientemuestraporpantallalos20primerosnmeros.

87
4.4.- El bucle for

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

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

whilecondicin untilcondicin

do do

listaderdenes listaderdenes

done done

while ejecutalasrdenesespecificadasen listaderdenes mientraselresultadodeevaluar

condicin sigasiendotrue.Porsuparte, until ejecutalasrdenesespecificadasen listade


rdenesmientraselresultadodeevaluarcondicinseafalse.

Unejemplodelusodelwhileeselsiguiente:

#!/bin/bash
i=0
while[[$ilt10]]
do
echoElcontadores$i
leti=i+1
done

EstescriptemulalaestructurafordeC,Pascal,...

Otroejemploconuntil:
#!/bin/bash
i=20

88
4.5.- Bucles while y until

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

Tantoenelbucleforcomoenelwhile,podemosusarbreakparaindicarquequeremossalirdel
bucleencualquiermomento.Elsiguientescriptimplementaeljuegodeadivinarunnmero.
#!/bin/bash
MINUM=8
while[[1]];do
echo"Introduzcaunnmero:"
readUSER_NUM

if[[$USER_NUMlt$MINUM]];then
echo"Elnmerointroducidoesmenorqueelmo"
echo""
elif[[$USER_NUMgt$MINUM]];then
echo"Elnmerointroducidoesmayorqueelmo"
echo""
elif[[$USER_NUMeq$MINUM]];then
echo"Acertaste:Minmeroera$MINUM"
break
fi
done
#Comandosinferiores...
echo"Elscriptsalidelbucle.Terminando..."
exit

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

Whilearitmtico

Aligualqueocurraconelforyelif,tambinexisteelwhilearitmtico.Tendralaforma:

89
4.5.- Bucles while y until

while((expresionaritmtica))

do

cuerpo

done

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

4.6.1. Elcomandointernoecho
Comoyasabemos,echosimplementeescribeenlasalidaestndarlosargumentosquerecibe.

LaTabla4.6muestralasopcionesquepodemospasarleaecho.

Opcin Descripcin

e Activalainterpretacindecaracteresprecedidosporelcarcterdeescape.
E Desactivalainterpretacindecaracteresprecedidosporcarcterdeescape.Esla
opcinpordefecto.
n Omiteelcarcter\nalfinaldelalnea(esequivalentealasecuenciadeescape\c).

Tabla4.6:Opcionesdelcomandoecho

La opcin e activalainterpretacindelassecuenciasdeescape,quepordefecto echo las


ignora,esdecir:
$bashecho"Ho la\nAdios"
Hola\nAdios
$bashecho e"Hola\ nAdios "
Hola
Adios

LaTabla4.7muestralassecuenciasdeescapequeaceptaecho(cuandoseusalaopcine).Para
questastenganxitodebendeencerrarseentrecomillassimplesodobles,yaquesinoelcarcter

90
4.6.- Entrada y salida de texto

deescape\esinterpretadoporelshellynoporecho.

Secuenciadeescape Descripcin

\a Produceunsonidopoom(alert)
\b Borrarhaciaatrs(backspace)
\c Omiteel\nalfinal(esequivalentealaopcinn.
Debecolocarsealfinaldelalnea
\f Cambiodepginadeimpresora
\n Cambiodelnea
\r Retornodecarro
\t Tabulador

Tabla4.7:Secuenciasdeescapedelcomandoecho

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


ejemplomuestraunscriptquepermiteirescribiendoelporcentajerealizadodeunproceso.

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

Elbucleserepitede0a9;sinembargo,siqueremoshacerlode0a100,estosecomplicayaque
estosnmerostienendistintonmerodedgitos.Parasolucionarlopodemosusar\rqueretornael

cursorenelterminalsinintroduciruncambiodelnea(comohace \n).El script quedaradela


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

91
4.6.- Entrada y salida de texto

4.6.2. Elcomandointernoprintf
Aunqueelcomandoechoessuficienteenlamayoradeloscasos,enocasiones,especialmentea
lahoradeformateartextoenpantalla,esnecesariomsflexibilidad.Paraestoscasosseutilizael
comandoprintf.

Estecomando,enprincipio,puedeescribircadenasigualqueecho:
$bashprintf "Hola mundo"
Holamundo

Sinembargo,adiferenciadeechonoimprimeelcambiodelneadelfinalpordefecto,sinoque

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

Elformatodeestecomandoesmuyparecidoaldelafuncinprintf()deC:

printfcadenaformato[argumentos]

Dentro de la cadena de formato que recibe como primer argumento pueden aparecer
especificadoresdeformato,loscualesempiezanpor%ysedescribenenlaTabla4.8.

Especificador Descripcin

%c Imprimeelprimercarcterdeunavariablecadena
%d Imprimeunnmerodecimal
%i Igualque%d
%e Formatoexponencialb.precisione[+]e
%E Formatoexponencialb.precisionE[+]e
%f Nmeroencomaflotanteb.precision
%o Octalsinsigno
%s Cadena(string)
%b Interpretalassecuenciasdeescapedelargumentocadena

92
4.6.- Entrada y salida de texto

Especificador Descripcin

%q Escribeelargumentocadenadeformaquepuedaserusado
comoentradaaotrocomando
%u Nmerosinsigno(unsigned)
%x Hexadecimalconletrasenminscula
%X Hexadecimalconletrasenmayscula
%% %literal

Tabla4.8:Especificadoresdeformatodeprintf

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

Elespecificadordeformatotieneelsiguienteformatogeneral:

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

Elsignificadodeestoscamposdependedesielespecificadordeformatoesparaunacadenade
caracteresoparaunnmero.

EnelcasodequeseaunacadenaAnchoserefierealanchomnimoqueocupalacadena.Por
ejemplo:
$bashprintf "|% 10s| \n" Hola
|Hola|

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

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

93
4.6.- Entrada y salida de texto

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

El especificadordeformato %q escribeelargumentodeformaquepuedaser usado como


entradadeotrocomando.Porejemplo:
$bashprintf "%s\n" "Hola at odos"
Holaatodos
$bashprintf "%q\n" "Hola at odos"
Hola\a\todos

Bashnopuedemanejarexpresionesconnmerosenpuntoflotante,sloenteros,perospuede
recibirlasalidadeuncomandoquedevuelvaunacadenaconunnmeroenpuntoflotante.Eneste
casopodemosformatearestenmerousando%e,%E,%f.EntoncesAnchoeselnmerototalde

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

RespectoalosFlagquepuedetenerunnmero,estosseresumenenlaTabla4.9.

Flag Descripcin

+ Precederpor+alosnmerospositivos
espacio Precederporunespacioalasnmerospositivos
0 Rellenarcon0'salaizquierda
# Precederpor0alosnmerosenoctal%oypor0xalos

94
4.6.- Entrada y salida de texto

Flag Descripcin

nmerosenhexadecimal%xy%X

Tabla4.9:Flagsdelosespecificadoresdeformatoparanmeros

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

4.6.3. Elcomandointernoread
Elcomandoreadsirveparaleerinformacindeltecladoyguardarlaenvariables.Susintaxises:

readvar1var2...

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

Siomitimoslasvariables,lalneaenteraseasignaalavariableREPLY

95
4.6.- Entrada y salida de texto

Lasprincipalesopcionesdelcomandoread,seresumenenlaTabla4.10.

Opcin Descripcin

a Permiteleerlaspalabrascomoelementosdeunarray
d Permiteindicarundelimitadordefindelnea
nmax Permiteleercomomximomaxcaracteres
p Permiteindicaruntextodeprompt

Tabla4.10:Opcionesdelcomandoread

Laopcindnospermiteindicarundelimitadordefindelneadeformaquelalneaseleehasta
encontrarestedelimitador.

Laopcin n nospermiteespecificarunnmeromximodecaracteresaleer.Siseintentan
escribirmscaracteresquelosindicadosenestaopcin,simplementeseacabalaoperacinde
lectura.

Laopcinpnospermiteaportaruntextodepromptalcomando,queseimprimeantesdepedir
eldato:
$bashread p"Cual estu nombre:"nombre
Cualestunombre:Fernando

96
4.7.- Ejercicios

4.7. Ejercicios
Todoslosscriptsplanteadosdeberntener

Uncomentariosalprincipioqueindiqueloquehace.

Comentariosalolargodelscriptparadocumentarloquesevahaciendo

En el caso de recibir parmetros, comprobacin de que el numero de parmetros

recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.

1.CreaunscriptdenombrepositivoNegativo.shquepidaunnumeroportecladoydetermine
siespositivo,negativoocero.

2.Creaunscriptquesellamecopiar.shyqueaceptedosargumentos.Elprimerargumento
representaelnombredeunarchivoexistentecuyocontenidoqueremoscopiaryelsegundo
argumento es el nombre del fichero donde se copiar el contenido. El scritp copiar el
contenido del primer fichero en el segundo fichero, haciendo todas la comprobaciones
pertinentes

a) Elnmerodeargumentosalllamaralprogramadebeserelcorrecto,sinomandarun
mensajeindicandolasintaxiscorrecta.

b) Elficheroodirectoriodadocomoprimerargumentodebeexistir,sinoexistedebe
mandarseunmensajedeerroralusuarioyfinalizar.

c) El segundo argumento no debe corresponder con ningn archivo o directorio


existentes,siloes,sedebemandarunmensajealusuarioyfinalizar.

3.Desarrollaunscriptdenombrecal.shqueimplementeunacalculadoraconlasoperaciones
bsicas(suma,resta,multiplicacin,divisin,potencia).Nota:Sepuedehacerenmenosde
cuatrolneasdecdigo.

4.Escribeunscriptllamado sumaN.sh quepidaunnmero(N)eimprimaporpantallala

97
4.7.- Ejercicios

sumadelosNprimerosnmeros.

5.DesarrollaunscriptdenombreficheroDirectorio.shquerecibaunnmeroindeterminado
deparmetros.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.- PROGRAMACIN BASH II

5. PROGRAMACINBASHII

5.1. Lasentenciacase
MientrasqueestasentenciaenlenguajescomoCoJavaseusaparacomprobarelvalordeuna
variable simple, como un entero o un carcter, en Bash esta sentencia permite realizar una
comparacindepatronesconlacadenaaexaminar.

Susintaxiseslasiguiente:

casecadenain

patron1)

Listaderdenes1;;

patron2)

Listaderdenes2;;

esac

Lasentenciacasecomparaelvalorpresenteencadenaconlosvaloresdetodoslospatrones,
unoporuno,hastaqueobienseencuentraunpatrnquecoincidaoyanoquedanmspatronespara
comparar con cadena. Si se halla un coincidencia, se ejecutan las rdenes presentes en la
correspondientelistaordenesylasentenciacasecedeelcontrol.

Cadapatrnpuedeestarformadoporvariospatronesseparadosporelcarcter|.
#!/bin/bash
readn
case$nin
*1*|*5*)echoUnooCinco;;
*2*)echoDos;;
*3*)echoTres;;
*4*)echoCuatro;;
esac

99
5.1.- La sentencia case

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

5.2. Lasentenciaselect
Lasentenciaselectnospermitegenerarfcilmenteunmensimple.Susintaxiseslasiguiente:

selectvariable[inlista]

do

Sentenciasqueusan$variable

done

Vemosquetienelamismasintaxisqueelbuclefor,exceptoporlapalabrareservadaselecten

vezdefor.Dehecho,siomitimosinlista,tambinseusapordefecto$@.

Lasentenciageneraunmenconloselementosdelista,asignaunnmeroacadaelemento,y
pidealusuarioqueintroduzcaunnmero.Elvalorelegidosealmacenaenvariable,yelnmero
elegidoenlavariable REPLY.Unavezelegidaunaopcinporpartedelusuario,seejecutael
cuerpodelasentenciayelprocesoserepiteenunbucleinfinito.

Aunqueelbuclede select esinfinito(locualnospermitevolverapedirunaopcincuantas

veceshagafalta),sepuedeabandonarusandolasentenciabreak.Lasentenciabreak,aligualque

enCyJava,seusaparaabandonarunbucleysepuedeusarenelcaso,tantodeselect,comodelos

100
5.2.- La sentencia select

buclesfor,whileyuntil.Pero,adiferenciadeCyJava,nosirveparaabandonarlasentenciacase,

sinoquestaseabandonausandodospuntosycomas;;.

El prompt queusalafuncin(mensajequesemuestraparapedirlaopcindelmen)esel

definidoenlavariabledeentornoPS3,yeshabitualcambiarestepromptantesdeejecutarselect

paraquemuestrealusuariounmensajemsdescriptivo.PordefectoelvalordePS3es#?,locual
noesunmensajequesuelagustarespecialmentealosusuarios.

Elsiguientescriptpidedosnmerosyacontinuacinmuestraunmenparaelegirquesequiere
hacerconellos(sumar,restar,multiplicarodividir).
#!/bin/bash

#Almacenamoslasopcionesdelmen
OPCIONES="SumarRestarMultiplicarDividirSalir"

#Cambiamoselpromptparaqueseamsdescriptivo
PS3="Elijaunaopcin:"
#Leemosdosnmeros
readp"Numero1:"n1
readp"Numero2:"n2

selectoptin$OPCIONES
do
if[[$opt="Sumar"]]
then
echo$((n1+n2))
elif[[$opt="Restar"]]
then
echo$((n1n2))
elif[[$opt="Multiplicar"]]
then
echo$((n1*n2))
elif[[$opt="Dividir"]]
then
echo$((n1/n2))
elif[[$opt="Salir"]]

101
5.2.- La sentencia select

then
echoFin
break
else
echoopcinerrnea
fi
done

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

5.3. Lasentenciashift
Lasentenciashift,pordefecto,desplazalosargumentosdelalneaderdenesunaposicina
laizquierda,haciendoque$2paseaser$1,$3paseaser$2,yassucesivamente.Elnmerode
posicionesquesedesplazanpuedesermayorqueunoyseespecificacomoargumentodelaorden.

Suformatoeselsiguiente:

shift[n]

donde n eselnmerodedesplazamientosalaizquierdaquequeremoshacerconlosargumentos

pasadosalscript.Siseomiten,pordefectoseconsideraqueelnmerodedesplazamientosvale1.

102
5.3.- La sentencia shift

Luego,siejecutamoselcomando shift1,$1pasaracontenerelvalorde$2,$2elde$3yas
sucesivamente.Elvalorde$1sepierde.

Unejemploclsicodelusodeestecomandosonlosscriptsconopciones.Lasopciones,aligual
quelosargumentosserecibenenlosparmetrosposicionales,esdecir,siejecutamoshacero
esto.txtaquello.txt,en$1recibimoso,en$2esto.txtyen$3aquello.txt.En
principio, paratratarlasopcionesnonos harafaltasabernadams.Elproblemaesten que
normalmentelasopcionessonopcionales,esdecir,puedendarseono,conloqueenfuncinde
quelaopcinsedeono,elscriptutilizarunosparmetrosposicionalesuotros
if[[$1=o]]
then
Ejecutalasoperacionescon$2y$3
else
Ejecutalasoperacionescon$1y$2
fi

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

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

Creacindelistas

Paradeclararunlistapodemosusarelcomandodeclareadelasiguienteforma:

103
5.4.- Listas (Arrays)

bash$ declareaA

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

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

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

Obsrvesequenohacefaltasuministrarloselementosenorden,nisuministrarlostodos,los
ndicesdondenocolocamosunvalor,simplementevaldrn"cadenanula".

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

Unaformatilderellenarunalistaesapartirdelaslneasdevueltasporunasustitucinde
comandosusandolaformadeinicializacinB=(...).Dentrodelosparntesisponemoslasustitucin
decomandos.Porejemplo,paraobtenerunalistaconlosnombresdeficherosdeundirectorio
podemosusar:
bash$ B=(`ls 1`)
bash$ declarepB
declare a B='([0]="Desktop" [1]="Documents" [2]="Library"

104
5.4.- Listas (Arrays)

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

Accesoaloselementosdeunalista

Paraaccederaloselementos,usamoseloperadorcorchete[]paraindicarelndicedelelemento

aacceder,siendoobligatorioencerrarentrellaves{}lavariable:
bash$ echo${B [2]}
Library

Sinoindicamosndicedeelemento,pordefectonoscogeelelementodendice0:
bash$ echo$B
Desktop

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

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

Podemosusarlosndicesespeciales*y@,loscualesretornantodosloselementosdelalistade
la misma forma que lo hacen los parmetros posicionales. Cuando no estn encerrados entre
comillasdobles()ambosdevuelvenunacadenaconloselementosseparadosporespacio,pero
cuandoseencierranentrecomillasdobles()@devuelveunacadenaconloselementosseparados

por espacio, y * devuelve una cadena con los elementos separados por el valor de IFS. En
cualquieradeloscasos,lalistasepierde,yloquerecibimosesunacadenadecaracteres
bash$ IFS=,
bash$ echo${C [*]}

105
5.4.- Listas (Arrays)

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

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

Dondealser${C[*]}unacadenadecaractereshubiramostambinpodidousar${C[@]}o
"${C[@]}"perosihacemos"${C[*]}"loqueobtenemosesunacadenaconloselementosde
staseparadosporelvalordeIFS(comaenesteejemplo),ynoporespacio.Sinembargoelbucle
hubierafuncionadosiloselementosestnseparadosporelvalordeIFS,ydehechoenocasiones
(p.e.cuandoloselementostienenespacios)convieneutilizarestaltimasolucin.

Loselementosdeunalistaalosquenoseasignavalortienenunacadenanula,conloqueel
bucleanteriorsloimprimiraloselementosqueexistanenlalistaC.

Podemosconsultarlalongituddeunalistausandolaforma ${#lista[@]},donde lista esel


nombredelalista.Porejemplo,enelejercicioanterior:
bash$ echo${# C[@]}
3

Elejemploanteriornosdicequehaytreselementosaunquelosndiceslleguenhastaelndice7,
yaqueexistenposicionessinasignarenlalista.Elcomando # slonosdevuelveelnmerode
posicionesocupadas.

Tambindebemostenerencuentaquedentrodeloscorchetesvauna @,ynounndice.Si

106
5.4.- Listas (Arrays)

ponemosunndice,nosdevuelvelalongitud(encaracteres)deeseelemento.Porejemplo,sienel
ndice5tenamoslacadena"Casa":
bash$ echo${# C[5]}
4

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

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

sepierdenloselementos5,6y7quetenamosasignados.

Borrarelementosdeunalista

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

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

Obsrvesequeestecomportamientoesdistintoaldeasignarunvaloralnombredelalista,que
loquehaceesasignrseloalelementodendice0.

107
5.4.- Listas (Arrays)

Opcinadelcomandoread

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

5.5. Funciones
Comoencasitodolenguajedeprogramacin,podemosutilizarfuncionesparaagrupartrozosde
cdigosdeunamaneramslgica,opracticareldivinoartedelarecursividad.

LasfuncionesdeBashsonunaextensindelasfuncionesqueexistendesdeelBourneShell.

stas,adiferenciadelosscripts,seejecutandentrodelamemoriadelpropioprocesodeBash,
conloquesonmseficientesqueejecutarscriptsaparte,perotienenelinconvenientedequetienen
queestarsiemprecargadasenlamemoriadelprocesoparapoderusarse.Actualmente,debidoala
grancantidaddememoriaquetienenlosordenadores,eltenerfuncionescargadasenlamemoriade
tieneuncosteinsignificante,conloquenoimportatenercargadasgrancantidaddestasenel
entorno.

Definicindefunciones

Antesdeutilizarunafuncin,esprecisodefinirla.Laformadedefinirunafuncinenbashes:

nombre_funcin()

comandosbash

Paraborrarunafuncinpodemosusarelcomandounsetconlasiguientesintaxis

unsetfnombre_funcin.

108
5.5.- Funciones

Cuandodefinimosunafuncin,sealmacenacomounavariabledeentorno.Paraejecutarla
funcin,simplementeescribimossunombreseguidodeargumentos,comocuandoejecutamosun
comando.Losargumentosactancomoparmetrosdelafuncin.

Podemosverquefuncionestenemosdefinidasenunasesinusandoelcomandodeclaref.El
shellimprimelasfunciones,ysudefinicin,ordenadasalfabticamente.Sipreferimosobtenerslo
elnombredelasfunciones,podemosusarelcomandodeclareF.

Siunafuncintieneelmismonombrequeunscriptoejecutable,lafuncintienepreferencia:
Estareglasehausadomuchasvecespara,engaandoalosusuarios,violarlaintegridaddesu
sistema.

Unejemplosencillodelusodefuncioneeselsiguientescript.Enlsecreandosfunciones,una
parasaliryotraparamostrarelmensajehola.
#!/bin/bash
#Definimosdosfunciones
salir(){
exit
}
hola(){
echo<Hola!
}
#Comienzaelscript
hola #Llamamosalafuncionhola
salir#Llamamosalafuncionsalir
echoFindelscript

Lasfuncionesnonecesitanserdeclaradasenunordenespecfico.Elscriptalejecutarsellama
primeroalafuncinhola,mostrandoelmensajedeHola!,acontinuacinllamaalafuncinsalir
yterminaelscript.Elprogramanuncallegaraalaltimalnea.

Elsiguientescriptesprcticamenteidnticoalanterior.Ladiferenciaestenquelafuncin
imprime muestra un mensaje que le pasemos como argumento. Los argumentos, dentro de las
funciones,sontratadosdelamismamaneraquelosargumentossuministradosalscript.

109
5.5.- Funciones

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

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

Asegurarnosdequeunavariableexiste(queestdefinidayquenoesnula).

Asignarvalorespordefectoalasvariables.

Tratarerroresqueseproducencuandounavariablenotieneunvalorasignado.

Cogeroeliminarpartesdelavariablequecumplanunpatrn.

Empezaremosviendolosoperadoresdesustitucin,paraluegoverlosdebsquedadecadenas.

5.6.1. Operadoresdesustitucin
LaTabla5.1muestralosoperadoresdesustitucin.

Operador Descripcin

Sivarexisteynoesnularetornasucontenido,
${var:valor}
sino,retornavalor.

${var:+valor} Sivarexisteynoesnularetornavalor,sino,

110
5.6.- Operadores de cadena

Operador Descripcin

retornaunacadenanula.

Sivarexisteynoesnularetornasucontenido,
${var:=valor} sino,asignavaloravaryretornasu
contenido.

Sivarexisteynoesnularetornasucontenido,
sino,imprimevar:mensajeyabortaelscript
queseestejecutando(sloenshellsno
${var:?mensaje}
interactivos).Siomitimosmensajeimprimeel
mensajepordefectoparameternullor
notset.

Retornaunasubcadenadevarqueempiezaen
offsetytienelongitudcaracteres.El
${var:offset:longitud} primercarcterdevarempiezaenlaposicin0.
Siseomitelongitudlasubcadenaempiezaen
offsetycontinuahastaelfinaldevar.

Tabla5.1:Operadoresdesustitucin

Losdospuntos(:)enesteoperadorsonopcionales.Siseomitenenvezdecomprobarsiexistey
noesnulo,slocompruebaqueexista(aunqueseanulo).

${var:valor} seutilizapararetornarunvalorpordefectocuandoelcontenidodelavariable
var estindefinido.Porejemplo, ${nombre:1} devuelve1sielcontenidode nombre est
indefinidooesnulo.

${var:+valor}porcontraseutilizaparacomprobarqueunavariabletengaasignadounvalorno
nulo.Porejemplo,${nombre:+1}retorna1(quesepuedeinterpretarcomoverdadero)sinombre
tieneunvalorasignado.

Losdosoperadoresdecadenaanterioresnomodificanelvalordelavariablevar,simplemente

devuelvensucontenido,siqueremosmodificar var podemosusar ${var:=valor} queasignaun


valoralavariablesistaestindefinida.Porejemplo,${nombre:=Paco}asignaPacoala
variablenombresistanotienevalor.

Tambin podemos querer detectar errores producidos porque una variable no tenga valor

111
5.6.- Operadores de cadena

asignado. En estecaso,usamos ${var:?mensaje} quedetectasi var notienevalorasignado y


produceunmensajedeerror.Porejemplo,${nombre:?'Eresunapersonaannima'}
imprimenombre:Eresunapersonaannima

Porltimo,podemoscogerpartesdeunacadenausando${var:offset:longitud}.Porejemplo,si
nombre valeFernandoLpez, ${nombre:0:8} devuelveFernandoy ${nombre:9} devuelve
Lpez.

Ejemplo

Imaginemosquetenemosunficheroconelsaldoyelnombredeunconjuntodeclientesconla
siguienteforma:
bash$ catcli en tes
45340JoseCarlosMartinez
24520MariCarmenGutierrez
450LuisGarciaSantos
44MarcosVallidoGrandes
500CarlosdelaFuenteLopez

Crearunscript,denombremejoresClientes.sh,queimprimalosNclientesquemssaldotengan.
Elscriptrecibircomoprimerargumentoelficherodeclientesy,opcionalmentecomosegundo
argumento,elnmero N declientesaimprimir.Sinoseproporciona N,pordefectoser5.La
formadelcomandopodraser:

mejoresclientes.shfichero[cuantos]

Paraellopodemosusarelcomandosortelcualordenalneas,ydespuselcomandoheadque
sacalasprimeraslneasdelaforma:
sortnr$1|head${2:5}

Laopcinndiceasortqueordenenumricamente(noalfabticamente)ylaopcinrdicea

sortquesaqueloselementosordenadosdemayoramenor.headrecibecomoargumentoelnmero
delneasamostrar,porejemplohead2significacogerlasprimeras2lneas.Si$2esnulose
tomapordefecto5.

112
5.6.- Operadores de cadena

Estescript,aunquefunciona,esunpococrptico;vamosahacerunoscambiosconvistasa
mejorarsulegibilidad.Porunlado,vamosaponercomentarios(precedidospor#)alprincipiodel
fichero,yvamosausarvariablestemporalesparamejorarlalegibilidaddelprograma.Elresultado
eselsiguiente:
#Scriptquesacalosmejoresclientes
#Tienelaforma:
#mejoresclientes.sh<fichero>[<cuantos>]
fichero=$1
cuantos=$2
defecto=5
sortnr$fichero|head${cuantos:$defecto}

Estoscambiosquehemoshechomejoranlalegibilidaddelscript,peronosutoleranciaaerrores,
yaquesiporejemplonopasamoselargumento$1,conelnombredelfichero,seejecutarelscript
as:
sortnr|head$5

ysortsequedaresperandoaqueentrendatosporsuentradaestndarhastaqueelusuariopulse
Ctrl+DoCtrl+C.Estosedebeaque,aunquecontrolamosqueelsegundoargumentonoseanulo,no
controlamoselprimero.

Enestecasopodemosusareloperadordecadena:?paradarunmensajedeerrorcambiando:
fichero=$1

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

Ahora,sinosuministramoselargumentoseproduceelmensaje:
./mejoresclientes:1:nosuministrado

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

Ahorasiolvidamosproporcionarelargumentovemoselmensaje:
./mejoresclientes.sh:fichero_clientes:nosuministrado

113
5.6.- Operadores de cadena

Paraverunejemplodeloperadordecadena:=podramoscambiar:
cuantos=$2

Por:
cuantos=${2:=5}

Peroestonofuncionaporqueestamosintentandoasignarunvaloraunparmetrosposicional
(quesondeslolectura).Loquespodemoshaceres:
cuantos=$2

sortnr$fichero_clientes|head${cuantos:=$defecto}

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

5.6.2. Operadoresdebsquedadepatrones
En la Tabla 5.2, se muestran los operadores de bsqueda de patrones existentes y una
descripcindesucomportamiento.

Operador Descripcin

Sipatroncoincideconeliniciodelvalordevar,
${var#patron} borralapartemspequeaquecoincidey
retornaelresto.

Sipatroncoincideconeliniciodelvalorde
${var##patron} var,borralapartemsgrandequecoincidey
retornaelresto.
${var%patron} Sipatroncoincideconelfinaldelvalordevar,
borralapartemspequeaquecoincidey

114
5.6.- Operadores de cadena

Operador Descripcin

retornaelresto.

Sipatroncoincideconelfinaldelvalordevar,
${var%%patron} borralapartemsgrandequecoincideyretorna
elresto.

Lapartemsgrandedepatronquecoincideen
varesreemplazadaporcadena.Laprimera
formasloreemplazalaprimeraocurrencia,yla
segundaformareemplazatodaslasocurrencias.
${var/patron/cadena} Sipatronempiezapor#debeproducirsela
${var//patron/cadena} coincidenciaalprincipiodevar,ysiempieza
por%debeproducirselacoincidenciaalfinal
devar.Sicadenaesnula,seborranlas
ocurrencias.Enningncasovarsemodifica,
sloseretornasuvalorconmodificaciones.

Tabla5.2:Operadoresdebsquedadepatrones

Unusofrecuentedelosoperadoresdebsquedadepatroneseseliminarpartesdelarutadeun
fichero,comopuedasereldirectoriooelnombredelfichero.Algunosejemplosdecmofuncionan
estosoperadoresson:

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

Siejecutamoslossiguientesoperadoresdebsquedadepatrones,entonceslosresultadosseran
lossiguientes:
Operador Resultado
${ruta##/*/}bios.core.bin
${ruta#/*/}local/share/qemu/bios.core.bin
${ruta%.*}/usr/local/share/qemu/bios.core
${ruta%%.*}/usr/local/share/qemu/bios

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

115
5.6.- Operadores de cadena

Ejemplo

EnelmundodeGNUexistenunasherramientasllamadasNetPBM1quepermitenconvertir
entremuchosformatosgrficos.Laherramientasueleconvertirdeformatosconocidos(gif,bmp,
jpg) a un formato interno, o bien del formato interno a los formatos conocidos. Los formatos
internosqueutilizason .ppm (PortablePixelMap)paraimgenesencolor,.pgm (PortableGray

Map)paraimgenesenescaladegrises,y.pbm (PortableBitMap)paraimgenesformadaspor

bitsdeblancoynegro.Avecesestosformatosaparecenbajolaextensingeneral.pnm,queabarca

atodosellos.Nuestroobjetivoeshacerunscriptllamadobmptojpgquerecibaunoodosnombres

defichero,elprimerodetipo.bmp yelsegundodetipo .jpg.Sinosesuministraelsegundo


argumento,elnombredelficheroserelmismoqueeldelprimerargumentoperoconlaextensin
.jpg.PararealizarlasconversionesusaremosloscomandosdeNetPBMbmptoppmyppmtojpeg.

Loscomandosrecibencomoargumentoelficheroorigenyemitenporlasalidaestndarel
ficheroenelformatodestino.

Paraobtenerelprimerargumento,odarerrorsinosenossuministra,podemosusareloperador
:?as:
fichero_entrada=${1:?'faltaargumento'}

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

Obsrvesequeparaelnombredesalidausamoseloperador:paraquesinosehasuministrado
elsegundoargumentousemoselnombredelficherodeentrada,peroconlaextensincambiada.

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

116
5.6.- Operadores de cadena

5.6.3. Eloperadorlongitud
Eloperadorlongitudnospermiteobtenerlalongitud(encaracteres)delvalordeunavariable.
Tienelaforma${#var}dondevareslavariableacuyocontenidoqueremosmedirlalongitud.Por

ejemplo,silavariablenombrevaleFernando,${#nombre}devolver8.

5.7. Sustitucindecomandos
Lasustitucindecomandospermiteusarlasalidadeuncomandocomosifueraelvalordeuna
variable.

Lasintaxisdelasustitucindecomandoses:

$(comando)

Tambinsepuedehacerutilizandolascomillasfrancesas,aunqueestanuevaformapermite
anidarsustitucionesdecomandos.

Unejemplodeusodelasustitucindecomandoses $(pwd),quenosdevuelveeldirectorio

actual,yesequivalentealeerlavariabledeentorno$PWD.

Otro ejemplo es el uso de $(ls $HOME), esta sustitucin de comandos nos devuelve una
variablecontodoslosficherosdeldirectoriohome:
bash$ midir=$ (ls $HOME)
bash$ echo$mi dir
DesktopDocumentsLibraryMoviesMusicPicturesPublic
Sitesautorjdevhometmpxcode

Tambin podemos cargar el contenido de un fichero en una variable de entorno usando


$(<fichero),dondeficheroeselficheroacargar.Porejemplo,paracargarelcontenidodelfichero
copyright.txtenlavariablecopyrighthacemos:
bash$ co pyr ight=$(< co pyr ight.tx t)

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


comandosparaabrirtodoslosquetratendeBashas:

117
5.7.- Sustitucin de comandos

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

Laopcinlhacequegrepdevuelvaslolosnombresdeficherodondehaencontradolapalabra
'bash'.

5.8. LosficherosdeconfiguracindeBash
Cadavezqueentramosanuestracuentaseejecutaelcontenidodelfichero/etc/profile,yluego

semiraaversieneldirectorio home existeelfichero.bash_profile,deserasseejecutasu


contenidoparapersonalizaraspectosdenuestracuenta.

Cualquierconfiguracinqueaadamosa.bash_profilenoserefectivahastaquesalgamosdela
cuentayvolvamosaconectarnos,sihacemoscambiosenesteficheroyqueremosverlossinsalirde
lacuentapodemosusarelcomandosource,elcualejecutaelcontenidodelficheroqueledigamos:
bash$ sour ce.ba sh_pr ofile

Alternativamentealcomando source estelcomandopunto(.),conloqueelcontenidode

.bash_profiletambinsepuedeejecutaras:
bash$ ..bash _p rof ile

Bashpermiteusardosnombresalternativospara .bash_profile porrazonesdecompatibilidad

histrica:.bash_login,nombrederivadodelfichero.logindelCShell,y.profilenombreusadopor
elBourneShellyelKornShell.Encualquiercaso,slounodeestosficherosserejecutado.Si
.bash_profileexistelosdemssernignorados,sinoBashcompruebasiexiste.bash_loginy,slo

sistetampocoexiste,compruebasiexiste .profile.Laraznporlaqueseeligiesteordende

bsqueda es que podemos almacenar en .profile opciones propias del Bourne Shell, y aadir

opcionesexclusivasdeBashenelfichero.bash_profileseguidodelcomandosource.profilepara

queBashtambincarguelasopcionesdelfichero.profile.

.bash_profileseejecutasloalentrarporprimeravez,siabrimosotroshell(ejecutandobash)

desde la lneadecomandosdeBashloquese intenta ejecutar es elcontenidode .bashrc. Si

.bashrcnoexiste,noseejecutanconfiguracionesadicionalesalabrirunnuevoshell.Esteesquema

118
5.8.- Los ficheros de configuracin de Bash

nospermitesepararconfiguracionesquesehacenunasolavez,alconectarnos,deconfiguraciones
quesecambiancadavezqueseabreunnuevoshell.Sihayconfiguracionesen.bashrcquetambin

queremosejecutaralconectarnos,podemosponersource.bashrcdentrodelfichero.bash_profile.

Por ltimo, el fichero .bash_logout es un fichero que, de existir, contiene rdenes que se
ejecutarnalabandonarlacuenta,porejemploeliminarficherostemporalesoalmacenardatosde
actividaddeusuariosenunficherodelog.

119
5.9.- Ejercicios

5.9. Ejercicios

Todoslosscriptsplanteadosdeberntener

Uncomentarioalprincipioqueindiqueloquehace.

Comentariosalolargodelscriptdeloquesevahaciendo

En el caso de recibir parmetros, comprobacin de que el numero de parmetros

recibidosescorrecto,mostrandoencasocontrariounmensajeconlasintaxis.

1.Creaunscriptdenombreopciones.shquepuedatenerunadeestasdossintaxis:

opciones.shofichero1fichero2

opciones.shfichero1fichero2

El script, en cualquiera de los dos casos, copiar el fichero1 en el fichero2,


comprobando que fichero1 existe y que fichero2 no existe. Si se utiliza para su
ejecucinlaprimerasintaxis(conlaopcino),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

También podría gustarte