Está en la página 1de 2

juejun1000:23:34CEST2004

BasesdelaprogramacinparaelBash.
ComodeintroduccinalShellscriptingsobreBash.
<PorXentoFigalhttp://xinfo.sourceforge.net>

-INTRODUCCION.
-LO PRIMERO QUE DEBEMOS SABER.
-NUESTRA LINEA DE COMANDOS.
-CUADROS DE COLORES .
-PRINCIPALES OPCIONES GENERICAS.
-DOCUMENTACION BASICA.
-EL EJEMPLO MAS SENCILLO.
-PROBLEMA.
-SOLUCION.
-USO DE VARIABLES.
-VARIABLES NUMERICAS.
-VARIABLES DE RETORNO.
-VARIABLES CON ARGUMENTOS.
-CUADRO DE VARIABLES PREDEFINIDAS.
-USANDO IF FI.
-EJEMPLO BASICO.
-EJEMPLO UTIL.
-TEST.
-OPCIONES BASICAS.
-USO.
-USO DE VARIABLES.
-USANDO CASE.
-USANDO SELECT.
-EJEMPLO UTIL.
-BUCLES.
-FOR.
-WHILE.
-BREAK.
-UNTIL.
-OTROS BUCLES.
-FUNCIONES.
-EJEMPLO PRACTICO.
-USO DE CARACTERES ESPECIALES ( COMODINES VARIOS ).
-EXPANSION DE UN COMANDO.
-EXPANSION ARITMETICA.
-EXPANSION DE SUFIJO Y PREFIJOS.
-EXPANSION DE NOMBRES.
-SCRIPTS BASH PARA X-WINDOW.
-EJEMPLO DE XDIALOG.
-ZENITY AL DESNUDO.
-KDIALOG.
-TUBERIAS.
-REDIRECCION.
-COMANDOS UTILES.
-AWK.
-SED.
-GREP,EGREP,FGREP.
-CUT.
-PASTE.
-HEAD
-TAIL.
-SORT.
-NL.
-TEE.
-JOIN.
-TR.
-BC.
-UNIQ.
-DIFF.
-CMP.
-WC.
-SOCKETS EN BASH.
-SERVICIOS BASADOS EN XINETD.
-SOCKETS CON NETCAT.
-CLIENTE DE E-MAIL CON NETCAT.
-SOCKETS CON NETPIPES.
-BASH EN TIERRAS HOSTILES.
-DEPURANDO SCRIPTS.
-APENDICE 1
-Equivalencia de comandos linux vs ms-dos.
-APENDICE 2
-Argumentos de scripts para el shell.
-REFLEXIONES IMPORTANTES.
-NOTAS DE LA VERSION.
-LICENCIA.

INTRODUCCION.
Enestedocumentonosepretendeensearanadieaprogramarnimuchomenos,elobjetivoesdistintoquierodaraentender
unaseriedeconceptossencillossobrelaprogramacinenbash(algunosdirnquenoesunlenguajedeprogramacin,pero
enInternetseencuentransoftwarescomplejos,gestindebancosdebasesdedatos,programasparacreardiagramas,yunsin
findeaplicaciones,quecuantomenos,sonfcilesdeescribir),estosconceptossonmuysencillos,bsicamenteseexplicaran
dostiposdeaplicaciones,unadirectamenteenlalineadecomandos(shell)yotraenscriptsejecutablesporlashell.
Vamosquesirveparalosqueaunnosehanenteradodeloquesepuedehacerconelshell:)
Lamaneradeescribirlointentaserfielalaprimeraversin(ao2002,unos5kbcreorecordar),enestaultimaversinyano
estanfcilacogersealoriginal,aquyaempezamosatratartemasmascomplejos,peromantengolaideadequetengauna
continuidaddelectura,amododenoticiaenunodelosnumerososblogsquepueblanInternet,deestamanerasepretende
quelosconceptosseasimilendemaneraprogresiva,novoyaexplicarelusodecondicionesantesdeexplicarqueesuna
variable,sustiposylamaneradeusarlas,delamismamaneranomequieroquedarconelejemplotilparalacomprensin
peronoparalaejecucin,deestamaneraheincluidoejemplosprcticosencasitodaslassecciones.
Porsupuestoqueelndiceestaparaalgo,puedesconsultaralgunadudaylasseccionesestnpensadasparapoderser
visitadasdemaneranica,perolaideaprincipalesparaaquellosquenuncahantocadounscriptenbash,quesehaganuna
ideaypuedancrearsuspropiosscripts,ademsseincluyenaspectosmasavanzados,comoelusodesocketsobashenotros
sistemas.
inicio

LOPRIMEROQUEDEBEMOSSABER.
Ellenguajebashescomocualquierotro,sepuedehacerloextensiblequequeramos,peroprincipalmentenoscentraremosen
aplicacionesmuyconcretas:
Elpromptsepuedemodificaralgustodelusuario.
Crearscriptsquenosfacilitenelusodiariodenuestramaquinalinux.
Serunamagnificamaneradeacercarsealaprogramacinyentenderlosfundamentosdeesta.
inicio

NUESTRALINEADECOMANDOS
Lapropialineadenuestrashellesyaensiunscriptenbash.(Basicamente,unscriptparalashellempiezapor#!/bin/basho
larutadondeseencuentreelejecutable)Sepuedenejecutarscriptsdirectamenteusandoshnombre_del_script.shoelclsico
./)
Unalineadecomandosestandartencualquierdistrosueleseresta:
[usuario@host/]#
Bienestoestadefinidoenelarchivo/etc/bashrcgeneralmenteenlalineaps$=1
Estaeslalineanormalparaunprompt"normal":PS1="[\u@\h\W]\\$"lo
quenosmuestra
[usuario@host/]
Estosepuedecambiaranuestroantojopuestoquepodemoscambiarlalineadelpromptcomomasnosguste,enmicasole
aadunreloj,lecambieloscoloresyaadilaentradacompletadelosdirectorios.
Estaeslalinea:
PS1="\[\033[0;36m\][\$(date+%H%M)]\[\033[0m\]\[\033[0;33m\][\u@\H\W]\\:\[\033[0m\]"
Aquiusamoscdigosdecolor,[0;36m]y[0;33m]ylasopcionespropiasdelshell,\u\H\Wmasunafuncin($date)y
argumentos,lahora%Hylosminutos%M.
Elusodedelineas\(barrainvertida)nossirveparasepararunascosasdeotras,oenelcasodeopcionesinternas(\n\Hetc...)
paradeterminarlasyparavolveralcolororiginalusamos\033.
Siestonolotienesnadaclaronotepreocupesecharleunvistazoaloscdigosdecoloryopcionesparaelbasheneste
documento.
Observesequelosespaciosentrecaracteressondefiniblesporelusuario.
Tambiensepuedenhacercambiosnopermanentes,simplementemetiendoargumentosenlalineadelashellestoesta
explicadoenotroarticulo,lautilidaddeestoestafueradetodaduda.
Perosobretodo,cabedestacarlautilidaddeincluirscriptsenbashenlashell,yobienhacerlosfijosono,paraincluirscripts
lonicoquedebemoshaceresaadirloenelbashrc,obienhacerunscriptquenosmodifiquelashellalejecutarlo,yque
luegopodamosterminarelprocesoyvolveralashellquetengamosdefinida.
inicio

CUADROSDECOLORES
Negro0;30Grisoscuro1;30
Azul0;34Azulclaro1;34
Verde0;32Verdeclaro1;32
Cyan0;36Cyanclaro1;36
Rojo0;31Rojoclaro1;31
Purpura0;35Purpuraclaro1;35
Marron0;33Amarillo1;33
Grisclaro0;37Blanco1;37
inicio

PRINCIPALESOPCIONESGENERICAS
\acaracterdecampanaASCII(07)
\dlafechaenformatoodiap.ej.,marmay26)
\ecaracterdeescapeASCII(033)
\helnombredelhosthastaelprimer.
\Helnombredellamaquinacompleto(FQDN)
\ncaracterdenuevalinea
\rretornodecarro
\selnombredelshell,elnombrebasede$0(elfragmentoquesiguealaultimabarra)
\tlahoraactualenformato24horasHH:MM:SS
\Tlahoraactualenformato12horasHH:MM:SS
\@lahoraactualenformato12horasAM/PM
\uelnombredeusuariodelusuarioactual
\vlaversiondebash(p.ej.,2.0)
\Vlaversiondelpaquetedelbash,version+patchlevel(p.ej.,2.00.0)
\weldirectorioactualdetrabajo
\Welnombrebasedeldirectorioactualdetrabajo
\!elnumerodelcomandoactualenelhistorico
#elnumerodecomandodelcomandoactual
\$sielUIDefectivoes0,un#;enotrocaso,$
\nnnelcaractercorrespondientealnumeroenoctalnnn
\\unacontrabarra
\[iniciodeunasecuenciadecaracteresnoimprimiblesquepuedenusarseparaincrustarunasecuenciadecontroldel
terminalenelprompt.
\]findeunasecuenciadecaracteresnoimprimibles

inicio

