Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bash Script
Bash Script
BasesdelaprogramacinparaelBash.
ComodeintroduccinalShellscriptingsobreBash.
<PorXentoFigalhttp://xinfo.sourceforge.net>
-INTRODUCCION.
-LO PRIMERO QUE DEBEMOS SABER.
-NUESTRA LINEA DE COMANDOS.
-CUADROS DE COLORES .
-PRINCIPALES OPCIONES GENERICAS.
-DOCUMENTACION BASICA.
-EL EJEMPLO MAS SENCILLO.
-PROBLEMA.
-SOLUCION.
-USO DE VARIABLES.
-VARIABLES NUMERICAS.
-VARIABLES DE RETORNO.
-VARIABLES CON ARGUMENTOS.
-CUADRO DE VARIABLES PREDEFINIDAS.
-USANDO IF FI.
-EJEMPLO BASICO.
-EJEMPLO UTIL.
-TEST.
-OPCIONES BASICAS.
-USO.
-USO DE VARIABLES.
-USANDO CASE.
-USANDO SELECT.
-EJEMPLO UTIL.
-BUCLES.
-FOR.
-WHILE.
-BREAK.
-UNTIL.
-OTROS BUCLES.
-FUNCIONES.
-EJEMPLO PRACTICO.
-USO DE CARACTERES ESPECIALES ( COMODINES VARIOS ).
-EXPANSION DE UN COMANDO.
-EXPANSION ARITMETICA.
-EXPANSION DE SUFIJO Y PREFIJOS.
-EXPANSION DE NOMBRES.
-SCRIPTS BASH PARA X-WINDOW.
-EJEMPLO DE XDIALOG.
-ZENITY AL DESNUDO.
-KDIALOG.
-TUBERIAS.
-REDIRECCION.
-COMANDOS UTILES.
-AWK.
-SED.
-GREP,EGREP,FGREP.
-CUT.
-PASTE.
-HEAD
-TAIL.
-SORT.
-NL.
-TEE.
-JOIN.
-TR.
-BC.
-UNIQ.
-DIFF.
-CMP.
-WC.
-SOCKETS EN BASH.
-SERVICIOS BASADOS EN XINETD.
-SOCKETS CON NETCAT.
-CLIENTE DE E-MAIL CON NETCAT.
-SOCKETS CON NETPIPES.
-BASH EN TIERRAS HOSTILES.
-DEPURANDO SCRIPTS.
-APENDICE 1
-Equivalencia de comandos linux vs ms-dos.
-APENDICE 2
-Argumentos de scripts para el shell.
-REFLEXIONES IMPORTANTES.
-NOTAS DE LA VERSION.
-LICENCIA.
INTRODUCCION.
Enestedocumentonosepretendeensearanadieaprogramarnimuchomenos,elobjetivoesdistintoquierodaraentender
unaseriedeconceptossencillossobrelaprogramacinenbash(algunosdirnquenoesunlenguajedeprogramacin,pero
enInternetseencuentransoftwarescomplejos,gestindebancosdebasesdedatos,programasparacreardiagramas,yunsin
findeaplicaciones,quecuantomenos,sonfcilesdeescribir),estosconceptossonmuysencillos,bsicamenteseexplicaran
dostiposdeaplicaciones,unadirectamenteenlalineadecomandos(shell)yotraenscriptsejecutablesporlashell.
Vamosquesirveparalosqueaunnosehanenteradodeloquesepuedehacerconelshell:)
Lamaneradeescribirlointentaserfielalaprimeraversin(ao2002,unos5kbcreorecordar),enestaultimaversinyano
estanfcilacogersealoriginal,aquyaempezamosatratartemasmascomplejos,peromantengolaideadequetengauna
continuidaddelectura,amododenoticiaenunodelosnumerososblogsquepueblanInternet,deestamanerasepretende
quelosconceptosseasimilendemaneraprogresiva,novoyaexplicarelusodecondicionesantesdeexplicarqueesuna
variable,sustiposylamaneradeusarlas,delamismamaneranomequieroquedarconelejemplotilparalacomprensin
peronoparalaejecucin,deestamaneraheincluidoejemplosprcticosencasitodaslassecciones.
Porsupuestoqueelndiceestaparaalgo,puedesconsultaralgunadudaylasseccionesestnpensadasparapoderser
visitadasdemaneranica,perolaideaprincipalesparaaquellosquenuncahantocadounscriptenbash,quesehaganuna
ideaypuedancrearsuspropiosscripts,ademsseincluyenaspectosmasavanzados,comoelusodesocketsobashenotros
sistemas.
inicio
LOPRIMEROQUEDEBEMOSSABER.
Ellenguajebashescomocualquierotro,sepuedehacerloextensiblequequeramos,peroprincipalmentenoscentraremosen
aplicacionesmuyconcretas:
Elpromptsepuedemodificaralgustodelusuario.
Crearscriptsquenosfacilitenelusodiariodenuestramaquinalinux.
Serunamagnificamaneradeacercarsealaprogramacinyentenderlosfundamentosdeesta.
inicio
NUESTRALINEADECOMANDOS
Lapropialineadenuestrashellesyaensiunscriptenbash.(Basicamente,unscriptparalashellempiezapor#!/bin/basho
larutadondeseencuentreelejecutable)Sepuedenejecutarscriptsdirectamenteusandoshnombre_del_script.shoelclsico
./)
Unalineadecomandosestandartencualquierdistrosueleseresta:
[usuario@host/]#
Bienestoestadefinidoenelarchivo/etc/bashrcgeneralmenteenlalineaps$=1
Estaeslalineanormalparaunprompt"normal":PS1="[\u@\h\W]\\$"lo
quenosmuestra
[usuario@host/]
Estosepuedecambiaranuestroantojopuestoquepodemoscambiarlalineadelpromptcomomasnosguste,enmicasole
aadunreloj,lecambieloscoloresyaadilaentradacompletadelosdirectorios.
Estaeslalinea:
PS1="\[\033[0;36m\][\$(date+%H%M)]\[\033[0m\]\[\033[0;33m\][\u@\H\W]\\:\[\033[0m\]"
Aquiusamoscdigosdecolor,[0;36m]y[0;33m]ylasopcionespropiasdelshell,\u\H\Wmasunafuncin($date)y
argumentos,lahora%Hylosminutos%M.
Elusodedelineas\(barrainvertida)nossirveparasepararunascosasdeotras,oenelcasodeopcionesinternas(\n\Hetc...)
paradeterminarlasyparavolveralcolororiginalusamos\033.
Siestonolotienesnadaclaronotepreocupesecharleunvistazoaloscdigosdecoloryopcionesparaelbasheneste
documento.
Observesequelosespaciosentrecaracteressondefiniblesporelusuario.
Tambiensepuedenhacercambiosnopermanentes,simplementemetiendoargumentosenlalineadelashellestoesta
explicadoenotroarticulo,lautilidaddeestoestafueradetodaduda.
Perosobretodo,cabedestacarlautilidaddeincluirscriptsenbashenlashell,yobienhacerlosfijosono,paraincluirscripts
lonicoquedebemoshaceresaadirloenelbashrc,obienhacerunscriptquenosmodifiquelashellalejecutarlo,yque
luegopodamosterminarelprocesoyvolveralashellquetengamosdefinida.
inicio
CUADROSDECOLORES
Negro0;30Grisoscuro1;30
Azul0;34Azulclaro1;34
Verde0;32Verdeclaro1;32
Cyan0;36Cyanclaro1;36
Rojo0;31Rojoclaro1;31
Purpura0;35Purpuraclaro1;35
Marron0;33Amarillo1;33
Grisclaro0;37Blanco1;37
inicio
PRINCIPALESOPCIONESGENERICAS
\acaracterdecampanaASCII(07)
\dlafechaenformatoodiap.ej.,marmay26)
\ecaracterdeescapeASCII(033)
\helnombredelhosthastaelprimer.
\Helnombredellamaquinacompleto(FQDN)
\ncaracterdenuevalinea
\rretornodecarro
\selnombredelshell,elnombrebasede$0(elfragmentoquesiguealaultimabarra)
\tlahoraactualenformato24horasHH:MM:SS
\Tlahoraactualenformato12horasHH:MM:SS
\@lahoraactualenformato12horasAM/PM
\uelnombredeusuariodelusuarioactual
\vlaversiondebash(p.ej.,2.0)
\Vlaversiondelpaquetedelbash,version+patchlevel(p.ej.,2.00.0)
\weldirectorioactualdetrabajo
\Welnombrebasedeldirectorioactualdetrabajo
\!elnumerodelcomandoactualenelhistorico
#elnumerodecomandodelcomandoactual
\$sielUIDefectivoes0,un#;enotrocaso,$
\nnnelcaractercorrespondientealnumeroenoctalnnn
\\unacontrabarra
\[iniciodeunasecuenciadecaracteresnoimprimiblesquepuedenusarseparaincrustarunasecuenciadecontroldel
terminalenelprompt.
\]findeunasecuenciadecaracteresnoimprimibles
inicio
DOCUMENTACIONBASICA
Hayunoscuantosdocumentosmuybuenossobrelaprogramacinenbash:
[http://www.tldp.org/LDP/abs/html/]
Ultimaversiondeladvancedbashscripting,sencillamentetodosaledeestemagnifico"libro"conunacantidadquenoes
normaldeejemplos,sibuscaslamadredetodosloshowto,comos,etc,etcsobrelosscriptsparaelbashestaeslapagina.
[http://org.laol.net/lamug/beforever/bashtut.htm]
Eninglesperomuycompleto,unarevisinantiguadelanteriordocumento,unacantidadincrebledeejemplos,usandoawk,
perl,ytodoloquemedejoporponer(queesmucho),opcionesydemsdigamosqueimprescindible.
[http://www.shelldorado.com]Excelentepaginadodneencontrarmiles(noescriboensentidofigurado)deejemplos,
documentacion,articulosymuchisimomaterial.
[http://es.tldp.org/COMOINSFLUG/COMOs/BashProgIntroCOMO/]
UnodelosnicoshowtocompletosenESPAOL(mehaservidoparalastablasdecolor,elbucleforC,ylastablasde
opcionesgenricas).
[http://cs.bilgi.edu.tr/pages/courses/year_1/comp_151/examples/bash/]
Ejemplosmuyprcticosyexplicados.
[http://gyulai.freeyellow.com/en/linux/bash.html]
Muybuenoeningles.
[http://clri6f.gsi.de/gnu/bash2.01/examples/scripts.noah/]
Scriptsexplicadosmuyperomuybien.
[http://www.linups.org/modules/documentacion/gdialog/]
Buenhowtodedialog,mcdialogygdialogenESPAOL.
[http://www.linuxfocus.org/Castellano/November2002/article267.shtml]
Unaexplicacinconsencillosperoclarosejemplos,concapturasdepantallayloquenostieneacostumbradoslinuxfocus,
sobreXdialog.yenESPAOL
[http://www.terra.es/personal/garzones/shellscriptsmicrocomo.html]
UnmicrocomoenESPAOLsobrelaintroduccindelbashscripting,tienesusitioporquecadaunoexplicamoslascosas
deunamanera,estaespaolytalvezhaycosasqueaqupuedasentenderyenotrossitiosno(esteincluido).
[http://ulysses.gulic.org/]
Paginasdelgrupodeusuariosdelinuxdegrancanarias,conunsoftwareinteresante,unprogramadecontabilidaddomestica
echoenbashcondialogyposibilidaddeusarXdialogenESPAOL.
[http://igor2.mcomp.hu/gpl/tetris.sh/]
Unaversiondelpopularjuegotetrisparaelbash,XDvalelapenaverloenaccin.
inicio
ELEJEMPLOMASSENCILLO
Buenocomobienseexplicaantes,lasutilidadesdelashellsoninfinitas,acontinuacinvoyaexplicarlosscriptsmasfciles
paraelshell.
Ejemplo1:
Problema:
Enunmenutipoblackbox,wmaker,fluxbox,ice,etc,,,queremosincluirunaorden,estaordenesunallamadaalterminalcon
argumentos,peroqueestosargumentosdefinenunprocesooprogramaqueterminaynorequiereintervencindelusuario,
massencilloqueestopongounejemplo:
llamamosaunterminalparaquenosmuestreinformacinsobreparticiones,conexionesmemoria,etc,,,comoeslgiconos
estamosrefiriendoal/proc/blahperovamosquepodramoshacerlollamandoacualquierarchivo,buenolaordenensi:
xtermecat/proc/partitions
Cuandoejecutemosestoenunmenudelosanteriores,resultaraquecuandoterminedemostrarlainformacinelterminalse
cierra,estounproblemadirectamentedelabash,buenonoesunproblema,masbienesnecesarioyasestadefinido,
imaginarosquedebemosinterrumpirsiemprequehagamosunls,enfinimaginaros...
Elproblemasepresentaenquesiaadimoslaorden|lessalfinaldelargumento,sequedaigual,estopasaporqueun
comandocuandotermina,tiendea"automatarse".
Esimportanteesteconcepto,puestoquenotenerloencuentanospuededardoloresdecabezaenloserroresdealgunos
scripts.
Solucion:
Scriptparabashquenosejecutelaordenyyaesta,asdesencillo.
Ejemplodelaslineasdelmenu:[exec](infoparticiones){Eterme/scriptsbash/particiones}
Aquillamamosaejecutarunaorden:EtermaEtermledecimosqueejecutealgo(e),esealgoesunscriptparalabashquese
encuentraen/bashscript/ysellamaparticiones,buenoyasequeestoesobio,peroporsiacasoXD,bienclaroesto,vamosa
verelscriptencuestin:
#!/bin/bash
cat/proc/partitions
Estoessencillodefinimoselinterpreteenlaprimeralinea,despuselcomandoquequeremosejecutar.
#!/bin/bash
echoInformaciondelasparticiones
execcat/proc/partitions|less
done
Comosepuedever,lamaneradeejecutaralgoenunscriptparaelbashesextremadamentesencilla,usamoslaprimeralinea
paradecirledondeestaelinterpretedespusconechomostramosinformacinenpantallacomounprintf,despususamos
execparaejecutaruncomando,yacabamoscondoneparaindicarquenotenemosnadamasquehacer.
Otroejemplotil,montarunaparticindeundiscoduroextraiblesintenerquemetertodoslosargumentos,yclaronos
evitamosdeescribirdirectamenteelfstab,puestoqueeldiscounosdiasestayotrosno.
#!bin/bash
echomontandoparticin
execmounttext3dev/hdc5/mnt/otrolinux
done
Sinestonolosabiasonoloentiendesbien...meparecequepocopodemoshacer,deberaleerladocumentacinsobrelinux
queexplicaelusobsicodelsistema,[http://www.linuxparatodos.com]esunbuensitioparacomenzaracomprenderquees
linuxyquepuedehacerporti(otuporel).
inicio
USODEVARIABLES
Elscriptcomopodisveresdelomassencillodelmundo,perotambinestilalmximo,puestoquenospermiteverel
resultadoenpantallaynocierraelterminalhastaquenosotrosselodecimos,usamoslaordenlessquemiratupordondesi
funcionasiloaplicamosaunscriptparaelbash,comosepuedeimaginarlasposibilidadessoninfinitas,ysiusamos
variablesmuchomas,unamanerasimplededefinirunavariable:
#!/bin/bash
variable1=holamundo
$variable1
Elresultadoesobio:
holamundo
Aquipermitimosunaentradaylausamoscomovariable:
#!/bin/bash
echoArchivoabuscar:
read$ARCHIVO
find/'!'typedname"$ARCHIVO"print0
Puesaqulotenis,hemosintroducidounavariableenuncomando,queasuvezcontieneopciones,estescriptesbuenopara
buscararchivosenmodogeneral,ademssepodraintroducirunaseriedevariables,definidasporelusuario,quepodemos
colocarcomoargumentosdefiniblesdelcomando,porejemplo:
#!/bin/bash
echoIntroduzcanombredelarchivoydirectorio,separadosporunespacio:
readARCHIVODIRECTORIO
find/$DIRECTORIO'!'typedname"$ARCHIVO"print0
Buenocomoestoseha"complicado"unpocomas,lovoyaexplicarpasoapaso:
Conechointroducimosuntextoqueaparceraenpantalla.
Conreaddejamosqueelusuariointroduzcadatos,yestossonlasvariablesqueusaremosparadefinirlosparmetrosenel
comando.
Despuesintroducimoslasvariablesenelcomandositundolasdondeestnlosparmetrosdeeste.
Elusuarionodeberaintroducireloperador/parallamaraldirectorio,estopuedesertilonodepende,peroestolopodemos
cambiaraantojo,simplementecambiandolavariable,esperoquequedeclaro.
Fijatequeenalordenoriginaldelcomando,esdecirdirectamentesobrelashell,las"sonremplazadaspor'yestasnose
representancuandointroducimoslavariable.
Esteesotrodeesosdetallesimportantessiunscriptnohaceloquetuteniaspensado
Porsupuesto,lasvariablestambinpuedenserdetiponumricoysepuedenejecutaroperacionesconlosnmeros
lgicamente.
#!/bin/bash
numeroA=2
numeroB=5
frase="escorrecto"
suma=$[$numeroa+$numerob]
multiplica=$[$numeroa*$numerob]
divide=$[$numeroa/$numerob]
resta=$[$numeroa$numerob]
echo"2+5=$suma$frase"
echo"2*5=$multiplica$frase"
echo"2/5=$divide$frase"
echo"25=$resta$frase"
Ademasdeestosejemplos,tambinexistelavariablederetorno,estaeslaresultantedelaejecucindelcomandoanterior,
solopuedeser1o0,dependiendodesielprocesofinalizoconexitoono,estoestilparadeterminarcondicionessintener
quecalentarnosmaslacabeza,porejemplo:
#!/bin/bash
lsdirectorio_real
echo"elvalordelavariablees:$?"
echo""
Sieldirectorioesrealnosdevolver0
Paradaropcionesaunscripthayqueusarunmododistintodepasarleargumentos,estassonlasvariablespropiamente
dichas.
#!/bin/bash
echo"\$0es$0"
echo"\$1es$1"
echo"$#parmetros"
Siejecutamosestescriptnosdaremoscuentadequenosdevuelveesto:
$0es(nombredelscript)
$1es
0parmetros
Comosepuedeverelaplicarunabarra\nospermite"escapar"enestecaso"escapamos"dequeenelscriptleaelparmetro
$0y$1comotextonormalynocomovariables.
Comonohemosintroducidonadalasvariablespermanecenvacas,sihubiramosejecutadoelscriptconargumentosnos
devolveraotracosa:
$./nombredelscripthola
Estonosmostraraenpantalla:
$0esnombredelscript
$1eshola
1parmetro
Creoqueseentiendebienelusodeestetipodevariables.
Usandovariableslocalesenfunciones(verseccinfunciones):
#!/bin/bash
variable=hola
functionhola{
localvariable=hola
echo$variable
}
Usandolasalidadeuncomandocomovariable:
#!/bin/bash
var1=$(free|grep"buffers")
echo"$var1"
Estescriptnosmostraraelequivalenteaejecutarfree|grepbuffersenunaconsola.
inicio
CUADRODEVARIABLESPREDEFINIDAS
$$Elnumeroidentificadordelprocesodelshell.
$?Resultadodelaejecucindelcomandoanterior.
$0Nombredelscriptqueseestaejecutando
$1$9Primeranovenoargumentoconlosqueseinvoca.
$*Todoslosargumentoscomonicapalabraseparador_.
$@Arraycontodoslosargumentosperoconposicin.
$#Numerodeargumentosrecibidos.
inicio
USANDOIFFI
Logicamentenosharafaltausarcondicionantesparapoderdotaralosscriptsdecierta"interactividadytomadedecisiones",
paraeso
usaremosiffi.
Unprogramaparamontarparticionesusandodilogos,parmetrosdefinidosporelusuario,coloresypocomassoloseusaif
fiparailustrarloademsreadparaqueelusuariointroduzcavariablesyseleponencoloresparahacerlomasatractivoyse
ilustraele,quenossirveparaejecutarenlamismashell,recordiselasuntodelprompt.
Ejemplobsicodeiffi:
#!/bin/bash
variable=verdadero
if["$variable"="verdadero"];then
echo"lavariableescorrecta"
else
echo"lavariablenoescorrecta"
fi
Enestecasonosvalemosdeeloperador=paraindicarquesilavariable1esigualalapalabraverdaderoseejecuteuna
accin,pensarqueesavariablepuedeserintroducidaporelusuario,comoveremosenelsiguientescript,masadelante
tenisunalistadeoperadores.
Aquitenisunscriptquehacealgotil;montarparticionesusandodilogos,parmetrosdefinidosporelusuario,coloresy
pocomassoloseusaiffiparailustrar,readparaqueelusuariointroduzcavariablesyseleponencoloresparahacerlomas
atractivoyseilustraele,quenossirveparaejecutarenlamismashell,recordis;elasuntodelprompt.
#!/bin/bash
echoe"\033[432mMONTAPARTICIONESPORXENTO\033[0m"
echoeDeseaayudasobreelprograma?"\033[34msi\033[0m"o
"\033[34mno\033[0m".
readA
if["$A"="si"];then
echoEsteesunscriptparafacilitarelusodelcomandomount
echoselepedirndatossobrelosparmetrosusadosporelcomando.
echoSielijelaopcinmostrarparmetrosdemontajeentrarenelmandelmismo.
echoPrimero:deberaintroducirelnombredelaparticin.
echoSegundo:deberaintroducireldirectoriodemontaje.
echoTercero:deberaintroducireltipodeparticin.
echoCuarto:deberadefinirlosparmetrosdemontaje.
else
echo
fi
echoeDeseaverlatabladeparticiones?"\033[34msi\033[0m"o
"\033[34mno\033[0m".
readV0
if["$V0"="si"];then
cat/proc/partitions
else
echo
fi
echoIntroduzcaelnombredelaparticin:
readV1
echoIntroduzcaeldirectoriodondequieremontarlaparticinconlarutacompleta
readV2
echoeDeseaverlostipossoportadosporsukernel?
"\033[34msi\033[0m"o"\033[34mno\033[0m".
readV00
if["$V00"="si"];then
cat/proc/filesystems
else
echo
fi
echoIntroduzcaeltipodeparticin:
readV3
echoeDeseaverlosparmetrosdemontaje"\033[31m(semuestraman)\033[0m"?"\033[34msi\033[0m"o"\033
[34mno\0330m".
readV01
if["$V01"="si"];then
manmount
else
echo
fi
echoIntroduzcalosparmetrosdemontaje:
readV4
echoeSonestoslosdatoscorrectos:mount$V4$V3/dev/$V1$V2?"\033[34msi\033[0m"o"\033[34mno\033[0m".
readR
if["$R"="si"];then
execmount$V4$V3/dev/$V1$V2
else
echoe"\033[731mINTRODUZCALOSDATOSDENUEVO\033[0m"
echo
echo
exec./nombredelscript
fi
echoParticionmontadacorrectamente
Enestescripthemosusadoifyfiparadefinirlosparmetrosdelusuario,yusandovariables,definimosquecosassedeben
ejecutar,elscriptesrealmentesencilloperoilustrabienelusodeiffi.
inicio
TEST
Parausariffihemosusadounnuevoelemento,loscorchetesqueevalanlascondiciones,estoestabasadodirectamenteen
test,testnossirveparaevaluarcondiciones.
Opcionesbsicasdetest
ltMenorque
eqIgualque
gtMayorque
leMenoroigualque
geMayoroigualque
neNocoinciden
a
Operadorlgicoand
exp1aexp2.
o
Operadorlgicoor
exp1oexp2.
Usodetest:
test8lt9
Usandovariablesentest:
variable1=5
variable2=3
test$variable1gt$variable2
Otraopcinmuytildeusodetest:
[3lt5]
Paraqueentendermejortestmiraresteejemplo:
#!/bin/bash
variable1=5
variable2=3
[$variable1lt$variable2]
echo$?
Aquihemosevaluadodosvariablesparaversilavariable1eramenorquelavariable2yparaverelresultadohemosacudido
alavariablederetorno,quenosmostrara0o1.
inicio
USANDOCASE
Paraevitarescribirtantosiffi(aunquenotienenadademalo:)podemosagruparunaseriedevariablesusandocase,aqu
estaelmismoejemploperoconcase.
Casenosseramuytilporejemploenestecaso,loquenospermitecaseescomprobarvariables,elusodecaseenestescript
esqueelusuarioalintroducirunaopcinestapasandounargumentoquesicoincideconunavariabledefinidaejecutarauna
partedelprograma.
Fijateenquesemuestran6lineasdetextoconunadiferenciarespectoalasanterioreslas""yeloperadornumricoentre
[1....n]sonlasusadasparaasociarlasalosnmeros.
1)
...n)
Loquesigueaestosnmerossonlasinstruccionesquedeberaejecutarelprograma.
Dejamosun*)porsielusuarionointroduceunaopcinvalida(variablenodefinida).
Ydespusseguimosconlaejecucindelscript.
#!/bin/bash
echoe""
echoe"33[432mMONTAPARTICIONESPORXENTO33[0m"
echoe""
echoe"33[34m[1]33[0m""Iniciarelprograma"
echoe"33[34m[2]33[0m""Mostrarayuda"
echoe"33[34m[3]33[0m""Mostrartabladeparticiones"
echoe"33[34m[4]33[0m""Mostrartipossoportadosporelkernel"
echoe"33[34m[5]33[0m""Mostrarmandelcomandomount"
echoe"33[34m[6]33[0m""Salirdelprograma"
echo"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo"Introduzcaunnumero"
readtuseleccion
case$tuseleccionin
1)echo;;
2)echo"Esteesunscriptparafacilitarelusodelcomandomountsele
pedirndatossobrelosparmetrosusadosporelcomandomount"
echo"Primero:deberaintroducirelnombredelaparticin"
echo"Segundo:deberaintroducireldirectoriodemontaje"
echo"Tercero:deberaintroducireltipodeparticin"
echo"Cuarto:deberadefinirlosparmetrosdemontaje";;
3)cat/proc/partitions;;
4)cat/proc/filesystems;;
5)manmount;;
6)exit0;;
*)echo"Porfavorintroduzcaunnumerodeopcinvalido1,2,3,4,5";
echoe"Secontinuaconalejecucinnormaldelprograma33[731mcontrol+cparasalir33[0m";;
esac
echoe"33[432mIntroduzcaelnombredelaparticin:33[0m"
readV1
echoe"33[432mIntroduzcaeldirectoriodondequieremontarlaparticinconlarutacompleta33[0m"
readV2
echoe"33[432mIntroduzcaeltipodeparticin:33[0m"
readV3
echoe"33[432mIntroduzcalosparmetrosdemontaje:33[0m"
readV4
echoe"33[431mSonestoslosdatoscorrectos:mount$V4$V3/dev/$V1$V2?33[0m""33[34msi33[0m"o"33
[34mno330m".
readR
if["$R"="si"];then
execmount$V4$V3/dev/$V1$V2
echoParticionmontadacorrectamente
else
echoe"33[731mINTRODUZCALOSDATOSDENUEVO33[0m"
echo
echo
exec./montaparticiones
fi
Buenoestonosdamasinteractividadynosahorralineasdecdigo,esotramaneramasdecomosepuedenhacerlascosas
Hayquedestacarllegadosaestepunto,quelainteractividaddelshellesimpresionante.
inicio
USANDOSELECT
Porsupuestoqueelbashofrecemuchasmasopciones,unamaneradistintaeselusodeselect.
#!/bin/bash
variables="montarsalir"
selectoptin$OPCIONES;do
if["$opt"="montar"];then
echo"Introduzcaelnombredelaparticin"
readv1
echo"Introduzcadirectoriodemontaje"
readv2
echo"introduzcatipodearchivos"
readv3
execmountt$v3$v1$v2
echo"particinmontada"
exit
elif["$opt"="salir"];then
exit
else
clear
echo"opcinincorrecta"
fi
done
Comosepuedeverestemtodoesmuyparecidoausarunbucle,peropuedesertil,esosinosimposibilitaavozdepronto
mostrarlasaccionesasociadasacadavariable,porloquesedeberamostrarinformacinenpantallaantessobreestas.
inicio
BUCLES
Losbuclesnossirvenbsicamenteparadefinirloquequeremossehagasisecumpleunacondicin,existenvariostiposde
bucles,cadaunotienemasomenosdefinidaunaaccin.
Elbucleforpermiteiterarsobreunaseriede`palabras'contenidasdentrodeunacadena.
Elbuclewhileejecutauntrozodecdigosilaexpresindecontrolesverdadera,ysoloseparacuandoesfalsa(ose
encuentraunainterrupcinexplicitadentrodelcdigoenejecucin).
Elbucleuntilescasiidnticoalbucleloop,exceptoenqueelcdigoseejecutamientraslaexpresinndecontrolse
evalecomofalsa.
FOR
#!/bin/bash
foriinv1v2v3v4;do
echo"Estassonlasvariables$i"
Estescriptnosmostraraenpantallaesto:
Estassonlasvariablesv1Estassonlasvariablesv2Estassonlasvariablesv3Estassonlasvariablesv4
Laexplicacincreoquequedaclara.
WHILE
#!/bin/bash
MINUM=8
while[1];do
echo"Introduzcaunnumero:"
readUSER_NUM
if[$USER_NUMlt$MINUM];then
echo"Elnumerointroducidoesmenorqueelmio"
echo""
elif[$USER_NUMgt$MINUM];then
echo"Elnumerointroducidoesmayorqueelmio"
echo""
elif[$USER_NUMeq$MINUM];thenecho"Acertaste:Minumeroera$MINUM"
breakfi
done
Conesteejemploloquehemosechoessencillo,evaluarunavariableusandounbucle.Noshemosvalidodealgunos
operadoresdetestydeiffi.
BREAK
Ademasntesequehemosterminadoelbucleconbreak,estaesunamagnificamaneradeterminarnuestrosbucles.
UNTIL
#!/bin/bashCONTADOR=20until
[$CONTADORlt10];doechoCONTADOR$CONTADOR
letCONTADOR=1
done
Esteejemploilustramuybienelusodeuntil,enestecasoelbuclesereproduceconunacondicinquevaria(let)cuandoel
bucleseejecutaporloquealfinalsecumplelacondicinyterminaelbucle.
OTROTIPODEBUCLE
UsandosintaxistipoC.
((a=1))while((a<=LIMIT))do
echon"$a"((a+=1))#let"a+=1"
done
echo
OtramaneradeusarlasintaxisestiloC
#!/bin/bash
foriin`seq110`;
doecho$idone
Enla[18]detodosloshowtosobrebashscripting,hayunmontndeejemplosdecomohacerbuclesdemanerasdistintas.
inicio
FUNCIONES
Lasfuncionesnossirvenparatenercdigodentrodelcdigo,esdecirpodremosejecutarpequeosonotanpequeotrozos
decdigocomosisetratasendescriptsdistintos,estoestilsobretodoparadefinirvariables,sobretodosiesasvariablesno
poseenunvalorfijo.
functionhola{
echo"holamama"
}
Estafuncinnosdevolveraenpantalla:holamama,paraaccederaestafuncinsolohayquellamarlacomosiuncomando
massetratase.
Escribiunpequeo[20]sobreelprompt,enelexplicoqueesycomousarunafuncin,perocomoesteesotrodocumento,
puespondremosmasejemplos.
#!/bin/bash
functionmemf{
execfree|grepMem|awk'{print$4}'}
functionmemt{
execfree|grepMem|awk'{print$3}'}
functioncpu{
exectopn1|grep"CPUstates"|awk'{print$3+$5"%"}'}
functiondate{
execdate|awk'{print$1""$3""$2""$6}'}
echo"Informaciondelsistema"
memf
memtcpu
date
exit
Estescriptnosmostraraloquelasfuncionescontienen.
inicio
USODECARACTERESESPECIALES(COMODINESVARIOS)
Loscaracteresespeciales,sonconsideradosporelshellcomoparmetrosespeciales,dehayquenombresdevariables,con
estosnoseanunabuenaidea.
Var*?=holaMalaeleccion
var10=holaMalaeleccin
var1_0=holaBuenaopcin
["$number"<5]Malaeleccin
["$numero"lt5]Buenaopcin
Laexpansindeuncomando
Lasalidaproducidaporuncomando,substituyealpropiocomando.(comando)'comando'producenlasalida,noseejecutara
elcomando.
'execemacs'
Mostrariaenpantallaeltextoexecemacs,siporelcontrariosimplementenoloencerramosseejecutaraemacs.
Laexpansinaritmtica.
Elshellevalaunaexpresinymuestrasuresultado:((1+1))mostraraenpantalla2
Laexpansindesufijosyprefijos.
Ejemplotilymasclaroqueperdermeenexplicaciones.
Echohola{mundo,mama,pepe}adis
Estonosmostraraenpantalla:
holamundoadis
holamamaadis
holapepeadis
Laexpansindenombresdefichero.
Encadapalabraqueaparezcancaracteresespeciales*?|elshelltrataraesapalabracomounpatrn,P.ejm:
ls*.rpmEstodevolveratodoslosarchivosconextensin.rpm
Otrasexpansiones.
~estosubstituyetodaslaspalabrasporargumentosdeundirectoriodeusuario.
~xento/estonosmandaraaalhomedelusuarioxento.~/nosmandaraaldirectoriohomedelusuarioqueejecuteelscript.
Var=hola{var}Estonosmostraraelvalordelavariablevar,esdecirnosmostraraenpantallahola.
inicio
SCRIPTSBASHPARAXWINDOW
Unamaneradecrearscriptsqueparecensoftware,yesmasconmultituddeopcionesesXdialog.
Estaesunaherramientaquesubstituyeadialogocdialodyqueusagtkparacrearventanasdeunamaneramuysimple,
bsicamentelasintaxiseslamismaqueparaelbash.documentacinydescarga,mirarenestaweb[23]paraverlas
posibilidadesdeXdialog
Ejemplodeunaventana:
xdialogtitle"Esteeseltitulo"msgbox"Esteeseltextodelaventana"00
Estonosmostraraunapantallaengtkconeltexto:
Esteeseltextodelaventana
Xdialogesunbuensubstitutodedialogocdialog,yposenumerosasopcionestpicasencualquierlenguaje,crearentradasde
texto,listadebotones,botonesdeconfirmacin,dilogosyesno,opcindeabrirarchivo,textoeditable,etc...
UnEjemplotil.
<Mostramoslasalidadeuncomandoylapasamosaunfichero>
psaux|expand>>/tmp/textboxjobs.tmp.$$
<despusmostramosesearchivoenunacaja>
xdialogtitle"Actualesprocesos"textbox"/tmp/textboxjobs.tmp.$$"00
<pedimosalusuarioqueintroduzcaunavariable>
V1=`xdialoginputbox"introduzcaelnombredelatareaaterminar"8402>&11>/dev/tty`
<lavariablees'V1',yusamoslasalidaattyparapoderguardarla>
<Usamoslavariableparameterlaenuncomandodirectoalbash>
execkillall9$V1
<Cajadeconfirmacin>
dialogtitle"$V1"msgbox"Latarea$V1asidofinalizadaconexito"00
Xdialogposeeunabuenacantidaddeejemplos,detodaslasfuncionesquepodemoshacerconelenladocumentacinque
acompaaalpaquete.
ZENITYALDESNUDO
ZenityesunprogramaquenospermiteusarciertosargumentosparacrearventanasusandoGTK.
Elporquehedecidoextendermemasconestequeconotro,tieneunasencillaexplicacin;ltimamentehecreadoalgunas
cosasconel,ypuedodarunejemplodeestructuradetrabajoconestosejemplos,yasdejarmasclaroelusodeestos
programas(xdialogykdialog)engeneral.
Posibilidadesdezenity
Mostrartextoenunaventana(text).
Podemosdefinirlaalturayanchuradelaventana.
Podemosdefinirelicono(error,warning).
Tambientenemoslaposibilidaddeindicarcualseraeliconodelaventana(windowicon)
Ademaszenitynospermiteusarlistasdeelementosycheckboxesconposibilidaddehacerlaseditables,yconfigurarlas
cabeceras.
Calendarioyseleccindedias,meses,aosyformatodelcalendario.
Dialogostipoyes/no(question).
Barrasdeprogreso(progress)conopcionesdistintas,autocerrarse,indicadordeltantoporciento,textodeldialogoy
enunciado.
Mostrartextoenunaventana(filename)hacerloeditableo/yocultarlo.
Tambiennospermitelaseleccindearchivos(fileselection).
Yusarunaentradadetexto(entry)conposibilidaddeintroduciruntextopredeterminado,omostrareltextoqueseescribe
comoasteriscos.
Formasdetrabajoconzenity.
Ejemplobsico:
#!/bin/bash
zenitytitle"titulodelaventana"infotext"holamundo"
Laopcininfo,puedeserotra(question,warning,error)
Siusamoslaopcinquestionelresultadonosdevolver0o1quesealmacenaenlavariable$?,vercuadrodevariables
predefinidas.
Ejemplousandovariablesderetornoydilogostipoyes/no
#!/bin/bash
zenitytitle"titulodelaventana"questiontext"Aceptar?"
if["$?"="0"];then
zenityinfotext"Hasaceptado"
else
zenityinfotext"Nohasaceptado"
fi
Trabajandoconfechas
#!/bin/bash
zenitycalendar
Estesencilloscriptnosmuestrauncalendariocompleto,dondepodemosirhaciadelanteohaciaatrasenel.
Sipulsamosaceptarnosdevuelvelafechadelaseleccin,estoesinteresanteporsuposibilidaddeaplicacin
#!/bin/bash
var=$(zenitycalendartext"Seleccionaunafecha")
zenityquestiontext"Hasseleccionado$var"
Enesteejemploquedailustradocomo"aprovechar"estaopcinparaalmacenarlacomovariable,simplementeusoun
comandocomovariable.
Enlacreacindelistas,sepuedenusarloselementosdelaslistasdelasiguientemanera,porejemplo:
#!/bin/bash
v1=$(zenitylistcolumn"Tiposdeopciones""opcion1""opcion2")
if["$v1"="opcion1"];then
zenityinfotext"Opcion1"
elif["$v1"="opcion2"];then
zenityinfotext"Opcion2"
else
fi
Comoencualquierscript,zenityadmitequelepasemosvariablescomoopciones.
#!/bin/bash
var1="Introduzcaunao"
var2=$(zenityentryhidetexttext"$var1")
var3=$(zenityentrytext"Introduzcaunmes")
var4=$(zenityentrytext"Introduzcaunodia")
zenitycalendaryear"$var2"day"$var4"month"$var3"
Unaspectomuytileselusodelas"herramientas"quezenity(okdialogyxdialog)ponenanuestradisposicinparatrabajar
conarchivos.
#!/bin/bash
zenitytextinfofilename"/etc/fstab"
Desdeluegoparapodervermejorelusodezenityesimprescindibleleerbienlaayudadelcomandoascomosupaginadel
manual(manzenity,incluyealgunosejemplostiles),tambinpuedever:
zenityhelp
zenityusage
Enelnavegadordeayudadegnome(yelp)sepuedeconsultarunmanualconscriptsdeejemplosycapturasdecadaejemplo,
muycompleto.
Puedeaccederdichomanualusandozenityabout.
KDIALOG
Kdialog
Kdialogesunaaplicacinbastantecompletaqueinteractaconkde.
TrabajaconQtynospermitecrearscriptsconverdaderapotencia,siempreycuandotrabajemosconkde.
Kdialogesunaaplicacinpotente,poseeunaseriedeaspectosquelohacendistintoquexdialogoquezenity.
Heaqulasalidadekdialoghelpall.
Opcionesgenricas:
helpMuestraayudasobrelasopciones.
helpqtMuestraopcionesespecficasdeQt.
helpkdeMuestraopcionesespecficasdeKDE.
helpallMuestratodaslasopciones.
authorMuestrainformacindelautor.
v,versionMuestrainformacindelaversin.
licenseMuestrainformacindelalicencia.
Findelasopciones.
OpcionesdeQt:
display<displayname>Usalapantalla'displayname'delservidorX.
session<sessionId>RestauralaaplicacinparaelId.'sessionId'dado.
cmapProvocaquelaaplicacininstaleunmapadecolorprivadoenunapantallade8bits.
ncols<count>Limitaelnmerodecoloresreservadosenelcubodecolorenunapantallade8bits,silaaplicacinusala
especificacinQApplication::ManyColor.
nograbImpidequeQtcaptureelratnoelteclado.
dograbEjecutarloconundepuradorpuedeprovocarunnograbimplcito;usedograbparaevitarlo.
syncCambiaamodosncronoparadepurar.
fn,font<fontname>Definelafuenteparalaaplicacin.
bg,background<color>Especificaelcolorpredeterminadodelfondoyunapaletadecolores(sombreadosclarosy
oscurossoncalculados).
fg,foreground<color>Especificaelcolorpredeterminadodeprimerplano.
btn,button<color>Especificaelcolorpredeterminadodelosbotones.
name<name>Especificaelnombredelaaplicacin.
title<title>Especificaelttulodelaaplicacin.
visualTrueColorFuerzaalaaplicacinausarunapaletadecoloresTrueColorenunapantallade8bits.
inputstyle<inputstyle>EspecificaunestilodeentradaXIM(XInputMethod).
Losvaloresposiblesson:'onthespot','overthespot','offthespot'y'root'.
im<XIMserver>EspecificaelservidorXIM.
noximDesactivaXIM.
reversereplicaeldiseocompletodeobjetosvisuales.
OpcionesdeKDE:
caption<caption>Usa'caption'comonombreenlabarradettulo.
icon<icon>Usa'icon'comoiconodelaaplicacin.
miniicon<icon>Usa'icon'comoiconoenlabarradettulo.
config<filename>Utilizararchivoalternativodeconfiguracin.
dcopserver<server>UsaelservidorDCOPespecificadopor'server'.
nocrashhandlerDesactivaelmanejadordefallos,paraobtenervolcadosdememoria.
waitforwmEsperaaunadministradordeventanascompatibleconWM_NET.
style<style>EspecificaelestilodelGUIdelaaplicacin.
geometry<geometry>Especificalageometraclientedelobjetovisual(widget)principal
Opciones:
yesno<text>Cuadrodetextodepreguntasconbotonesdesi/no
yesnocancel<text>Cuadrodetextodemensajesconbotonesdesi/no/cancelar
warningyesno<text>Cuadrodeavisodemensajesconbotonesdesi/no
warningcontinuecancel<text>Cuadrodeavisodemensajesconbotonesdecontinuar/cancelar
warningyesnocancel<text>Cuadrodeavisodemensajesconbotonesdesi/no/cancelar
sorry<text>Cuadrodemensajede'Losentimos'
error<text>Cuadrodemensajede'error'
msgbox<text>Cuadrodedilogodemensaje
inputbox<text><init>Cuadrodedilogodeentrada
password<text>Dilogodecontrasea
textbox<file>[width][height]Cuadrodedilogodetexto
combobox<text>[tagitem][tagitem]...Dilogodelistadesplegable
menu<text>[tagitem][tagitem]...Dilogodemen
checklist<text>[tagitemstatus]...Dilogodelistadecomprobacin
radiolist<text>[tagitemstatus]...Dilogodelistadeseleccionesexcluyentes
getopenfilename[startDir][filter]Eldilogodearchivosabreunarchivoexistente
getsavefilename[startDir][filter]Dilogodearchivosparaguardarunarchivo
getexistingdirectory[startDir]Dilogodearchivoparaseleccionarundirectorioexistente
getopenurl[startDir][filter]EldilogodearchivosabreunaURLexistente
getsaveurl[startDir][filter]DilogodearchivosparaguardarunaURL
title<text>Ttulodedilogo
separateoutputDevolverelementosdelistaenlneasseparadas(paraopcindecomprobacin)
printwinidMuestraelwinIddecadadilogo
embed<winid>HaceeldilogotransitorioparaunaaplicacinXespecificadaporwinid
dontagain<file:entry>Archivodeconfiguracinynombredelaopcinparaguardarelestado"nomostrar/volvera
preguntar"
Argumentos:
argArgumentosdependientedelaopcinprincipal
Comosepuedeapreciar,kdialognosproporcionaunentronomas"amigable"siusamoskde,detodasmanerastambinse
puedeusarsineste,perolanzartodoloquerequierekdeparaunasimpleaplicacinconcuadrosdedialogo,bajomipuntode
vistanoesproductivo.
Otratemaseriasibuscamosalgunafuncinmasespeficica.
Podemostratarlasvariablesigualqueenzenityoxdialog.
kdialognospermiteunoscuadrosdedialogoconotrotipodefunciones.
P.ejm:
#!/bin/bash
kdialogwarningcontinuecancel"Deseacontinuar"
kdialogmsgbox"$?"
Siaceptramosnosdevolveraun0enlavariablederetorno($?)sinodirectamentecerraraelprograma,nosaltaala
siguienteinstruccin.
P.ejm
#!/bin/bash
var1=$(kdialoggetopenurl/html)
mozilla$var1
Enesteejemplo,usamosunaventanadeseleccindearchivopartiendodeldirectorioraiz(/)yfiltrandoalosarchivosque
tenganlaextensinhtml.
Despueselarchivolovisualizamosconmozilla.
Enelcapitulodezenityexplicomejorcomopoderusarlasopcionesdeestetipodeprogramasusarvariables,laslistas,los
checkboxesydems.
Comoapunte,decirquesialguiensevetentadoacrearcosillasbajokde,existenherramientastalescomokdevelop,perosi
buscisalgomassencilloperoconposibilidadesdecrearesqueletosgrficoscompletos,teniselkommanederesuna
aplicacinquerequierequantaparafuncionar,ytrabajaconxml,esmuyfcildeaprenderausarlaypuedescrearcosasmas
serias.
inicio
TUBERIASYREDIRECCION.
Enestosejemploscomoenotros,hemosusadotuberas(|)yhemosredireccionadolasalidaaunarchivo.
Tuberias:
Lastuberaspermitenutilizarlasalidadeunprogramacomolaentradadeotro.
P.ejem:
netstatan|grepv"unix"
Enesteejemplousamoslasalidadelcomandonetstatparamandarlaagrepqueeliminaratodaslaslineasqueestelapalabra
unix.
Redireccion:
Laredireccionpuedeparecerlomismoperolgicamentenoloes,laredireccionenloquenosocupa,nospermiteusarla
salidadeuncomandoaunficheroousarelbufferresultantedeotramaneras.
Ejemplos:
comando>archivoestohacequelasalidadeuncomandoseescribaenunarchivo,ojoqueborraratodoloquecontieneel
fichero.
lsal>lista_de_archivos.txtEstomandaralasalidaalfichero.
lsal&>todo.txtEstomandaratodoaunfichero:todo.txt
lsal>>ficheroestoaadelasalidaalfinaldefichero,sinborrarlosdatosanteriores,ysinoexiste,locrea.
comando<archivoEstohacequeelcomandousecomoargumentosarchivo,muytilparacrearinterfacesmascomplejas.
Enel[25]delinsflugpuedevermassobreredireccion.
inicio
Comandostiles
Enestepuntodeldocumento,nosvamosacentrarsoloendaraconocerunoscomandosquenospuedenayudarmuchsimoa
trabajar,solosevananombrar,citarsuuso,explicarquehacenyenalgunoscasosseexpondrnalgunosejemplos,es
recomendablequesetenganunasnocionesbsicassobrehttp://www.linuxfocus.org/Castellano/July1998/article53.html
expresionesregulares,sibiennoesimprescindible,esrecomendable.
Nosepretendedarunaguiadeusodecadaunodeestos,solamentesecitanparaqueellector,sideseaprofundizarensuuso
busqueinformacinalrespecto.
AWK
Awkesunlenguajeensimismo,nospermitetrabajardecontextodeunamaneraespecial.
Basicamente(awkesextenso)elusodediaadiaqueledoy:
awk'/patrn{print}'archivo
Mebuscaunpatrnenunficheroeimprimeenpantalla.
Unamea|awk'{print$14$4}'
Estonosdevolvera:GNU/Linux2.6.51.mdk
Siejecutamosunamea:Linuxxentolocal2.6.51.mdk#1MonApr2623:18:57CEST2004i686unknownunknown
GNU/Linux
Conlocualhemosmostradosololoscampos13y4,quecorrespondenaGNU/Linuxy2.6.51.mkd
Awkesbastanteextenso,http://www.linux.org.uy/uylug/cursos/awk/awk.htmltenisunmanualenespaolbastante
completoparaentenderlaspeculiaridadesdeesteprograma.
SED
Esuncompletoeditordetexto,esositrabajandoconcomandos,loqueesdemuchsimautilidadparatrabajarcontexto
dentronuestrosscripts.
Elusodesedesextenso,perotambinesmuyverstil.
Acontinuacinalgunoscomodinesbsicosdesedquesuelousarconasiduidad.
echoholamundo|sed'/mundo/q'Muestraeltextohastaqueencuentramundo.
echoholamundo|sed'/mundo/d'Eliminalaslineasquecontienenmundo.
sedn'20,30p'Muestralaslineasentre20y30
sed'$d'Borralaultimalinea.
sed'1,10d'Borradesdelalinea1ala20
Sedtienemuchsimasmasposibilidades,enestearticulodebulmahttp://bulma.net/body.phtml?nIdNoticia=1281hay
muchsimainformacinsobresed,podisvermasomenosuncentenardeusosen
http://www.student.northpark.edu/pemente/sed/sed1line.txt
GREP,EGREP,FGREP
Lautilidadgrepnospermitebuscarencadenasdetextoconformeadistintosparmetros,apartedegreptenemosfgrep,egrep.
Estossoncomandosmasomenosampliosyunpococomplejos,
grepcdrom/etc/fstab
Nosmostraralaslineasdelarchivo/etc/fstabquecontienenlapalabracdrom.
grepvcdrom/etc/fstab
Nosmostraralaslineasquenocontienenlapalabracdrom.
Estoscomandossonextensosyposeenciertacomplejidad,podisveruntutorialbastantecompletoen
documentacintilsobreestas:
http://docs.sun.com/db/doc/8017484/6i1pp3qp3?l=es&a=view
http://www.ciberdroide.com/misc/novato/curso/regexp.htmlestapaginaesdelasmascuidadasquehevisto,ysobretodo
explicadeunamaneraclarisimacomousarexpresionesregulares.
http://www.zaralinux.org/docs/texto/texto_cap5.phpbuenarticulosobrefgrep,egrepygrep.
CUT
Cutnossirveparacortar(cutdelingles)cadenasdetexto,conformeacaracteres.
echohola:mundo|cutb2
o
Estaopcinnosmuestraelsegundocarcterdelacadena.
echo"hola:mundo"|cutd:f2
mundo
Usandoddefinimoselcampoapartirdelcualcortamos(separamos)lacadenadetextoyconfindicamoselcampoen
cuestin.
echohola:mundo|cutd:f1
hola
Elmismoejemplousandoelprimercampo
Cuttienemasopciones,recomiendolalecturadelaspaginasdelmanual,opruebecuthelp
PASTE
Nossirveparacombinarficheros.
archivo1archivo2
main(){printf
(holamundo);}
pastearchivo1archivo2>pastear1ar2
ficheropastear1ar2
main(){printf
(holamundo);}
Esteeselusobsico,vermandelcomandoparapodersacartodoeljugoapaste.
HEAD
NosmuestraXprimeraslineasdeunfichero.
Head20/etc/fstab
Nosmostraralasprimeras20lineasde/etc/fstab
TAIL
Esmuyparecidoahead,soloqueenvezdemostrarlasprimeraslineasmuestralasultimasXlineas.
Tail10/etc/fstab
Nosmostraralas10ultimaslineasde/etc/fstab
SORT
Sortbsicamente,(poseebastantesopciones)ordenalineasdetexto.
Lasintaxisdesortesbastanteextensa,
NL
Colocalosnmerosdelaslineasenunfichero.
nlfichero
1linea
2otralinea
TEE
Nospermiteredericcionarlasalidaamltiplesficheros.
Teeholaarchivoarchivo2archivo3
JOIN
Joinnossirveparacompararcadenasdetextoenarchivos.
Joinarchivo1archivo2
Salidadejoinhelp
aNUMFICHmuestraunalneaporcadalneanoemparejabledelficheroNUMFICH,dondeNUMFICHes1o2,
correspondiendoaFICHERO1oFICHERO2.
eVACOreemplazaloscamposinexistentesporVACO
i,ignorecasenoatiendealasdiferenciasentremaysculasyminsculas
jCAMPOequivalentea'1CAMPO2CAMPO'
oFORMATOutilizaFORMATOparamostrarlaslneasdesalida
tCARCTERUsaCARCTERcomodelimitadordecampos,enlaentradayenlasalida
vNUMFICHComoaNUMFICH,peronomuestralaslneasemparejadas
1CAMPOusaestecampodelfichero1
2CAMPOusaestecampodelfichero2
TR
Nospermiteborrarycomprimirdoscadenasdetexto,ysubstituircadenasporotras.
P.ejem:
#!/bin/bash
echoHolA|trabAZ
HOLA
Estescriptcambiaralasletrasenminsculasporlasmismasletrasenmaysculas.
Trposeemasopcionesdeuso,puedeborrarcaracteres,puedeoperarsolosobrealgunoscaracteresopuedecambiarlos.
BC
Esunprogramaquenospermiteclculosnumricosavanzados,esmuypequeoyposeeunlenguajepropio
esbastanteparecidoaC,peromuysimplificado.
http://usuarios.lycos.es/acisif/bc/bc.htmlhayunmanualqueestamuybienexplicadoelusodel
programa,muchomejordeloqueyopodrahacerlo.
http://www.die.net/doc/linux/man/man1/bc.1.htmlpaginasdelmaneningles.
http://bulma.net/body.phtml?nIdNoticia=2045unaarticulodelamanodeloschicosdebulma.
UNIQ
Uniqnospermitecompararlineas,contarlasyeliminarlas,(vermandelcomandoparapodervermejortodoelusodeuniq).
uniqcfichero
DIFF
Comparadosarchivos,indicndonoslaslneasquesondistintas.
Silosficherossoniguales,nomostraranada.
Porejemplo,tenemoslossiguientesficheros:
holamama(archivo1.txt)
holamundo(archivo2.txt)
diffarchivo1.txtarchivo2.txt
1c1<holamama>holamundo.
Sinomuestranada,losficherossoniguales.
-CMP
Comparaelcontenidodedosarchivos,muestralaprimeradiferenciaencontrada,sinosondiferentesnomuestranada.
$cmpficherofichero2
differ:char2,line1
Esdecir,laprimeradiferenciaestenelcarcter1,lnea1.
-WC
Esuncontadordelneas,palabrasycaracteres,suusoesmuysencilloytil.
l:cuentalneas.
c:cuentacaracteres.
w:cuentapalabras.
Puedetrabajarconcadenasy/oarchivos.
$wclarchivo.txt
2
$wccarchivo.txt
8
$wcwarchivo.txt
2
Siendoelarchivo:
hola
hola
Hastaaquconloscomandostiles,esperoquecuandoseplanteenproblemasdeltipo,comohagoesto?Conladescripcin
delasfuncionesdeestoscomandostengaporlomenosunaideasobredondeempezar.
http://www.tldp.org/LDP/abs/html/textproc.htmlaqutenisunareferenciamuybuenadeprogramasquetrabajancontexto,
conejemplos,muy,muytil,pertenecealadvancebashscripting.
inicio
SOCKETSENBASH
Hemosvistoqueconbashsepuedenhacermuchascosas,peroamientenderhayalgoqueesnecesarioencualquier
lenguaje:crearsockets,estoesimprescindiblecuandosepretendeprogramaraciertonivel,aqutepropongoideasal
respectodecomousarciertasherramientasparapoderusartusscriptsparabash.
Estapartedeldocumentoesunpocomasavanzada,yportantorequiereunosconocimientosmayores,vamosausarNetcat,
xinetdynetpipesquesepuededecirquesediseoparamanejarsocketsconotrosprogramas,yporlotantousablecon
scriptsparabash.
Creandoserviciosbasadoenxinetd.
BashnopuedemanejarsocketscomosideCoperl,java,setratase.
Ensulugarsisepuedencrearserviciosbasadosenxinetdyqueesteservicioseaunscriptparaelbash.
EnprimerlugarNOeselobjetivodeestedocumentoexplicarqueesxinetdniquehacenicomoseusa,tenisunmagnifico
articuloenlinuxfocusyenespaolsobrexinetd.
Tambiendisponisdealgunaayudausandolaspaginasderedhatsobreeltemaenespaol.
Yporultimousarmanxinetd.confparamasdetalles.
Eneldirectorio/etc/xinetd.d/seencuentranlosscripts,queusanlosdemoniosquecorrensobrexinetd,puesnosotrosloque
haremosacontinuacin,escrearunnuevoservicioyundemoniousandounscriptenbash,evidentementenoeslamejor
idea,peroilustralafuncionalidadebashenesteaspecto.
Ejemplodeunservicionuevo.
#default:on
#description:Unapruebadecreacindeserviciosusandounscriptenbash
servicearhf
{
port=9999
socket_type=stream
wait=no
user=root
server=/bin/arhflogin.sh
log_on_success+=USERID
log_on_failure+=USERID
disable=no
only_from=192.168.1.4
}
Estearchivoseguardariaconelnombredelservicio,enestecasoarhf.
Repito,parapoderverlasopcionesdeestetipodearchivos,verladocumentacinantesreseada.
Aquiloquenosinteresaesqueconunsencilloarchivo,definimosunscriptenbash(/bin/arhflogin.sh)paraactude
demonioalrecibirconexionesporelpuerto9999,
ELpuertodeberaestardeclaradoen/etc/services.
Extractodelalineaquehacereferenciaen/etc/services:
arhf9999/tcp#arhf
Yporfinnuestroservicio:
Evidentementepodemoscorrerdesdeun"holamundo"aunscriptquemanejeotrosprogramas,estoyalodejoala
imaginacindecadauno,detodasmanerasesteesunejemplotil:
#!/bin/bash
var1=$(hostname)
echo"Bienvenidoa$var1corriendosistemaARHF0.1"
echo"Introduzcaunnombredeusuario"
readv1
var2=$(cat/etc/arhf/passwd|awk'{print$1}'|cutd:f1|grep$v1)
if["$v1"=="$var2"];then
echo"Nombredeusuariocorrecto,introduzcalacontrasea"
readkey2
key1=$(arhfauth$key2)
key=$(cat/etc/arhf/shadow|awk'{print$1}'|cutd:f3)
if["$key"="$key1"];then
execarhf
else
echo"Desconectado=Contraseaincorrecta
exit0
fi
else
echo"Desconectandonombredeusuarioincorrecto"
exit0
fi
Estescriptsellamaraarhflogin.shyseriaelquesesituaraen/bin/odondedefinamos.
Comosepuedeverelscriptessencillo,conunafuncinexternallamadaarhfauthencriptolacontraseaselamando
compararconelarchivoshadow,ysiconcuerdanejecutamoselprogramaarhf.
Estescripttieneunaaplicacinreal,elprogramaarhfesunapequeabasededatoscreadacontclyarchivosdetextoplano,
comoverisnoesqueseaprecisamenteseguro,pero,parailustrarejemploessuficiente.
P.DUnavezcreadoelnuevoserviciodebemosreiniciarxinetd.
UsandoNetcatparamanejarsockets.
Estoquehemosecho,simplementeescrearunservicionuevobasadoenxinetd,peroconlaparticularidaddequeelservicio
ensiesunscriptparaelbash.
Existendiferentesutilidadesquenospuedenayudaratratarconsockets,unadeellasyquizslamasusadaylaquemejorse
adaptaanuestrasnecesidadesNetcat,enestaslineasnosepretendeunmanualdenetcatparaesoyaexistenmuchasotras
paginas.
NetcatesunprogramaquenospermitetrabajarsobreelprotocoloTCP/IP.
Laventajaquetenemossobretelnetp.ejm,esquepodemosinteractuarconelprogramaautomatizandotareas,porqueno
trabajaesperandoqueinteractesconel.
Laformamassimpledecrearunacomunicacinentredosmquinasesesta:
Servidor
#!/bin/bash
netcatlplocalhost9999
cliente
#!/bin/bash
netcatlocalhost9999
Comopodisveraqurealmentesolohacemosusodenetcatypocomas.
Pero,hayotrasmanerasdeusarloenscripts.
Ejemplo:Unscriptparagestionarelemail,basadoennetcat.
#!/bin/bash
#ncmailer0.1byxentoFigal(c)2004GNU/GPLhttp://gnu.org
echo""
echo"NCMailer0.1ByXentoFigalhttp://xinfo.sourceforge.net"
echo""
echo"[1]""Vercorreo"
echo"[2]""Mandarcorreo"
echo"[3]""Eliminarcorreo"
echo"[4]""Obtenercorreo"
echo"[5]""Salirdelprograma"
echo"Introduzcaunnumero"
readvar
case$varin
1)
echo"Introduzcaelnombredelservidorpop3"
readv3
echo"Introduzcaelpuertodelservidor"
readv4
echo"Introduzcaelnombredelusuario"
readv1
echo"Introduzcalacontrasea"
readv2
echo"USER$v1
PASS$v2
STAT
LIST
QUIT"|nc$v3$v4
;;
2)
echo"Introduzcaelnombredelservidorsmtp"
readv1
echo"Introduzcaelpuertodelservidor"
readv2
echo"Introducaladireccindeorigen"
readv3
echo"Introduzcaladireccindedestino"
readv4
echo"Introduzcaelcuerpodelmensajesinpuntos"
readv5
functionmandar{
cat<<EOF|netcat$v1$v2
RSET
HELO
MAILFROM:<$v3>
RCPTTO:<$v4>
DATA
$v5
.
QUIT
EOF
}
echo"Mandarelemail?si/no"
readv6
if["$v6"=="si"];then
mandar
echo"Elmailsehamandado"
elif["$v6"=="no"];then
echo"Elmailnosehamandado"
else
echo"Opcionincorrecta,introduzcasionosinmaysculasniespacios"
exit0
fi
;;
3)
echo"Introduzcaelnombredelservidorpop3"
readv3
echo"Introduzcaelpuertodelservidor"
readv4
echo"Introduzcaelnombredelusuario"
readv1
echo"Introduzcalacontrasea"
readv2
echo"USER$v1
PASS$v2
STAT
LIST
QUIT"|nc$v3$v4
echo"Introduzcaelnumerodelmensajequequiereeliminar"
readv5
echo"Borrarelmensajenumero$v5?si/no"
readv6
if["$v6"=="si"];then
echo"Borrandoelmensajenumero$v5"
elif["$v6"=="no"];then
echo"Elmensaje$v5nosehaborrado"
else
echo"Opcionincorrecta,introduzcasionosinmaysculasniespacios"
exit0
fi
echo"USER$v1
PASS$v2
STAT
DELE$v5
QUIT"|nc$v3$v4
echo"Elmensajenumero$v5hasidoeliminado"
;;
4)
echo"Introduzcaelnombredelservidorpop3"
readv3
echo"Introduzcaelpuertodelservidor"
readv4
echo"Introduzcaelnombredelusuario"
readv1
echo"Introduzcalacontrasea"
readv2
echo"USER$v1
PASS$v2
STAT
LIST
QUIT"|nc$v3$v4
echo"Introduzcaelnumerodelmensajequequieredescargar"
readv5
echo"USER$v1
PASS$v2
STAT
LIST
RETR$v5
QUIT"|nc$v3$v4>mensajenumero$v5de$v3
echo"Mensajeguardadocomomensajenumero$v5de$v3"
;;
5)exit;;
*)echo"Porfavorintroduzcaunnumerodeopcinvalido1,2,3,4,5";
esac
exit
Aquihemosusadovariablesparadefiniralgunosaspectosdeloscomandospopmandadospornetcatalservidor,como
podrisverelfallomasgrande(entreotrosporsupuesto)resideenquecadavezqueefectuamosunaoperacincerramosla
conexinynostocavolverreiniciarlaparaefectuarmasoperaciones,perocreoqueesunclientedecorreobastanteligero
no?:))
Estoesporpartedelcliente,ahoravamosaverporpartedelservidor.
#!/bin/bash
echo"Bienvenido"|netcatlp9999
exit
EstonosmostraraenmensajeBienvenidoycerraralaconexin.
#!/bin/bash
netcatlp9999<archivo.txt
Estescriptusaraarchivo.txtparamostrarloenpantallacadavezquealguienseconecteporesepuerto.
Porotrolado,unamaneramuyfcildecrearundemonioesesta:
Ejecutamosnetcatdeestamanera:
netcatlp9999escript.sh
Alhaceraslascosas,loqueelindicamosanetcatesquepermanezcaalaescuchaenelpuerto9999yquecuandorecibauna
conexin,ejecutescript.sh.
NOTA:Dadoquepermitimoslaconexin,elarchivodebetenerpermisosdeejecucinylectura.
Sihacemosestacombinacin:
netcatlp9999encmailer.sh
Laconexinentrante,dispondrdeunclientedecorreo.
Porloquesoloquedahacerunscriptquehagaloquenosotrosqueremos.
Detodasmanerasenhttp://www.csd.uch.gr/~mstamat/hacks/foohttpd.htmltenisunservidorwebechoconnetcatybash,
otroenhttp://lug.umbc.edu/~mabzug1/bashhttpd.htmlynumerosadocumentacin.
.
Ademasdenetcatpodemosaprovecharotrasherramientas,enelpaquetedenetpipes,encontramosunavariedadinteresante,la
explicacindelusodeestasherramientasnoestanextensacomolaquesedioconnetcat,netcatesquizslaherramientamas
verstilparaestetipodescripts,perorecuerdoqueeldocumentonoesunmanualdeestetipodeherramientas,porloque
seranecesarioqueellectoraprendaausarlasparapoderextraertodoelrendimientodeestas.
Elpaquetenetpipescontienendiversasutilidades,nosvamosacentrarendos:
Hose:Nospermiteconectarnosaunpuertoabriendounsocket.
Estepaquetenosseradeutilidadparacrearclientes.
faucet:Nospermiteabrirunsocketenlamaquinalocal.
Esteotronosservirparacrearservidores.
Ejemplodefaucetpermaneciendoalaescuchaenelpuerto9999.
faucet9999outverboseonceecho"holacliente"
Cuandounclienteseconectealpuerto9999veraeltextoholaclienteysecerraralaconexin.Ladiferenciaesquepodemos
usardeunamaneramasintuitivaparacrearscripts.
http://www.starlinux.net/articulos/bash3/starbottenisunclientedeircconstruidoconnetpipes.
http://web.purplefrog.com/~thoth/netpipes/netpipes.htmlaquencontrarastantoelpaquetecomoelmanualyejemplosde
uso.
Autentificacionbasadaenbash:
Paramanejarlascontraseasenlosscriptstiposervidor,esmasseguroautentificarlas,aqutenisunprogramaqueesmuy
tilparaesoscasos.
Yasequepuedopecardeinsistente,peroelusodeestasherramientasaconcienciayenprofundidadsealejamuchsimodel
mbitodeestetutorial.
inicio
BASHENTIERRASHOSTILES(EltituloylaideadeesteapartadoselodeboaSubbohfer:es.comp.os.linux)
Avecesnoshacefaltacorrerscriptsenbash,ousardirectamenteutilidadesdeLinuxenotrosentornos.
Enestoscasos,podemosrecurriraciertasherramientas,nopuedoponerunadescripcinmuygrandepuestoquenolashe
probadonunca,perotalvezaalguienlepuedanserdeutilidad.
Aquitenisunbash2.03,precompiladoparawindows.
Estootro,sonunaseriede.exe,segnellosson3cosas:
LibrariesthatprovideaUNIXoperatingsystembyimplementingtheUNIXApplicationProgrammingInterface
(API).
Includefilesanddevelopmenttoolssuchascc,yacc,lex,andmake.
KornShellandover250utilitiessuchasls,sed,cp,sttyetc.
Sonvarios.exeperosegnvi(noloheprobado)puedesbajarlakornenunsolo.exe,solotieneunpero;estabajolicencia
restrictiva,tedejanusarlocomo"educational"obienporunperiodode90diasdeprueba,laotrasolucinespagarla
licencia.
Tambienestaesto,es"AnimplementationoftheCSHforWindows"
Hayunaversingratuitaparaevaluacinydems.peronohuelemuybien,masbiencapadaserialamejordefinicin.
Estas,sonlasutilidadesGnuparawindowsincluidaZSH,concomandosvarios(cat,grep,find,etc...),perosupongoque
sernunoscuantos.exe
Aquihayunaseriedeutilidades,cat,bc,shellutils,less,textutils,yunascuantasmas,noesnecesariocgywin.
Enestalineatambinhayotracosilla,quesibienpartedecgywindicenquenoesnecesarioparahacerlascorrer,son18
utilidades,incluidasgzip,bashetc...,lodelalicencianoestamuyclaro,noestrial,noesshare,nosupeaveriguarquetipode
licenciaes.
Evidentementeparapoderhacerfuncionarlascosas,yenestalineaestaclaroquecgywineslaopcinmasrecomendable,
perositenisqueusarscriptsparaunared,cgywintraeelproblemadeinstalarloentodaslasmquinas,esteproblemaesta
enunhilodediscusinactualmente"parado"enlibertonia.
inicio
DEPURANDOBASH
Existendosformasdehacerunadepuracin(debug)denuestrosscripts.
Aadiendounechoatodaslaslasvariables.(estanoes"real")
Estasotrassisonmodosdedepuracinreal.
shxscriptconerror
Estoejecutarelscriptymostrartodaslasentenciasqueseejecutanconlasvariablesycomodinesyaexpandidos.
Elshelltambintieneunmodoparacomprobarerroresdesintaxissinejecutarelprograma.Seusaas:
shntu_script
Sinoretornanadaentoncestuprogramanotieneerroresdesintaxis.
inicio
APENDICE1
ComandodeMS Comandoenlinux
DOS
descripciones
ASSIGN
ln
Crearenlaces
ATTRIB
chmod
Cambiarpermisos
CD
cd
Cambiardirectorio
CHDIR
cd
Cambiadirectorio
CLS
clear
Limpialapantalla
COMP
diff,comm,cmp
Comparaarchivos
COPY
cp
Copiararchivos
CtlC
CtlC
Sealbreak
CtlZ
CtlD
Finaldearchivo
DEL
rm
Borrararchivo
DELTREE
rmrf
Borradorecursivo
DIR
lsl
Verdirectorio
ERASE
rm
Borrararchivos
EXIT
exit
Salirdeunproceso
FC
comm,cmp
Comprararchivos
FIND
grep
Buscarcadenasdetexto
MD
mkdir
Creardirectorio
MKDIR
mkdir
Creardirectorio
MORE
more
Verpantallaapantalla
MOVE
mv
mover
PATH
$PATH
Ruta
REN
mv
Renombraromover
RENAME
mv
Renombraromover
RD
rmdir
Borrardirectorio
RMDIR
rmdir
Borrardirectorio
TIME
date
Fecha
TYPE
cat
Salidahaciastdout
XCOPY
cp
Copiadearchivos
inicio
Argumentosdeejecucindelbash.
Dentrodeunscriptpodemosaadirargumentosconoargumento.
Paraeliminaresosargumentos+oargumento.
Opcion.
Nombre
descripciones
noclobber
Nopermitesobrescribirarchivosporredireccion.
(none)
Muestralasdobles()precedidasde$,peronoejecutaenelscript.
allexport
Exportatodaslasvariablesdefinidas.
notify
Notificacuandohaytrabajosporterminaenbackground.
c...
(none)
Leecomandosdesde...
noglob
Expansiondearchivosdesactivada.
interactive
Elscriptseejecutaenmodointeractive.
privileged
Elscriptseejecutacomo"suid"
restricted
Elscriptseejecutaenmodorestricted.
nounset
Seusaparaquesiunfallodesalidadevariablelofuerzaysaledeeste.
verbose
Modoverbose
xtrace
Modoverboseconexpansindecomandos
errexit
Abortaelscriptalprimererror.
noexec
Leeloscomandosdelscriptperonolosejecuta.
stdin
Leecomandosdesdestdin
(none)
Saleantesdelprimercomando.
(none)
Findelasopcionesconflags.
inicio
REFLEXIONESIMPORTANTES.
Comosepuedecomprobar,losscriptsparaelbashformanpartedenuestrosistema,(rcporejemplo)porloqueuna
comprensinmnimadecomofuncionanesobligadoparapoderconocerquehace,comoycuandolohacenuestra
maquina.Porotrolado,existenprogramasquesondirectamentescriptsenbashyquepermitenhacermuchascosas.Los
scriptsparaelbashnosvanasolucionarlavidayautomatizarmuchastareas.
Tambiennossernmuytilesyenalgunasocasionesimprescindiblespararealizarmuchascosas.Comoaadidohayque
citarqueaprenderaescribirscriptsparaelshell,nospuedesermuytilparacrearunapuertadeentradaalaprogramacin
(misprimerospasosenlinuxfueronconscriptsparaelbash),puestoqueposeeunasencillamaneradehacerlascosas,nadie
mepuedenegarqueesunadelasmejoresmanerasdeintroducirseenelmundodelcdigo.
Sequemuchoslectores/assequedaranunpoco"vacos"conalgunasseccionesespecialmenteelusodeprogramasexternos,
bashentierrashostilesylossocketsenbash,perounavezmasdeborecordarqueelobjetivodeldocumentoeradotardeideas
paraempezaraescribirscriptparabash,ynocrearunaguiaavanzadadeprogramacin,detodasmanerasestoyanimndome
aescribirunhowtocentradonadamasenelusodenetcatynetpipesylacreacindescriptpotentes,cualquierayudasera
bienvenida.
inicio
NOTASDELAVERSION.
CopyrigthXentoFigal20032004xento@xento.tk
EstedocumentoseencuentrabajolicenciaGNU/FDL.
Version2.0del1.6
Versionenhtml,html.tar.gz,pdf.tar.gzen:
http://xinfo.sourceforge.net/documentos/bashscripting/
Actualizacionesehiloshttp://xinfo.sourceforge.net