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 ASSIGN ATTRIB CD CHDIR CLS COMP COPY CtlC CtlZ DEL DELTREE DIR ERASE EXIT FC FIND MD MKDIR MORE MOVE PATH REN RENAME RD RMDIR TIME TYPE XCOPY ln chmod cd cd clear diff,comm,cmp cp CtlC CtlD rm rmrf lsl rm exit comm,cmp grep mkdir mkdir more mv $PATH mv mv rmdir rmdir date cat cp descripciones Crearenlaces Cambiarpermisos Cambiardirectorio Cambiadirectorio Limpialapantalla Comparaarchivos Copiararchivos Sealbreak Finaldearchivo Borrararchivo Borradorecursivo Verdirectorio Borrararchivos Salirdeunproceso Comprararchivos Buscarcadenasdetexto Creardirectorio Creardirectorio Verpantallaapantalla mover Ruta Renombraromover Renombraromover Borrardirectorio Borrardirectorio Fecha Salidahaciastdout Copiadearchivos

inicio

Argumentosdeejecucindelbash.

Dentrodeunscriptpodemosaadirargumentosconoargumento. Paraeliminaresosargumentos+oargumento. Opcion. C D a b c... f i p r u v x e n s t Nombre noclobber (none) allexport notify (none) noglob interactive privileged restricted nounset verbose xtrace errexit noexec stdin (none) (none) descripciones Nopermitesobrescribirarchivosporredireccion. Muestralasdobles()precedidasde$,peronoejecutaenelscript. Exportatodaslasvariablesdefinidas. Notificacuandohaytrabajosporterminaenbackground. Leecomandosdesde... Expansiondearchivosdesactivada. Elscriptseejecutaenmodointeractive. Elscriptseejecutacomo"suid" Elscriptseejecutaenmodorestricted. Seusaparaquesiunfallodesalidadevariablelofuerzaysaledeeste. Modoverbose Modoverboseconexpansindecomandos Abortaelscriptalprimererror. Leeloscomandosdelscriptperonolosejecuta. Leecomandosdesdestdin Saleantesdelprimercomando. 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