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.- El sistema de ficheros

Elcomandobsicoparacrearundirectorioesmkdir.Porsuparte,siqueremoscrearunarchivo
sepuedeutilizarcualquiereditordetexto,comosevermsadelante.

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

/curso0607
/pract1/pract2/pract3

1.2.- Manipulacin

1.2. Manipulacin
Ahora que ya sabemos movernos correctamente por la jerarqua de directorios tambin
necesitamossabercmocopiar,eliminarymanipularcorrectamenteotrosaspectosdelosficheros.
Elcomandormeselqueseencargadeeliminarlosarchivosqueleindiquemos.Paraeliminarun
directorio,podemosutilizarelcomandormdir,aunquesloloborrarcuandosteestvaco.Para
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.

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.

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

greppr intf *.c

losarchivosacabadosen.c

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

1.6.- Tipos y contenidos de ficheros

Con cut podemossepararencamposelcontenidodecadalneadelficheroespecificandoqu


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

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

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

cat

visualizaelcontenidodeun
fichero

ls

listaelcontenidodeundirectorio

cd

cambiadedirectorio

man

enseaelmanualsobreun
comando

cmp,diff

comparaficheros

mdkir

creaundirectorio

cp

copiaarchivos

more

igualacat

chgrp

cambiaelgrupodeunarchivo

mv

muevearchivos

chmod

cambialospermisosdeun
archivoodirectorio

pwd

muestraeldirectorioenquenos
encontramos

chown

cambiaelpropietariodeun
archivo

rm

borraarchivos

file

indicaeltipodefichero

rmdir

borradirectorios

find

bsquedadeficheros

tail

visualizanlineasdelfinaldel
fichero

grep

buscaunpatrnenunfichero

umask

cambialospermisospordefecto
deunarchivoalsercreado

head

visualizanlineasdelcomienzo
delfichero

wc

cuentalneas/palabras

info

idemmanperomsextenso

whatis

brevereferenciasobreun
comando

less

igualacat

whereis

bsquedadearchivosbinarios

Tabla1.2:Comandosmsusuales

11

2.- 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
SPAM

Local

Sent
2006

SO

IA
EDI

ylossiguientesficherosdetextoconcontenidodetuinvencin.
Situadoeneldirectorio
SPAM

Nombredelfichero
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

Palabra0(orden)

oLaordengcc

LaNsimapalabra

2Latercerapalabra(o)

Lapalabra1delaorden

^Lapalabraserlab1.c

Laltimapalabradelaorden

$Lapalabralab1

Todalaspalabrassalvoelnombredelaorden

*Laspalabraslab1.c,oylab1

N1N2

ElintervalodepalabrasdesdeelnmeroN1alN2 23Laspalabrasoylab1
Tabla3.1:Indicadoresdepalabra

Los modificadores cambian la forma en la que el evento actual es tratado. Algunos de los
modificadoresmstilesaparecenenlaTabla3.2(elrestopuedenconsultarseenelmanualenlnea
sobrehistory).
Modificador

Descripcin

Imprimeelresultadodeunaordensinejecutarla

Eliminalarazdelnombredearchivo

Eliminalaextensindelnombredearchivo(partequesigue
alpunto)

Sequedaconlacabeceradelaruta(todomenoselltimo
componente)

Sequedaconelfinaldelaruta(ltimocomponente)
Tabla3.2:Modificadoresdelareferenciasdelahistoria
45

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

Lavariableesdetipoarray

Mostrarelnombreeimplementacindelasfunciones

Mostrarsloelnombredelasfunciones

Lavariableesdetipoentero

Lavariableesdeslolectura

Exportalavariable(equivalenteaexport)
Tabla4.1:Opcionesdelcomandointernodeclare

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

71

4.1.- Variables con tipo

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

Sinembargo,siahorausamosvariablesdetipoentero:
$bashdeclareivar1=5
$bashdeclareivar2=4
$bashdeclareiresul

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

Activalainterpretacindecaracteresprecedidosporelcarcterdeescape.

Desactivalainterpretacindecaracteresprecedidosporcarcterdeescape.Esla
opcinpordefecto.

Omiteelcarcter\nalfinaldelalnea(esequivalentealasecuenciadeescape\c).
Tabla4.6:Opcionesdelcomandoecho

La opcin e activalainterpretacindelassecuenciasdeescape,quepordefecto echo las


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

LaTabla4.7muestralassecuenciasdeescapequeaceptaecho(cuandoseusalaopcine).Para
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

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

Permiteleerlaspalabrascomoelementosdeunarray

Permiteindicarundelimitadordefindelnea

nmax

Permiteleercomomximomaxcaracteres

Permiteindicaruntextodeprompt
Tabla4.10:Opcionesdelcomandoread

Laopcindnospermiteindicarundelimitadordefindelneadeformaquelalneaseleehasta
encontrarestedelimitador.
Laopcin n nospermiteespecificarunnmeromximodecaracteresaleer.Siseintentan
escribirmscaracteresquelosindicadosenestaopcin,simplementeseacabalaoperacinde
lectura.
Laopcinpnospermiteaportaruntextodepromptalcomando,queseimprimeantesdepedir
eldato:
$bashread p"Cual estu nombre:"nombre
Cualestunombre:Fernando

96

4.7.- Ejercicios

4.7. Ejercicios
Todoslosscriptsplanteadosdeberntener

Uncomentariosalprincipioqueindiqueloquehace.

Comentariosalolargodelscriptparadocumentarloquesevahaciendo

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

${var:valor}

Sivarexisteynoesnularetornasucontenido,
sino,retornavalor.

${var:+valor}

Sivarexisteynoesnularetornavalor,sino,
110

5.6.- Operadores de cadena

Operador

Descripcin
retornaunacadenanula.

${var:=valor}

Sivarexisteynoesnularetornasucontenido,
sino,asignavaloravaryretornasu
contenido.

${var:?mensaje}

Sivarexisteynoesnularetornasucontenido,
sino,imprimevar:mensajeyabortaelscript
queseestejecutando(sloenshellsno
interactivos).Siomitimosmensajeimprimeel
mensajepordefectoparameternullor
notset.

${var:offset:longitud}

Retornaunasubcadenadevarqueempiezaen
offsetytienelongitudcaracteres.El
primercarcterdevarempiezaenlaposicin0.
Siseomitelongitudlasubcadenaempiezaen
offsetycontinuahastaelfinaldevar.
Tabla5.1:Operadoresdesustitucin

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

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

${var#patron}

Sipatroncoincideconeliniciodelvalordevar,
borralapartemspequeaquecoincidey
retornaelresto.

${var##patron}

Sipatroncoincideconeliniciodelvalorde
var,borralapartemsgrandequecoincidey
retornaelresto.

${var%patron}

Sipatroncoincideconelfinaldelvalordevar,
borralapartemspequeaquecoincidey
114

5.6.- Operadores de cadena

Operador

Descripcin
retornaelresto.

${var%%patron}

Sipatroncoincideconelfinaldelvalordevar,
borralapartemsgrandequecoincideyretorna
elresto.

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

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

Tabla5.2:Operadoresdebsquedadepatrones

Unusofrecuentedelosoperadoresdebsquedadepatroneseseliminarpartesdelarutadeun
fichero,comopuedasereldirectoriooelnombredelfichero.Algunosejemplosdecmofuncionan
estosoperadoresson:
Supongamosquetenemoslavariablerutacuyovalores:
ruta=/usr/local/share/qemu/bios.core.bin

Siejecutamoslossiguientesoperadoresdebsquedadepatrones,entonceslosresultadosseran
lossiguientes:
Operador

Resultado

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

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

115

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