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

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

$wccarchivo.txt

$wcwarchivo.txt

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 descripciones
DOS
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


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