DOCUMENTACIONBASICA
Hayunoscuantosdocumentosmuybuenossobrelaprogramacinenbash:
[http://www.tldp.org/LDP/abs/html/]
Ultimaversiondeladvancedbashscripting,sencillamentetodosaledeestemagnifico"libro"conunacantidadquenoes
normaldeejemplos,sibuscaslamadredetodosloshowto,comos,etc,etcsobrelosscriptsparaelbashestaeslapagina.
[http://org.laol.net/lamug/beforever/bashtut.htm]
Eninglesperomuycompleto,unarevisinantiguadelanteriordocumento,unacantidadincrebledeejemplos,usandoawk,
perl,ytodoloquemedejoporponer(queesmucho),opcionesydemsdigamosqueimprescindible.
[http://www.shelldorado.com]Excelentepaginadodneencontrarmiles(noescriboensentidofigurado)deejemplos,
documentacion,articulosymuchisimomaterial.
[http://es.tldp.org/COMOINSFLUG/COMOs/BashProgIntroCOMO/]
UnodelosnicoshowtocompletosenESPAOL(mehaservidoparalastablasdecolor,elbucleforC,ylastablasde
opcionesgenricas).
[http://cs.bilgi.edu.tr/pages/courses/year_1/comp_151/examples/bash/]
Ejemplosmuyprcticosyexplicados.
[http://gyulai.freeyellow.com/en/linux/bash.html]
Muybuenoeningles.
[http://clri6f.gsi.de/gnu/bash2.01/examples/scripts.noah/]
Scriptsexplicadosmuyperomuybien.
[http://www.linups.org/modules/documentacion/gdialog/]
Buenhowtodedialog,mcdialogygdialogenESPAOL.
[http://www.linuxfocus.org/Castellano/November2002/article267.shtml]
Unaexplicacinconsencillosperoclarosejemplos,concapturasdepantallayloquenostieneacostumbradoslinuxfocus,
sobreXdialog.yenESPAOL
[http://www.terra.es/personal/garzones/shellscriptsmicrocomo.html]
UnmicrocomoenESPAOLsobrelaintroduccindelbashscripting,tienesusitioporquecadaunoexplicamoslascosas
deunamanera,estaespaolytalvezhaycosasqueaqupuedasentenderyenotrossitiosno(esteincluido).
[http://ulysses.gulic.org/]
Paginasdelgrupodeusuariosdelinuxdegrancanarias,conunsoftwareinteresante,unprogramadecontabilidaddomestica
echoenbashcondialogyposibilidaddeusarXdialogenESPAOL.
[http://igor2.mcomp.hu/gpl/tetris.sh/]
Unaversiondelpopularjuegotetrisparaelbash,XDvalelapenaverloenaccin.
inicio

ELEJEMPLOMASSENCILLO
Buenocomobienseexplicaantes,lasutilidadesdelashellsoninfinitas,acontinuacinvoyaexplicarlosscriptsmasfciles
paraelshell.
Ejemplo1:
Problema:
Enunmenutipoblackbox,wmaker,fluxbox,ice,etc,,,queremosincluirunaorden,estaordenesunallamadaalterminalcon
argumentos,peroqueestosargumentosdefinenunprocesooprogramaqueterminaynorequiereintervencindelusuario,
massencilloqueestopongounejemplo:
llamamosaunterminalparaquenosmuestreinformacinsobreparticiones,conexionesmemoria,etc,,,comoeslgiconos
estamosrefiriendoal/proc/blahperovamosquepodramoshacerlollamandoacualquierarchivo,buenolaordenensi:
xtermecat/proc/partitions
Cuandoejecutemosestoenunmenudelosanteriores,resultaraquecuandoterminedemostrarlainformacinelterminalse
cierra,estounproblemadirectamentedelabash,buenonoesunproblema,masbienesnecesarioyasestadefinido,
imaginarosquedebemosinterrumpirsiemprequehagamosunls,enfinimaginaros...

Elproblemasepresentaenquesiaadimoslaorden|lessalfinaldelargumento,sequedaigual,estopasaporqueun
comandocuandotermina,tiendea"automatarse".
Esimportanteesteconcepto,puestoquenotenerloencuentanospuededardoloresdecabezaenloserroresdealgunos
scripts.
Solucion:
Scriptparabashquenosejecutelaordenyyaesta,asdesencillo.
Ejemplodelaslineasdelmenu:[exec](infoparticiones){Eterme/scriptsbash/particiones}
Aquillamamosaejecutarunaorden:EtermaEtermledecimosqueejecutealgo(e),esealgoesunscriptparalabashquese
encuentraen/bashscript/ysellamaparticiones,buenoyasequeestoesobio,peroporsiacasoXD,bienclaroesto,vamosa
verelscriptencuestin:
#!/bin/bash
cat/proc/partitions
Estoessencillodefinimoselinterpreteenlaprimeralinea,despuselcomandoquequeremosejecutar.
#!/bin/bash
echoInformaciondelasparticiones
execcat/proc/partitions|less
done
Comosepuedever,lamaneradeejecutaralgoenunscriptparaelbashesextremadamentesencilla,usamoslaprimeralinea
paradecirledondeestaelinterpretedespusconechomostramosinformacinenpantallacomounprintf,despususamos
execparaejecutaruncomando,yacabamoscondoneparaindicarquenotenemosnadamasquehacer.
Otroejemplotil,montarunaparticindeundiscoduroextraiblesintenerquemetertodoslosargumentos,yclaronos
evitamosdeescribirdirectamenteelfstab,puestoqueeldiscounosdiasestayotrosno.

#!bin/bash
echomontandoparticin
execmounttext3dev/hdc5/mnt/otrolinux
done

Sinestonolosabiasonoloentiendesbien...meparecequepocopodemoshacer,deberaleerladocumentacinsobrelinux
queexplicaelusobsicodelsistema,[http://www.linuxparatodos.com]esunbuensitioparacomenzaracomprenderquees
linuxyquepuedehacerporti(otuporel).
inicio

USODEVARIABLES
Elscriptcomopodisveresdelomassencillodelmundo,perotambinestilalmximo,puestoquenospermiteverel
resultadoenpantallaynocierraelterminalhastaquenosotrosselodecimos,usamoslaordenlessquemiratupordondesi
funcionasiloaplicamosaunscriptparaelbash,comosepuedeimaginarlasposibilidadessoninfinitas,ysiusamos
variablesmuchomas,unamanerasimplededefinirunavariable:
#!/bin/bash
variable1=holamundo
$variable1
Elresultadoesobio:
holamundo
Aquipermitimosunaentradaylausamoscomovariable:
#!/bin/bash
echoArchivoabuscar:
read$ARCHIVO
find/'!'typedname"$ARCHIVO"print0
Puesaqulotenis,hemosintroducidounavariableenuncomando,queasuvezcontieneopciones,estescriptesbuenopara
buscararchivosenmodogeneral,ademssepodraintroducirunaseriedevariables,definidasporelusuario,quepodemos
colocarcomoargumentosdefiniblesdelcomando,porejemplo:
#!/bin/bash
echoIntroduzcanombredelarchivoydirectorio,separadosporunespacio:
readARCHIVODIRECTORIO
find/$DIRECTORIO'!'typedname"$ARCHIVO"print0
Buenocomoestoseha"complicado"unpocomas,lovoyaexplicarpasoapaso:
Conechointroducimosuntextoqueaparceraenpantalla.
Conreaddejamosqueelusuariointroduzcadatos,yestossonlasvariablesqueusaremosparadefinirlosparmetrosenel
comando.
Despuesintroducimoslasvariablesenelcomandositundolasdondeestnlosparmetrosdeeste.
Elusuarionodeberaintroducireloperador/parallamaraldirectorio,estopuedesertilonodepende,peroestolopodemos
cambiaraantojo,simplementecambiandolavariable,esperoquequedeclaro.
Fijatequeenalordenoriginaldelcomando,esdecirdirectamentesobrelashell,las"sonremplazadaspor'yestasnose
representancuandointroducimoslavariable.
Esteesotrodeesosdetallesimportantessiunscriptnohaceloquetuteniaspensado
Porsupuesto,lasvariablestambinpuedenserdetiponumricoysepuedenejecutaroperacionesconlosnmeros
lgicamente.
#!/bin/bash
numeroA=2
numeroB=5
frase="escorrecto"
suma=$[$numeroa+$numerob]
multiplica=$[$numeroa*$numerob]
divide=$[$numeroa/$numerob]
resta=$[$numeroa$numerob]
echo"2+5=$suma$frase"
echo"2*5=$multiplica$frase"
echo"2/5=$divide$frase"
echo"25=$resta$frase"
Ademasdeestosejemplos,tambinexistelavariablederetorno,estaeslaresultantedelaejecucindelcomandoanterior,
solopuedeser1o0,dependiendodesielprocesofinalizoconexitoono,estoestilparadeterminarcondicionessintener
quecalentarnosmaslacabeza,porejemplo:
#!/bin/bash
lsdirectorio_real
echo"elvalordelavariablees:$?"
echo""
Sieldirectorioesrealnosdevolver0
Paradaropcionesaunscripthayqueusarunmododistintodepasarleargumentos,estassonlasvariablespropiamente
dichas.
#!/bin/bash
echo"\$0es$0"
echo"\$1es$1"
echo"$#parmetros"
Siejecutamosestescriptnosdaremoscuentadequenosdevuelveesto:
$0es(nombredelscript)
$1es
0parmetros
Comosepuedeverelaplicarunabarra\nospermite"escapar"enestecaso"escapamos"dequeenelscriptleaelparmetro
$0y$1comotextonormalynocomovariables.
Comonohemosintroducidonadalasvariablespermanecenvacas,sihubiramosejecutadoelscriptconargumentosnos
devolveraotracosa:
$./nombredelscripthola
Estonosmostraraenpantalla:
$0esnombredelscript
$1eshola
1parmetro
Creoqueseentiendebienelusodeestetipodevariables.
Usandovariableslocalesenfunciones(verseccinfunciones):
#!/bin/bash
variable=hola
functionhola{
localvariable=hola
echo$variable
}
Usandolasalidadeuncomandocomovariable:
#!/bin/bash
var1=$(free|grep"buffers")
echo"$var1"
Estescriptnosmostraraelequivalenteaejecutarfree|grepbuffersenunaconsola.
inicio

CUADRODEVARIABLESPREDEFINIDAS
$$Elnumeroidentificadordelprocesodelshell.
$?Resultadodelaejecucindelcomandoanterior.
$0Nombredelscriptqueseestaejecutando
$1$9Primeranovenoargumentoconlosqueseinvoca.
$*Todoslosargumentoscomonicapalabraseparador_.
$@Arraycontodoslosargumentosperoconposicin.
$#Numerodeargumentosrecibidos.
inicio

USANDOIFFI
Logicamentenosharafaltausarcondicionantesparapoderdotaralosscriptsdecierta"interactividadytomadedecisiones",
paraeso
usaremosiffi.
Unprogramaparamontarparticionesusandodilogos,parmetrosdefinidosporelusuario,coloresypocomassoloseusaif
fiparailustrarloademsreadparaqueelusuariointroduzcavariablesyseleponencoloresparahacerlomasatractivoyse
ilustraele,quenossirveparaejecutarenlamismashell,recordiselasuntodelprompt.
Ejemplobsicodeiffi:
#!/bin/bash
variable=verdadero
if["$variable"="verdadero"];then
echo"lavariableescorrecta"
else
echo"lavariablenoescorrecta"
fi
Enestecasonosvalemosdeeloperador=paraindicarquesilavariable1esigualalapalabraverdaderoseejecuteuna
accin,pensarqueesavariablepuedeserintroducidaporelusuario,comoveremosenelsiguientescript,masadelante
tenisunalistadeoperadores.
Aquitenisunscriptquehacealgotil;montarparticionesusandodilogos,parmetrosdefinidosporelusuario,coloresy
pocomassoloseusaiffiparailustrar,readparaqueelusuariointroduzcavariablesyseleponencoloresparahacerlomas
atractivoyseilustraele,quenossirveparaejecutarenlamismashell,recordis;elasuntodelprompt.
#!/bin/bash
echoe"\033[432mMONTAPARTICIONESPORXENTO\033[0m"
echoeDeseaayudasobreelprograma?"\033[34msi\033[0m"o
"\033[34mno\033[0m".
readA
if["$A"="si"];then
echoEsteesunscriptparafacilitarelusodelcomandomount
echoselepedirndatossobrelosparmetrosusadosporelcomando.
echoSielijelaopcinmostrarparmetrosdemontajeentrarenelmandelmismo.
echoPrimero:deberaintroducirelnombredelaparticin.
echoSegundo:deberaintroducireldirectoriodemontaje.
echoTercero:deberaintroducireltipodeparticin.
echoCuarto:deberadefinirlosparmetrosdemontaje.
else
echo
fi
echoeDeseaverlatabladeparticiones?"\033[34msi\033[0m"o
"\033[34mno\033[0m".
readV0
if["$V0"="si"];then
cat/proc/partitions
else
echo
fi
echoIntroduzcaelnombredelaparticin:
readV1
echoIntroduzcaeldirectoriodondequieremontarlaparticinconlarutacompleta
readV2
echoeDeseaverlostipossoportadosporsukernel?
"\033[34msi\033[0m"o"\033[34mno\033[0m".
readV00
if["$V00"="si"];then
cat/proc/filesystems
else
echo
fi
echoIntroduzcaeltipodeparticin:
readV3
echoeDeseaverlosparmetrosdemontaje"\033[31m(semuestraman)\033[0m"?"\033[34msi\033[0m"o"\033
[34mno\0330m".
readV01
if["$V01"="si"];then
manmount
else
echo
fi
echoIntroduzcalosparmetrosdemontaje:
readV4
echoeSonestoslosdatoscorrectos:mount$V4$V3/dev/$V1$V2?"\033[34msi\033[0m"o"\033[34mno\033[0m".
readR
if["$R"="si"];then
execmount$V4$V3/dev/$V1$V2
else
echoe"\033[731mINTRODUZCALOSDATOSDENUEVO\033[0m"
echo
echo
exec./nombredelscript
fi
echoParticionmontadacorrectamente
Enestescripthemosusadoifyfiparadefinirlosparmetrosdelusuario,yusandovariables,definimosquecosassedeben
ejecutar,elscriptesrealmentesencilloperoilustrabienelusodeiffi.
inicio

TEST
Parausariffihemosusadounnuevoelemento,loscorchetesqueevalanlascondiciones,estoestabasadodirectamenteen
test,testnossirveparaevaluarcondiciones.
Opcionesbsicasdetest
ltMenorque
eqIgualque
gtMayorque
leMenoroigualque
geMayoroigualque
neNocoinciden
a
Operadorlgicoand
exp1aexp2.
o
Operadorlgicoor
exp1oexp2.

Usodetest:
test8lt9
Usandovariablesentest:
variable1=5
variable2=3
test$variable1gt$variable2
Otraopcinmuytildeusodetest:
[3lt5]
Paraqueentendermejortestmiraresteejemplo:
#!/bin/bash
variable1=5
variable2=3
[$variable1lt$variable2]
echo$?
Aquihemosevaluadodosvariablesparaversilavariable1eramenorquelavariable2yparaverelresultadohemosacudido
alavariablederetorno,quenosmostrara0o1.
inicio

USANDOCASE
Paraevitarescribirtantosiffi(aunquenotienenadademalo:)podemosagruparunaseriedevariablesusandocase,aqu
estaelmismoejemploperoconcase.
Casenosseramuytilporejemploenestecaso,loquenospermitecaseescomprobarvariables,elusodecaseenestescript
esqueelusuarioalintroducirunaopcinestapasandounargumentoquesicoincideconunavariabledefinidaejecutarauna
partedelprograma.
Fijateenquesemuestran6lineasdetextoconunadiferenciarespectoalasanterioreslas""yeloperadornumricoentre
[1....n]sonlasusadasparaasociarlasalosnmeros.
1)
...n)
Loquesigueaestosnmerossonlasinstruccionesquedeberaejecutarelprograma.
Dejamosun*)porsielusuarionointroduceunaopcinvalida(variablenodefinida).
Ydespusseguimosconlaejecucindelscript.
#!/bin/bash
echoe""
echoe"33[432mMONTAPARTICIONESPORXENTO33[0m"
echoe""
echoe"33[34m[1]33[0m""Iniciarelprograma"
echoe"33[34m[2]33[0m""Mostrarayuda"
echoe"33[34m[3]33[0m""Mostrartabladeparticiones"
echoe"33[34m[4]33[0m""Mostrartipossoportadosporelkernel"
echoe"33[34m[5]33[0m""Mostrarmandelcomandomount"
echoe"33[34m[6]33[0m""Salirdelprograma"
echo"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo"Introduzcaunnumero"
readtuseleccion
case$tuseleccionin
1)echo;;
2)echo"Esteesunscriptparafacilitarelusodelcomandomountsele
pedirndatossobrelosparmetrosusadosporelcomandomount"
echo"Primero:deberaintroducirelnombredelaparticin"
echo"Segundo:deberaintroducireldirectoriodemontaje"
echo"Tercero:deberaintroducireltipodeparticin"
echo"Cuarto:deberadefinirlosparmetrosdemontaje";;
3)cat/proc/partitions;;
4)cat/proc/filesystems;;
5)manmount;;
6)exit0;;
*)echo"Porfavorintroduzcaunnumerodeopcinvalido1,2,3,4,5";
echoe"Secontinuaconalejecucinnormaldelprograma33[731mcontrol+cparasalir33[0m";;
esac
echoe"33[432mIntroduzcaelnombredelaparticin:33[0m"
readV1
echoe"33[432mIntroduzcaeldirectoriodondequieremontarlaparticinconlarutacompleta33[0m"
readV2
echoe"33[432mIntroduzcaeltipodeparticin:33[0m"
readV3
echoe"33[432mIntroduzcalosparmetrosdemontaje:33[0m"
readV4
echoe"33[431mSonestoslosdatoscorrectos:mount$V4$V3/dev/$V1$V2?33[0m""33[34msi33[0m"o"33
[34mno330m".
readR
if["$R"="si"];then
execmount$V4$V3/dev/$V1$V2
echoParticionmontadacorrectamente
else
echoe"33[731mINTRODUZCALOSDATOSDENUEVO33[0m"
echo
echo
exec./montaparticiones
fi
Buenoestonosdamasinteractividadynosahorralineasdecdigo,esotramaneramasdecomosepuedenhacerlascosas
Hayquedestacarllegadosaestepunto,quelainteractividaddelshellesimpresionante.
inicio

USANDOSELECT

Porsupuestoqueelbashofrecemuchasmasopciones,unamaneradistintaeselusodeselect.

#!/bin/bash
variables="montarsalir"
selectoptin$OPCIONES;do
if["$opt"="montar"];then
echo"Introduzcaelnombredelaparticin"
readv1
echo"Introduzcadirectoriodemontaje"
readv2
echo"introduzcatipodearchivos"
readv3
execmountt$v3$v1$v2
echo"particinmontada"
exit
elif["$opt"="salir"];then
exit
else
clear
echo"opcinincorrecta"
fi
done

Comosepuedeverestemtodoesmuyparecidoausarunbucle,peropuedesertil,esosinosimposibilitaavozdepronto
mostrarlasaccionesasociadasacadavariable,porloquesedeberamostrarinformacinenpantallaantessobreestas.

inicio

BUCLES

Losbuclesnossirvenbsicamenteparadefinirloquequeremossehagasisecumpleunacondicin,existenvariostiposde
bucles,cadaunotienemasomenosdefinidaunaaccin.

Elbucleforpermiteiterarsobreunaseriede`palabras'contenidasdentrodeunacadena.

Elbuclewhileejecutauntrozodecdigosilaexpresindecontrolesverdadera,ysoloseparacuandoesfalsa(ose
encuentraunainterrupcinexplicitadentrodelcdigoenejecucin).

Elbucleuntilescasiidnticoalbucleloop,exceptoenqueelcdigoseejecutamientraslaexpresinndecontrolse
evalecomofalsa.

FOR
#!/bin/bash
foriinv1v2v3v4;do
echo"Estassonlasvariables$i"
Estescriptnosmostraraenpantallaesto:
Estassonlasvariablesv1Estassonlasvariablesv2Estassonlasvariablesv3Estassonlasvariablesv4
Laexplicacincreoquequedaclara.

WHILE
#!/bin/bash
MINUM=8
while[1];do
echo"Introduzcaunnumero:"
readUSER_NUM
if[$USER_NUMlt$MINUM];then
echo"Elnumerointroducidoesmenorqueelmio"
echo""
elif[$USER_NUMgt$MINUM];then
echo"Elnumerointroducidoesmayorqueelmio"
echo""
elif[$USER_NUMeq$MINUM];thenecho"Acertaste:Minumeroera$MINUM"
breakfi
done
Conesteejemploloquehemosechoessencillo,evaluarunavariableusandounbucle.Noshemosvalidodealgunos
operadoresdetestydeiffi.
BREAK
Ademasntesequehemosterminadoelbucleconbreak,estaesunamagnificamaneradeterminarnuestrosbucles.
UNTIL
#!/bin/bashCONTADOR=20until
[$CONTADORlt10];doechoCONTADOR$CONTADOR
letCONTADOR=1
done
Esteejemploilustramuybienelusodeuntil,enestecasoelbuclesereproduceconunacondicinquevaria(let)cuandoel
bucleseejecutaporloquealfinalsecumplelacondicinyterminaelbucle.
OTROTIPODEBUCLE
UsandosintaxistipoC.
((a=1))while((a<=LIMIT))do
echon"$a"((a+=1))#let"a+=1"
done
echo
OtramaneradeusarlasintaxisestiloC
#!/bin/bash
foriin`seq110`;
doecho$idone
Enla[18]detodosloshowtosobrebashscripting,hayunmontndeejemplosdecomohacerbuclesdemanerasdistintas.
inicio

FUNCIONES
Lasfuncionesnossirvenparatenercdigodentrodelcdigo,esdecirpodremosejecutarpequeosonotanpequeotrozos
decdigocomosisetratasendescriptsdistintos,estoestilsobretodoparadefinirvariables,sobretodosiesasvariablesno
poseenunvalorfijo.
functionhola{
echo"holamama"
}
Estafuncinnosdevolveraenpantalla:holamama,paraaccederaestafuncinsolohayquellamarlacomosiuncomando
massetratase.
Escribiunpequeo[20]sobreelprompt,enelexplicoqueesycomousarunafuncin,perocomoesteesotrodocumento,
puespondremosmasejemplos.
#!/bin/bash
functionmemf{
execfree|grepMem|awk'{print$4}'}
functionmemt{
execfree|grepMem|awk'{print$3}'}
functioncpu{
exectopn1|grep"CPUstates"|awk'{print$3+$5"%"}'}
functiondate{
execdate|awk'{print$1""$3""$2""$6}'}
echo"Informaciondelsistema"
memf
memtcpu
date
exit
Estescriptnosmostraraloquelasfuncionescontienen.
inicio

USODECARACTERESESPECIALES(COMODINESVARIOS)
Loscaracteresespeciales,sonconsideradosporelshellcomoparmetrosespeciales,dehayquenombresdevariables,con
estosnoseanunabuenaidea.
Var*?=holaMalaeleccion
var10=holaMalaeleccin
var1_0=holaBuenaopcin
["$number"<5]Malaeleccin
["$numero"lt5]Buenaopcin
Laexpansindeuncomando
Lasalidaproducidaporuncomando,substituyealpropiocomando.(comando)'comando'producenlasalida,noseejecutara
elcomando.
'execemacs'
Mostrariaenpantallaeltextoexecemacs,siporelcontrariosimplementenoloencerramosseejecutaraemacs.
Laexpansinaritmtica.
Elshellevalaunaexpresinymuestrasuresultado:((1+1))mostraraenpantalla2
Laexpansindesufijosyprefijos.
Ejemplotilymasclaroqueperdermeenexplicaciones.
Echohola{mundo,mama,pepe}adis
Estonosmostraraenpantalla:
holamundoadis
holamamaadis
holapepeadis
Laexpansindenombresdefichero.
Encadapalabraqueaparezcancaracteresespeciales*?|elshelltrataraesapalabracomounpatrn,P.ejm:
ls*.rpmEstodevolveratodoslosarchivosconextensin.rpm
Otrasexpansiones.
~estosubstituyetodaslaspalabrasporargumentosdeundirectoriodeusuario.
~xento/estonosmandaraaalhomedelusuarioxento.~/nosmandaraaldirectoriohomedelusuarioqueejecuteelscript.
Var=hola{var}Estonosmostraraelvalordelavariablevar,esdecirnosmostraraenpantallahola.
inicio

SCRIPTSBASHPARAXWINDOW
Unamaneradecrearscriptsqueparecensoftware,yesmasconmultituddeopcionesesXdialog.
Estaesunaherramientaquesubstituyeadialogocdialodyqueusagtkparacrearventanasdeunamaneramuysimple,
bsicamentelasintaxiseslamismaqueparaelbash.documentacinydescarga,mirarenestaweb[23]paraverlas
posibilidadesdeXdialog
Ejemplodeunaventana:
xdialogtitle"Esteeseltitulo"msgbox"Esteeseltextodelaventana"00
Estonosmostraraunapantallaengtkconeltexto:
Esteeseltextodelaventana
Xdialogesunbuensubstitutodedialogocdialog,yposenumerosasopcionestpicasencualquierlenguaje,crearentradasde
texto,listadebotones,botonesdeconfirmacin,dilogosyesno,opcindeabrirarchivo,textoeditable,etc...
UnEjemplotil.
<Mostramoslasalidadeuncomandoylapasamosaunfichero>
psaux|expand>>/tmp/textboxjobs.tmp.$$
<despusmostramosesearchivoenunacaja>
xdialogtitle"Actualesprocesos"textbox"/tmp/textboxjobs.tmp.$$"00
<pedimosalusuarioqueintroduzcaunavariable>
V1=`xdialoginputbox"introduzcaelnombredelatareaaterminar"8402>&11>/dev/tty`
<lavariablees'V1',yusamoslasalidaattyparapoderguardarla>
<Usamoslavariableparameterlaenuncomandodirectoalbash>
execkillall9$V1
<Cajadeconfirmacin>
dialogtitle"$V1"msgbox"Latarea$V1asidofinalizadaconexito"00
Xdialogposeeunabuenacantidaddeejemplos,detodaslasfuncionesquepodemoshacerconelenladocumentacinque
acompaaalpaquete.
ZENITYALDESNUDO
ZenityesunprogramaquenospermiteusarciertosargumentosparacrearventanasusandoGTK.
Elporquehedecidoextendermemasconestequeconotro,tieneunasencillaexplicacin;ltimamentehecreadoalgunas
cosasconel,ypuedodarunejemplodeestructuradetrabajoconestosejemplos,yasdejarmasclaroelusodeestos
programas(xdialogykdialog)engeneral.
Posibilidadesdezenity
Mostrartextoenunaventana(text).
Podemosdefinirlaalturayanchuradelaventana.
Podemosdefinirelicono(error,warning).
Tambientenemoslaposibilidaddeindicarcualseraeliconodelaventana(windowicon)
Ademaszenitynospermiteusarlistasdeelementosycheckboxesconposibilidaddehacerlaseditables,yconfigurarlas
cabeceras.
Calendarioyseleccindedias,meses,aosyformatodelcalendario.
Dialogostipoyes/no(question).
Barrasdeprogreso(progress)conopcionesdistintas,autocerrarse,indicadordeltantoporciento,textodeldialogoy
enunciado.
Mostrartextoenunaventana(filename)hacerloeditableo/yocultarlo.
Tambiennospermitelaseleccindearchivos(fileselection).
Yusarunaentradadetexto(entry)conposibilidaddeintroduciruntextopredeterminado,omostrareltextoqueseescribe
comoasteriscos.
Formasdetrabajoconzenity.
Ejemplobsico:
#!/bin/bash
zenitytitle"titulodelaventana"infotext"holamundo"
Laopcininfo,puedeserotra(question,warning,error)
Siusamoslaopcinquestionelresultadonosdevolver0o1quesealmacenaenlavariable$?,vercuadrodevariables
predefinidas.
Ejemplousandovariablesderetornoydilogostipoyes/no
#!/bin/bash
zenitytitle"titulodelaventana"questiontext"Aceptar?"
if["$?"="0"];then
zenityinfotext"Hasaceptado"
else
zenityinfotext"Nohasaceptado"
fi
Trabajandoconfechas
#!/bin/bash
zenitycalendar
Estesencilloscriptnosmuestrauncalendariocompleto,dondepodemosirhaciadelanteohaciaatrasenel.
Sipulsamosaceptarnosdevuelvelafechadelaseleccin,estoesinteresanteporsuposibilidaddeaplicacin
#!/bin/bash
var=$(zenitycalendartext"Seleccionaunafecha")
zenityquestiontext"Hasseleccionado$var"
Enesteejemploquedailustradocomo"aprovechar"estaopcinparaalmacenarlacomovariable,simplementeusoun
comandocomovariable.
Enlacreacindelistas,sepuedenusarloselementosdelaslistasdelasiguientemanera,porejemplo:
#!/bin/bash
v1=$(zenitylistcolumn"Tiposdeopciones""opcion1""opcion2")
if["$v1"="opcion1"];then
zenityinfotext"Opcion1"
elif["$v1"="opcion2"];then
zenityinfotext"Opcion2"
else
fi
Comoencualquierscript,zenityadmitequelepasemosvariablescomoopciones.
#!/bin/bash
var1="Introduzcaunao"
var2=$(zenityentryhidetexttext"$var1")
var3=$(zenityentrytext"Introduzcaunmes")
var4=$(zenityentrytext"Introduzcaunodia")
zenitycalendaryear"$var2"day"$var4"month"$var3"
Unaspectomuytileselusodelas"herramientas"quezenity(okdialogyxdialog)ponenanuestradisposicinparatrabajar
conarchivos.
#!/bin/bash
zenitytextinfofilename"/etc/fstab"

Desdeluegoparapodervermejorelusodezenityesimprescindibleleerbienlaayudadelcomandoascomosupaginadel
manual(manzenity,incluyealgunosejemplostiles),tambinpuedever:
zenityhelp
zenityusage
Enelnavegadordeayudadegnome(yelp)sepuedeconsultarunmanualconscriptsdeejemplosycapturasdecadaejemplo,
muycompleto.
Puedeaccederdichomanualusandozenityabout.
KDIALOG
Kdialog
Kdialogesunaaplicacinbastantecompletaqueinteractaconkde.
TrabajaconQtynospermitecrearscriptsconverdaderapotencia,siempreycuandotrabajemosconkde.
Kdialogesunaaplicacinpotente,poseeunaseriedeaspectosquelohacendistintoquexdialogoquezenity.
Heaqulasalidadekdialoghelpall.
Opcionesgenricas:
helpMuestraayudasobrelasopciones.
helpqtMuestraopcionesespecficasdeQt.
helpkdeMuestraopcionesespecficasdeKDE.
helpallMuestratodaslasopciones.
authorMuestrainformacindelautor.
v,versionMuestrainformacindelaversin.
licenseMuestrainformacindelalicencia.
Findelasopciones.
OpcionesdeQt:
display<displayname>Usalapantalla'displayname'delservidorX.
session<sessionId>RestauralaaplicacinparaelId.'sessionId'dado.
cmapProvocaquelaaplicacininstaleunmapadecolorprivadoenunapantallade8bits.
ncols<count>Limitaelnmerodecoloresreservadosenelcubodecolorenunapantallade8bits,silaaplicacinusala
especificacinQApplication::ManyColor.
nograbImpidequeQtcaptureelratnoelteclado.
dograbEjecutarloconundepuradorpuedeprovocarunnograbimplcito;usedograbparaevitarlo.
syncCambiaamodosncronoparadepurar.
fn,font<fontname>Definelafuenteparalaaplicacin.
bg,background<color>Especificaelcolorpredeterminadodelfondoyunapaletadecolores(sombreadosclarosy
oscurossoncalculados).
fg,foreground<color>Especificaelcolorpredeterminadodeprimerplano.
btn,button<color>Especificaelcolorpredeterminadodelosbotones.
name<name>Especificaelnombredelaaplicacin.
title<title>Especificaelttulodelaaplicacin.
visualTrueColorFuerzaalaaplicacinausarunapaletadecoloresTrueColorenunapantallade8bits.
inputstyle<inputstyle>EspecificaunestilodeentradaXIM(XInputMethod).
Losvaloresposiblesson:'onthespot','overthespot','offthespot'y'root'.
im<XIMserver>EspecificaelservidorXIM.
noximDesactivaXIM.
reversereplicaeldiseocompletodeobjetosvisuales.
OpcionesdeKDE:
caption<caption>Usa'caption'comonombreenlabarradettulo.
icon<icon>Usa'icon'comoiconodelaaplicacin.
miniicon<icon>Usa'icon'comoiconoenlabarradettulo.
config<filename>Utilizararchivoalternativodeconfiguracin.
dcopserver<server>UsaelservidorDCOPespecificadopor'server'.
nocrashhandlerDesactivaelmanejadordefallos,paraobtenervolcadosdememoria.
waitforwmEsperaaunadministradordeventanascompatibleconWM_NET.
style<style>EspecificaelestilodelGUIdelaaplicacin.
geometry<geometry>Especificalageometraclientedelobjetovisual(widget)principal
Opciones:
yesno<text>Cuadrodetextodepreguntasconbotonesdesi/no
yesnocancel<text>Cuadrodetextodemensajesconbotonesdesi/no/cancelar
warningyesno<text>Cuadrodeavisodemensajesconbotonesdesi/no
warningcontinuecancel<text>Cuadrodeavisodemensajesconbotonesdecontinuar/cancelar
warningyesnocancel<text>Cuadrodeavisodemensajesconbotonesdesi/no/cancelar
sorry<text>Cuadrodemensajede'Losentimos'
error<text>Cuadrodemensajede'error'
msgbox<text>Cuadrodedilogodemensaje
inputbox<text><init>Cuadrodedilogodeentrada
password<text>Dilogodecontrasea
textbox<file>[width][height]Cuadrodedilogodetexto
combobox<text>[tagitem][tagitem]...Dilogodelistadesplegable
menu<text>[tagitem][tagitem]...Dilogodemen
checklist<text>[tagitemstatus]...Dilogodelistadecomprobacin
radiolist<text>[tagitemstatus]...Dilogodelistadeseleccionesexcluyentes
getopenfilename[startDir][filter]Eldilogodearchivosabreunarchivoexistente
getsavefilename[startDir][filter]Dilogodearchivosparaguardarunarchivo
getexistingdirectory[startDir]Dilogodearchivoparaseleccionarundirectorioexistente
getopenurl[startDir][filter]EldilogodearchivosabreunaURLexistente
getsaveurl[startDir][filter]DilogodearchivosparaguardarunaURL
title<text>Ttulodedilogo
separateoutputDevolverelementosdelistaenlneasseparadas(paraopcindecomprobacin)
printwinidMuestraelwinIddecadadilogo
embed<winid>HaceeldilogotransitorioparaunaaplicacinXespecificadaporwinid
dontagain<file:entry>Archivodeconfiguracinynombredelaopcinparaguardarelestado"nomostrar/volvera
preguntar"
Argumentos:
argArgumentosdependientedelaopcinprincipal
Comosepuedeapreciar,kdialognosproporcionaunentronomas"amigable"siusamoskde,detodasmanerastambinse
puedeusarsineste,perolanzartodoloquerequierekdeparaunasimpleaplicacinconcuadrosdedialogo,bajomipuntode
vistanoesproductivo.
Otratemaseriasibuscamosalgunafuncinmasespeficica.
Podemostratarlasvariablesigualqueenzenityoxdialog.
kdialognospermiteunoscuadrosdedialogoconotrotipodefunciones.
P.ejm:
#!/bin/bash
kdialogwarningcontinuecancel"Deseacontinuar"
kdialogmsgbox"$?"
Siaceptramosnosdevolveraun0enlavariablederetorno($?)sinodirectamentecerraraelprograma,nosaltaala
siguienteinstruccin.
P.ejm
#!/bin/bash
var1=$(kdialoggetopenurl/html)
mozilla$var1
Enesteejemplo,usamosunaventanadeseleccindearchivopartiendodeldirectorioraiz(/)yfiltrandoalosarchivosque
tenganlaextensinhtml.
Despueselarchivolovisualizamosconmozilla.
Enelcapitulodezenityexplicomejorcomopoderusarlasopcionesdeestetipodeprogramasusarvariables,laslistas,los
checkboxesydems.
Comoapunte,decirquesialguiensevetentadoacrearcosillasbajokde,existenherramientastalescomokdevelop,perosi
buscisalgomassencilloperoconposibilidadesdecrearesqueletosgrficoscompletos,teniselkommanederesuna
aplicacinquerequierequantaparafuncionar,ytrabajaconxml,esmuyfcildeaprenderausarlaypuedescrearcosasmas
serias.
inicio

TUBERIASYREDIRECCION.
Enestosejemploscomoenotros,hemosusadotuberas(|)yhemosredireccionadolasalidaaunarchivo.
Tuberias:
Lastuberaspermitenutilizarlasalidadeunprogramacomolaentradadeotro.
P.ejem:
netstatan|grepv"unix"
Enesteejemplousamoslasalidadelcomandonetstatparamandarlaagrepqueeliminaratodaslaslineasqueestelapalabra
unix.
Redireccion:
Laredireccionpuedeparecerlomismoperolgicamentenoloes,laredireccionenloquenosocupa,nospermiteusarla
salidadeuncomandoaunficheroousarelbufferresultantedeotramaneras.
Ejemplos:
comando>archivoestohacequelasalidadeuncomandoseescribaenunarchivo,ojoqueborraratodoloquecontieneel
fichero.
lsal>lista_de_archivos.txtEstomandaralasalidaalfichero.
lsal&>todo.txtEstomandaratodoaunfichero:todo.txt
lsal>>ficheroestoaadelasalidaalfinaldefichero,sinborrarlosdatosanteriores,ysinoexiste,locrea.
comando<archivoEstohacequeelcomandousecomoargumentosarchivo,muytilparacrearinterfacesmascomplejas.
Enel[25]delinsflugpuedevermassobreredireccion.

inicio

Comandostiles
Enestepuntodeldocumento,nosvamosacentrarsoloendaraconocerunoscomandosquenospuedenayudarmuchsimoa
trabajar,solosevananombrar,citarsuuso,explicarquehacenyenalgunoscasosseexpondrnalgunosejemplos,es
recomendablequesetenganunasnocionesbsicassobrehttp://www.linuxfocus.org/Castellano/July1998/article53.html
expresionesregulares,sibiennoesimprescindible,esrecomendable.
Nosepretendedarunaguiadeusodecadaunodeestos,solamentesecitanparaqueellector,sideseaprofundizarensuuso
busqueinformacinalrespecto.
AWK
Awkesunlenguajeensimismo,nospermitetrabajardecontextodeunamaneraespecial.
Basicamente(awkesextenso)elusodediaadiaqueledoy:
awk'/patrn{print}'archivo
Mebuscaunpatrnenunficheroeimprimeenpantalla.
Unamea|awk'{print$14$4}'
Estonosdevolvera:GNU/Linux2.6.51.mdk
Siejecutamosunamea:Linuxxentolocal2.6.51.mdk#1MonApr2623:18:57CEST2004i686unknownunknown
GNU/Linux
Conlocualhemosmostradosololoscampos13y4,quecorrespondenaGNU/Linuxy2.6.51.mkd
Awkesbastanteextenso,http://www.linux.org.uy/uylug/cursos/awk/awk.htmltenisunmanualenespaolbastante
completoparaentenderlaspeculiaridadesdeesteprograma.
SED
Esuncompletoeditordetexto,esositrabajandoconcomandos,loqueesdemuchsimautilidadparatrabajarcontexto
dentronuestrosscripts.
Elusodesedesextenso,perotambinesmuyverstil.
Acontinuacinalgunoscomodinesbsicosdesedquesuelousarconasiduidad.
echoholamundo|sed'/mundo/q'Muestraeltextohastaqueencuentramundo.
echoholamundo|sed'/mundo/d'Eliminalaslineasquecontienenmundo.
sedn'20,30p'Muestralaslineasentre20y30
sed'$d'Borralaultimalinea.
sed'1,10d'Borradesdelalinea1ala20
Sedtienemuchsimasmasposibilidades,enestearticulodebulmahttp://bulma.net/body.phtml?nIdNoticia=1281hay
muchsimainformacinsobresed,podisvermasomenosuncentenardeusosen
http://www.student.northpark.edu/pemente/sed/sed1line.txt
GREP,EGREP,FGREP
Lautilidadgrepnospermitebuscarencadenasdetextoconformeadistintosparmetros,apartedegreptenemosfgrep,egrep.
Estossoncomandosmasomenosampliosyunpococomplejos,
grepcdrom/etc/fstab
Nosmostraralaslineasdelarchivo/etc/fstabquecontienenlapalabracdrom.
grepvcdrom/etc/fstab
Nosmostraralaslineasquenocontienenlapalabracdrom.
Estoscomandossonextensosyposeenciertacomplejidad,podisveruntutorialbastantecompletoen
documentacintilsobreestas:
http://docs.sun.com/db/doc/8017484/6i1pp3qp3?l=es&a=view
http://www.ciberdroide.com/misc/novato/curso/regexp.htmlestapaginaesdelasmascuidadasquehevisto,ysobretodo
explicadeunamaneraclarisimacomousarexpresionesregulares.
http://www.zaralinux.org/docs/texto/texto_cap5.phpbuenarticulosobrefgrep,egrepygrep.
CUT
Cutnossirveparacortar(cutdelingles)cadenasdetexto,conformeacaracteres.
echohola:mundo|cutb2
o
Estaopcinnosmuestraelsegundocarcterdelacadena.
echo"hola:mundo"|cutd:f2
mundo
Usandoddefinimoselcampoapartirdelcualcortamos(separamos)lacadenadetextoyconfindicamoselcampoen
cuestin.
echohola:mundo|cutd:f1
hola
Elmismoejemplousandoelprimercampo
Cuttienemasopciones,recomiendolalecturadelaspaginasdelmanual,opruebecuthelp
PASTE
Nossirveparacombinarficheros.
archivo1archivo2
main(){printf
(holamundo);}
pastearchivo1archivo2>pastear1ar2
ficheropastear1ar2
main(){printf
(holamundo);}
Esteeselusobsico,vermandelcomandoparapodersacartodoeljugoapaste.
HEAD
NosmuestraXprimeraslineasdeunfichero.
Head20/etc/fstab
Nosmostraralasprimeras20lineasde/etc/fstab
TAIL
Esmuyparecidoahead,soloqueenvezdemostrarlasprimeraslineasmuestralasultimasXlineas.
Tail10/etc/fstab
Nosmostraralas10ultimaslineasde/etc/fstab
SORT
Sortbsicamente,(poseebastantesopciones)ordenalineasdetexto.
Lasintaxisdesortesbastanteextensa,
NL
Colocalosnmerosdelaslineasenunfichero.
nlfichero
1linea
2otralinea
TEE
Nospermiteredericcionarlasalidaamltiplesficheros.
Teeholaarchivoarchivo2archivo3
JOIN
Joinnossirveparacompararcadenasdetextoenarchivos.
Joinarchivo1archivo2
Salidadejoinhelp
aNUMFICHmuestraunalneaporcadalneanoemparejabledelficheroNUMFICH,dondeNUMFICHes1o2,
correspondiendoaFICHERO1oFICHERO2.
eVACOreemplazaloscamposinexistentesporVACO
i,ignorecasenoatiendealasdiferenciasentremaysculasyminsculas
jCAMPOequivalentea'1CAMPO2CAMPO'
oFORMATOutilizaFORMATOparamostrarlaslneasdesalida
tCARCTERUsaCARCTERcomodelimitadordecampos,enlaentradayenlasalida
vNUMFICHComoaNUMFICH,peronomuestralaslneasemparejadas
1CAMPOusaestecampodelfichero1
2CAMPOusaestecampodelfichero2
TR
Nospermiteborrarycomprimirdoscadenasdetexto,ysubstituircadenasporotras.
P.ejem:
#!/bin/bash
echoHolA|trabAZ
HOLA
Estescriptcambiaralasletrasenminsculasporlasmismasletrasenmaysculas.
Trposeemasopcionesdeuso,puedeborrarcaracteres,puedeoperarsolosobrealgunoscaracteresopuedecambiarlos.
BC
Esunprogramaquenospermiteclculosnumricosavanzados,esmuypequeoyposeeunlenguajepropio
esbastanteparecidoaC,peromuysimplificado.
http://usuarios.lycos.es/acisif/bc/bc.htmlhayunmanualqueestamuybienexplicadoelusodel
programa,muchomejordeloqueyopodrahacerlo.
http://www.die.net/doc/linux/man/man1/bc.1.htmlpaginasdelmaneningles.
http://bulma.net/body.phtml?nIdNoticia=2045unaarticulodelamanodeloschicosdebulma.
UNIQ
Uniqnospermitecompararlineas,contarlasyeliminarlas,(vermandelcomandoparapodervermejortodoelusodeuniq).
uniqcfichero
DIFF
Comparadosarchivos,indicndonoslaslneasquesondistintas.
Silosficherossoniguales,nomostraranada.
Porejemplo,tenemoslossiguientesficheros:
holamama(archivo1.txt)
holamundo(archivo2.txt)
diffarchivo1.txtarchivo2.txt
1c1<holamama>holamundo.
Sinomuestranada,losficherossoniguales.

-CMP
Comparaelcontenidodedosarchivos,muestralaprimeradiferenciaencontrada,sinosondiferentesnomuestranada.
$cmpficherofichero2
differ:char2,line1
Esdecir,laprimeradiferenciaestenelcarcter1,lnea1.

-WC
Esuncontadordelneas,palabrasycaracteres,suusoesmuysencilloytil.
l:cuentalneas.
c:cuentacaracteres.
w:cuentapalabras.
Puedetrabajarconcadenasy/oarchivos.
$wclarchivo.txt
2
$wccarchivo.txt
8
$wcwarchivo.txt
2
Siendoelarchivo:
hola
hola
Hastaaquconloscomandostiles,esperoquecuandoseplanteenproblemasdeltipo,comohagoesto?Conladescripcin
delasfuncionesdeestoscomandostengaporlomenosunaideasobredondeempezar.
http://www.tldp.org/LDP/abs/html/textproc.htmlaqutenisunareferenciamuybuenadeprogramasquetrabajancontexto,
conejemplos,muy,muytil,pertenecealadvancebashscripting.
inicio

SOCKETSENBASH
Hemosvistoqueconbashsepuedenhacermuchascosas,peroamientenderhayalgoqueesnecesarioencualquier
lenguaje:crearsockets,estoesimprescindiblecuandosepretendeprogramaraciertonivel,aqutepropongoideasal
respectodecomousarciertasherramientasparapoderusartusscriptsparabash.
Estapartedeldocumentoesunpocomasavanzada,yportantorequiereunosconocimientosmayores,vamosausarNetcat,
xinetdynetpipesquesepuededecirquesediseoparamanejarsocketsconotrosprogramas,yporlotantousablecon
scriptsparabash.
Creandoserviciosbasadoenxinetd.
BashnopuedemanejarsocketscomosideCoperl,java,setratase.
Ensulugarsisepuedencrearserviciosbasadosenxinetdyqueesteservicioseaunscriptparaelbash.
EnprimerlugarNOeselobjetivodeestedocumentoexplicarqueesxinetdniquehacenicomoseusa,tenisunmagnifico
articuloenlinuxfocusyenespaolsobrexinetd.
Tambiendisponisdealgunaayudausandolaspaginasderedhatsobreeltemaenespaol.
Yporultimousarmanxinetd.confparamasdetalles.
Eneldirectorio/etc/xinetd.d/seencuentranlosscripts,queusanlosdemoniosquecorrensobrexinetd,puesnosotrosloque
haremosacontinuacin,escrearunnuevoservicioyundemoniousandounscriptenbash,evidentementenoeslamejor
idea,peroilustralafuncionalidadebashenesteaspecto.
Ejemplodeunservicionuevo.
#default:on
#description:Unapruebadecreacindeserviciosusandounscriptenbash
servicearhf
{
port=9999
socket_type=stream
wait=no
user=root
server=/bin/arhflogin.sh
log_on_success+=USERID
log_on_failure+=USERID
disable=no
only_from=192.168.1.4
}
Estearchivoseguardariaconelnombredelservicio,enestecasoarhf.
Repito,parapoderverlasopcionesdeestetipodearchivos,verladocumentacinantesreseada.
Aquiloquenosinteresaesqueconunsencilloarchivo,definimosunscriptenbash(/bin/arhflogin.sh)paraactude
demonioalrecibirconexionesporelpuerto9999,
ELpuertodeberaestardeclaradoen/etc/services.
Extractodelalineaquehacereferenciaen/etc/services:
arhf9999/tcp#arhf
Yporfinnuestroservicio:
Evidentementepodemoscorrerdesdeun"holamundo"aunscriptquemanejeotrosprogramas,estoyalodejoala
imaginacindecadauno,detodasmanerasesteesunejemplotil:
#!/bin/bash
var1=$(hostname)
echo"Bienvenidoa$var1corriendosistemaARHF0.1"
echo"Introduzcaunnombredeusuario"
readv1
var2=$(cat/etc/arhf/passwd|awk'{print$1}'|cutd:f1|grep$v1)
if["$v1"=="$var2"];then
echo"Nombredeusuariocorrecto,introduzcalacontrasea"
readkey2
key1=$(arhfauth$key2)
key=$(cat/etc/arhf/shadow|awk'{print$1}'|cutd:f3)
if["$key"="$key1"];then
execarhf
else
echo"Desconectado=Contraseaincorrecta
exit0
fi
else
echo"Desconectandonombredeusuarioincorrecto"
exit0
fi
Estescriptsellamaraarhflogin.shyseriaelquesesituaraen/bin/odondedefinamos.
Comosepuedeverelscriptessencillo,conunafuncinexternallamadaarhfauthencriptolacontraseaselamando
compararconelarchivoshadow,ysiconcuerdanejecutamoselprogramaarhf.
Estescripttieneunaaplicacinreal,elprogramaarhfesunapequeabasededatoscreadacontclyarchivosdetextoplano,
comoverisnoesqueseaprecisamenteseguro,pero,parailustrarejemploessuficiente.
P.DUnavezcreadoelnuevoserviciodebemosreiniciarxinetd.
UsandoNetcatparamanejarsockets.
Estoquehemosecho,simplementeescrearunservicionuevobasadoenxinetd,peroconlaparticularidaddequeelservicio
ensiesunscriptparaelbash.
Existendiferentesutilidadesquenospuedenayudaratratarconsockets,unadeellasyquizslamasusadaylaquemejorse
adaptaanuestrasnecesidadesNetcat,enestaslineasnosepretendeunmanualdenetcatparaesoyaexistenmuchasotras
paginas.
NetcatesunprogramaquenospermitetrabajarsobreelprotocoloTCP/IP.
Laventajaquetenemossobretelnetp.ejm,esquepodemosinteractuarconelprogramaautomatizandotareas,porqueno
trabajaesperandoqueinteractesconel.
Laformamassimpledecrearunacomunicacinentredosmquinasesesta:
Servidor
#!/bin/bash
netcatlplocalhost9999
cliente
#!/bin/bash
netcatlocalhost9999
Comopodisveraqurealmentesolohacemosusodenetcatypocomas.
Pero,hayotrasmanerasdeusarloenscripts.
Ejemplo:Unscriptparagestionarelemail,basadoennetcat.
#!/bin/bash
#ncmailer0.1byxentoFigal(c)2004GNU/GPLhttp://gnu.org
echo""
echo"NCMailer0.1ByXentoFigalhttp://xinfo.sourceforge.net"
echo""
echo"[1]""Vercorreo"
echo"[2]""Mandarcorreo"
echo"[3]""Eliminarcorreo"
echo"[4]""Obtenercorreo"
echo"[5]""Salirdelprograma"
echo"Introduzcaunnumero"
readvar
case$varin
1)
echo"Introduzcaelnombredelservidorpop3"
readv3
echo"Introduzcaelpuertodelservidor"
readv4
echo"Introduzcaelnombredelusuario"
readv1
echo"Introduzcalacontrasea"
readv2
echo"USER$v1
PASS$v2
STAT
LIST
QUIT"|nc$v3$v4
;;
2)
echo"Introduzcaelnombredelservidorsmtp"
readv1
echo"Introduzcaelpuertodelservidor"
readv2
echo"Introducaladireccindeorigen"
readv3
echo"Introduzcaladireccindedestino"
readv4
echo"Introduzcaelcuerpodelmensajesinpuntos"
readv5
functionmandar{
cat<<EOF|netcat$v1$v2
RSET
HELO
MAILFROM:<$v3>
RCPTTO:<$v4>
DATA
$v5
.
QUIT
EOF
}
echo"Mandarelemail?si/no"
readv6
if["$v6"=="si"];then
mandar
echo"Elmailsehamandado"
elif["$v6"=="no"];then
echo"Elmailnosehamandado"
else
echo"Opcionincorrecta,introduzcasionosinmaysculasniespacios"
exit0
fi
;;
3)
echo"Introduzcaelnombredelservidorpop3"
readv3
echo"Introduzcaelpuertodelservidor"
readv4
echo"Introduzcaelnombredelusuario"
readv1
echo"Introduzcalacontrasea"
readv2
echo"USER$v1
PASS$v2
STAT
LIST
QUIT"|nc$v3$v4
echo"Introduzcaelnumerodelmensajequequiereeliminar"
readv5
echo"Borrarelmensajenumero$v5?si/no"
readv6
if["$v6"=="si"];then
echo"Borrandoelmensajenumero$v5"
elif["$v6"=="no"];then
echo"Elmensaje$v5nosehaborrado"
else
echo"Opcionincorrecta,introduzcasionosinmaysculasniespacios"
exit0
fi
echo"USER$v1
PASS$v2
STAT
DELE$v5
QUIT"|nc$v3$v4
echo"Elmensajenumero$v5hasidoeliminado"
;;
4)
echo"Introduzcaelnombredelservidorpop3"
readv3
echo"Introduzcaelpuertodelservidor"
readv4
echo"Introduzcaelnombredelusuario"
readv1
echo"Introduzcalacontrasea"
readv2
echo"USER$v1
PASS$v2
STAT
LIST
QUIT"|nc$v3$v4
echo"Introduzcaelnumerodelmensajequequieredescargar"
readv5
echo"USER$v1
PASS$v2
STAT
LIST
RETR$v5
QUIT"|nc$v3$v4>mensajenumero$v5de$v3
echo"Mensajeguardadocomomensajenumero$v5de$v3"
;;
5)exit;;
*)echo"Porfavorintroduzcaunnumerodeopcinvalido1,2,3,4,5";
esac
exit
Aquihemosusadovariablesparadefiniralgunosaspectosdeloscomandospopmandadospornetcatalservidor,como
podrisverelfallomasgrande(entreotrosporsupuesto)resideenquecadavezqueefectuamosunaoperacincerramosla
conexinynostocavolverreiniciarlaparaefectuarmasoperaciones,perocreoqueesunclientedecorreobastanteligero
no?:))
Estoesporpartedelcliente,ahoravamosaverporpartedelservidor.
#!/bin/bash
echo"Bienvenido"|netcatlp9999
exit
EstonosmostraraenmensajeBienvenidoycerraralaconexin.
#!/bin/bash
netcatlp9999<archivo.txt
Estescriptusaraarchivo.txtparamostrarloenpantallacadavezquealguienseconecteporesepuerto.
Porotrolado,unamaneramuyfcildecrearundemonioesesta:
Ejecutamosnetcatdeestamanera:
netcatlp9999escript.sh
Alhaceraslascosas,loqueelindicamosanetcatesquepermanezcaalaescuchaenelpuerto9999yquecuandorecibauna
conexin,ejecutescript.sh.
NOTA:Dadoquepermitimoslaconexin,elarchivodebetenerpermisosdeejecucinylectura.
Sihacemosestacombinacin:
netcatlp9999encmailer.sh

Laconexinentrante,dispondrdeunclientedecorreo.
Porloquesoloquedahacerunscriptquehagaloquenosotrosqueremos.
Detodasmanerasenhttp://www.csd.uch.gr/~mstamat/hacks/foohttpd.htmltenisunservidorwebechoconnetcatybash,
otroenhttp://lug.umbc.edu/~mabzug1/bashhttpd.htmlynumerosadocumentacin.
.
Ademasdenetcatpodemosaprovecharotrasherramientas,enelpaquetedenetpipes,encontramosunavariedadinteresante,la
explicacindelusodeestasherramientasnoestanextensacomolaquesedioconnetcat,netcatesquizslaherramientamas
verstilparaestetipodescripts,perorecuerdoqueeldocumentonoesunmanualdeestetipodeherramientas,porloque
seranecesarioqueellectoraprendaausarlasparapoderextraertodoelrendimientodeestas.
Elpaquetenetpipescontienendiversasutilidades,nosvamosacentrarendos:
Hose:Nospermiteconectarnosaunpuertoabriendounsocket.
Estepaquetenosseradeutilidadparacrearclientes.

faucet:Nospermiteabrirunsocketenlamaquinalocal.
Esteotronosservirparacrearservidores.

Ejemplodefaucetpermaneciendoalaescuchaenelpuerto9999.
faucet9999outverboseonceecho"holacliente"
Cuandounclienteseconectealpuerto9999veraeltextoholaclienteysecerraralaconexin.Ladiferenciaesquepodemos
usardeunamaneramasintuitivaparacrearscripts.
http://www.starlinux.net/articulos/bash3/starbottenisunclientedeircconstruidoconnetpipes.
http://web.purplefrog.com/~thoth/netpipes/netpipes.htmlaquencontrarastantoelpaquetecomoelmanualyejemplosde
uso.
Autentificacionbasadaenbash:
Paramanejarlascontraseasenlosscriptstiposervidor,esmasseguroautentificarlas,aqutenisunprogramaqueesmuy
tilparaesoscasos.
Yasequepuedopecardeinsistente,peroelusodeestasherramientasaconcienciayenprofundidadsealejamuchsimodel
mbitodeestetutorial.

inicio

BASHENTIERRASHOSTILES(EltituloylaideadeesteapartadoselodeboaSubbohfer:es.comp.os.linux)
Avecesnoshacefaltacorrerscriptsenbash,ousardirectamenteutilidadesdeLinuxenotrosentornos.
Enestoscasos,podemosrecurriraciertasherramientas,nopuedoponerunadescripcinmuygrandepuestoquenolashe
probadonunca,perotalvezaalguienlepuedanserdeutilidad.
Aquitenisunbash2.03,precompiladoparawindows.
Estootro,sonunaseriede.exe,segnellosson3cosas:

LibrariesthatprovideaUNIXoperatingsystembyimplementingtheUNIXApplicationProgrammingInterface
(API).
Includefilesanddevelopmenttoolssuchascc,yacc,lex,andmake.
KornShellandover250utilitiessuchasls,sed,cp,sttyetc.

Sonvarios.exeperosegnvi(noloheprobado)puedesbajarlakornenunsolo.exe,solotieneunpero;estabajolicencia
restrictiva,tedejanusarlocomo"educational"obienporunperiodode90diasdeprueba,laotrasolucinespagarla
licencia.
Tambienestaesto,es"AnimplementationoftheCSHforWindows"
Hayunaversingratuitaparaevaluacinydems.peronohuelemuybien,masbiencapadaserialamejordefinicin.
Estas,sonlasutilidadesGnuparawindowsincluidaZSH,concomandosvarios(cat,grep,find,etc...),perosupongoque
sernunoscuantos.exe
Aquihayunaseriedeutilidades,cat,bc,shellutils,less,textutils,yunascuantasmas,noesnecesariocgywin.
Enestalineatambinhayotracosilla,quesibienpartedecgywindicenquenoesnecesarioparahacerlascorrer,son18
utilidades,incluidasgzip,bashetc...,lodelalicencianoestamuyclaro,noestrial,noesshare,nosupeaveriguarquetipode
licenciaes.
Evidentementeparapoderhacerfuncionarlascosas,yenestalineaestaclaroquecgywineslaopcinmasrecomendable,
perositenisqueusarscriptsparaunared,cgywintraeelproblemadeinstalarloentodaslasmquinas,esteproblemaesta
enunhilodediscusinactualmente"parado"enlibertonia.
inicio

DEPURANDOBASH
Existendosformasdehacerunadepuracin(debug)denuestrosscripts.
Aadiendounechoatodaslaslasvariables.(estanoes"real")
Estasotrassisonmodosdedepuracinreal.
shxscriptconerror
Estoejecutarelscriptymostrartodaslasentenciasqueseejecutanconlasvariablesycomodinesyaexpandidos.
Elshelltambintieneunmodoparacomprobarerroresdesintaxissinejecutarelprograma.Seusaas:
shntu_script
Sinoretornanadaentoncestuprogramanotieneerroresdesintaxis.

inicio

APENDICE1
ComandodeMS Comandoenlinux
DOS

descripciones

ASSIGN

ln

Crearenlaces

ATTRIB

chmod

Cambiarpermisos

CD

cd

Cambiardirectorio

CHDIR

cd

Cambiadirectorio

CLS

clear

Limpialapantalla

COMP

diff,comm,cmp

Comparaarchivos

COPY

cp

Copiararchivos

CtlC

CtlC

Sealbreak

CtlZ

CtlD

Finaldearchivo

DEL

rm

Borrararchivo

DELTREE

rmrf

Borradorecursivo

DIR

lsl

Verdirectorio

ERASE

rm

Borrararchivos

EXIT

exit

Salirdeunproceso

FC

comm,cmp

Comprararchivos

FIND

grep

Buscarcadenasdetexto

MD

mkdir

Creardirectorio

MKDIR

mkdir

Creardirectorio

MORE

more

Verpantallaapantalla

MOVE

mv

mover

PATH

$PATH

Ruta

REN

mv

Renombraromover

RENAME

mv

Renombraromover

RD

rmdir

Borrardirectorio

RMDIR

rmdir

Borrardirectorio

TIME

date

Fecha

TYPE

cat

Salidahaciastdout

XCOPY

cp

Copiadearchivos

inicio

Argumentosdeejecucindelbash.

Dentrodeunscriptpodemosaadirargumentosconoargumento.
Paraeliminaresosargumentos+oargumento.
Opcion.

Nombre

descripciones

noclobber

Nopermitesobrescribirarchivosporredireccion.

(none)

Muestralasdobles()precedidasde$,peronoejecutaenelscript.

allexport

Exportatodaslasvariablesdefinidas.

notify

Notificacuandohaytrabajosporterminaenbackground.

c...

(none)

Leecomandosdesde...

noglob

Expansiondearchivosdesactivada.

interactive

Elscriptseejecutaenmodointeractive.

privileged

Elscriptseejecutacomo"suid"

restricted

Elscriptseejecutaenmodorestricted.

nounset

Seusaparaquesiunfallodesalidadevariablelofuerzaysaledeeste.

verbose

Modoverbose

xtrace

Modoverboseconexpansindecomandos

errexit

Abortaelscriptalprimererror.

noexec

Leeloscomandosdelscriptperonolosejecuta.

stdin

Leecomandosdesdestdin

(none)

Saleantesdelprimercomando.

(none)

Findelasopcionesconflags.
inicio

REFLEXIONESIMPORTANTES.
Comosepuedecomprobar,losscriptsparaelbashformanpartedenuestrosistema,(rcporejemplo)porloqueuna
comprensinmnimadecomofuncionanesobligadoparapoderconocerquehace,comoycuandolohacenuestra
maquina.Porotrolado,existenprogramasquesondirectamentescriptsenbashyquepermitenhacermuchascosas.Los
scriptsparaelbashnosvanasolucionarlavidayautomatizarmuchastareas.
Tambiennossernmuytilesyenalgunasocasionesimprescindiblespararealizarmuchascosas.Comoaadidohayque
citarqueaprenderaescribirscriptsparaelshell,nospuedesermuytilparacrearunapuertadeentradaalaprogramacin
(misprimerospasosenlinuxfueronconscriptsparaelbash),puestoqueposeeunasencillamaneradehacerlascosas,nadie
mepuedenegarqueesunadelasmejoresmanerasdeintroducirseenelmundodelcdigo.
Sequemuchoslectores/assequedaranunpoco"vacos"conalgunasseccionesespecialmenteelusodeprogramasexternos,
bashentierrashostilesylossocketsenbash,perounavezmasdeborecordarqueelobjetivodeldocumentoeradotardeideas
paraempezaraescribirscriptparabash,ynocrearunaguiaavanzadadeprogramacin,detodasmanerasestoyanimndome
aescribirunhowtocentradonadamasenelusodenetcatynetpipesylacreacindescriptpotentes,cualquierayudasera
bienvenida.
inicio

NOTASDELAVERSION.

CopyrigthXentoFigal20032004xento@xento.tk
EstedocumentoseencuentrabajolicenciaGNU/FDL.
Version2.0del1.6
Versionenhtml,html.tar.gz,pdf.tar.gzen:
http://xinfo.sourceforge.net/documentos/bashscripting/
Actualizacionesehiloshttp://xinfo.sourceforge.net

También podría gustarte