curso shellccript

40
.::shell scripts::.   d u n e t n a . k e r n e l p a n i c

Upload: manuel-santiago

Post on 15-Sep-2015

224 views

Category:

Documents


2 download

DESCRIPTION

libro

TRANSCRIPT

  • .::shellscripts::.

    dunetna.kernelpanic

  • Copyright20042010dunetna

    Segarantizapermisoparacopiar,distribuirymodificarestedocumento segn los trminos de la GNU Free DocumentationLicense,Versin1.2ocualquierapublicadaposteriormenteporla Free Software Foundation, sin secciones invariantes nitextosdecubiertadelanteraoposterior.

  • Tabladecontenidos0.intro.......................................................41.conceptosbsicos...........................................5

    1.1.variables.............................................51.2.sustitucindevariables..............................61.3.sustitucindecomandos...............................71.4.caracteresespeciales.................................81.5.redireccionamentoe/s.................................81.6.filtros...............................................91.7.tuberas(pipelines).................................11

    2.programacindeshellscripts..............................132.1.ejecucindeshellscripts...........................132.2.depuracindeshellscripts..........................142.3.comentarios..........................................142.4.parmetrosyvariablesespeciales....................152.5.instruccionese/s....................................152.6.operadores...........................................162.7.evaluacindeexpresionesnumricas..................162.8.especificacindecondiciones........................172.9.estructurasalternativas............................182.10.estructurasiterativas..............................19

    3.unapocoms...............................................213.1.tablas...............................................213.2.funciones............................................213.3.expresionesregulares................................223.4.comandosmuuuuytiles...............................24

    3.4.1.sed............................................243.4.2.awk............................................25

    3.5.unpocodecolorymovimiento........................304.anexos.....................................................33

    4.1.ejercicios...........................................334.2.linksrecomendados...................................394.3.offtopic............................................40

  • 0.intro

    Estemanual,tutorialocomolequerisdecir,eselresultadodelcursorealizadoporkernelpanic(hacklabdeBarcelona)deprogramacindeshellscripts.

    No pretende ser un gran manual sino una ayuda a aquellaspersonasque,yasabiendoprogramarytienenunosconocimientosgenricos deUNIX, quieren usarellenguaje queofrece lashellparahacerscriptsquelasfacilitenlavida;)

    DedicamosestosapuntesalCSOLesNaus,desalojadoel9dediciembredel2003.Nosquitarnlosespaciosperoseguiremosluchando, construyendo y compartiendo conocimientos eilusiones.

    NOTA:Podeisencontrarlosejemplosdescriptsquetienensunombre entre parntesis en la webhttp://kernelpanic.hacklabs.org. Para cualquier duda osugerencia podeis enviar un mail [email protected].

    4

  • 1.conceptosbsicos

    1.1.variables

    Lashellnospermitedefinirvariablesdondealmacenardatos.Tenemos dos zonas de memoria donde podemos definir nuestrasvariables:elrealocalyelentorno.

    Variableslocales:slosonvisiblesporlashelldondeestamostrabajando,nosonvisiblesporningunasubshell,esdecir,nosonvisiblesporningnsubprocesodelashell.

    Variablesdeentorno: sonvisiblestantoporlashelldondeestamos como por cualquier subshell que abrimos (o porcualquiersubprocesodelashell)

    NOTA:unavariabledeclaradaenunprocesohijonoservisibleporsuprocesopadre(aunqueseadeentorno)

    COMANDOS

    set Vertodaslasvariablesdefinidas

    env Vertodaslasvariablesdeentornodefinidas

    nombre_var=valor_var Definirvariableyasignarlevalor

    exportnombre_var=valor_var

    Definirvariableentornoyasignarlevalor

    exportnombre_var Convertirvariablelocalavariabledeentorno

    unsetnombre_var Liberarunavariable

    ::ejemplo::$varmeva=3 declarounavariablelocal$echo$varmeva mirosuvalor3$bash entroenunasubshell$echo$varmeva notienevalorporqueeslocal$exit volvemosalashellprincipal$exportvarmeva conviertolavar.localavar.deentorno$echo$varmeva enlashellprincipalsigoviendosuvalor3 3$bash entroenunasubshell$echo$varmeva ahorasquevemossuvalor!!!3 (esdeentorno)$exit

    Variables predefinidas: Disponemos tambin de una serie devariablesyadefinidasquenospuedenserdegranayudaparaobtenerodejarinformacingenrica.

    5

  • VARIABLESPREDEFINIDAS

    HOME Directoriodetrabajoactual

    PATH Lugaresdondepodemosaccederdirectamentesinescribirelcamino

    PS1 Promptprimario

    PS2 Promptsecundario

    BASH Caminodelprogramabash

    BASH_VERSION Versindelabashactual

    COLUMNS Nmerodecolumnasenlapantalla

    GROUPS Identificadordelgrupoprincipaldelusuari@

    HISTCMD ndiceenelhistricodelcomandoactual

    HISTFILE Ficherodondeseguardaelhistrico

    HISTFILESIZE Medidadelficherohistrico

    HOSTNAME Nombredelamquina

    LANG Idiomapordefecto,sinosehaespecificadoenningnLC_

    LC_ALL Idioma

    PID Identificadordelprocesoactual

    PWD Caminodondeestamossituados

    RANDOM Nmeroaleatorio

    SECONDS Segundosquellevaencendidalamquina

    UID Identificadordelusuari@actual

    ::ejemplo::$echoMidirectoriodetrabajoes$HOMEymiiddegrupoes$GROUPS

    Midirectoriodetrabajoes/home/kpymiiddegrupoes1000

    1.2.sustitucindevariables

    Sustitucindevariables: Eslatcnicaqueutilizaremosparahacerreferenciaalvalorcontenidoenunavariable.

    SUSTITUCINDEVARIABLES

    $nombre_var Hacerreferenciaalvalordelavariablenombre_var

    ${nombre_var} Hacereferenciaalvalordelavariablenombre_var.Lasllavesnosdelimitanelnombredelavariable.

    ::ejemplos::1::: $saluda=hola definovariablesaludaconvalorhola

    $nombre=anna definovariablenombreconvaloranna$echosaludanombre muestroporpantallalosvaloresdelas

    variables...saludanombre estmal:hepuestolosnombredelas

    vars,nosuvalor$echo$saluda$nombre ahoraestbien!holaanna

    6

  • 2::: $masc=gat definovariablemascconvalorgat$echomasculino:$mascfemenino:$masca muestroel$mascy

    $mascseguidodeunaa

    masculino:gatfemenino: meinterpretamascacomounavar(vaca)

    $masculino:$mascfemenino:${masc}a pongo{}paradiferenciarelnombredelavariable

    masculino:gatfemenino:gata esoesloquequera!!!

    1.3.sustitucindecomandos

    Sustitucindecomandos: Eslatcnicaqueutilizaremosparasustituirennombredeuncomandoporlasalidadesta.

    SUSTITUCINDECOMANDOS

    `comando`$(comando)

    Sustituirelnombredelcomandoporsusalida

    ::ejemplos::1::: #whoami ejecutamosuncomando

    root quenosdiceaquienestsconectado#echoSoyel/lawhoami siqueremosmostrarporpantallay

    ponemoselcomando...Soyel/lawhoami ...nossaleliteralmenteloquele

    ponemos#echoSoyel/la`whoami` sustituimoswhoamiporelvalorque

    devuelvey...Soyel/laroot ...obtenemoselquequeramos!!!#echoSoyel/la$(whoami) otramaneradehacerloSoyel/laroot

    2::: $date+%F;date+%D ejecutamosdateconformatos%Fy%D2004102110/21/04$aaaammdd=%F damoscomovaloresestosformatosaadosvariables$mmddaa=%D$echoData(aaaammdd):`date+$aaaammdd` hacemosData(aaaammdd):20041021 sustitucinde$echoData(mm/dd/aa):`date+$mmddaa` comandosydeData(mm/dd/aa):10/21/04 variables...

    3::: pequeo script que nos crea una copia de seguridad denuestrodirectoriodetrabajo:CS=/var/backup`date+%Y%m%d`.tgz variableconelnombredela

    copiade seguridad(ej:/var/backup20040601)

    tarczf$CS/home/nomusu comprimimosyempaquetamoseldirectoriodetrabajo

    7

  • 1.4.caracteresespeciales

    Caracteresespeciales:Haycaracteresqueparalashelltienenunsignificadoespecial.Existendiferentestcnicasparaquela shell ignore este significado o para que lo tenga encuenta.

    COMANDOS

    \ anulaelsignificadoespecialdelcarcterquevadetrs

    '' anulaelsignificadoespecialdetodosloscaracteresqueestndentrodelascomillas

    anulaelsignificadoespecialdetodosloscaracteresexcepto:$\``

    ::ejemplos::1::: $echoElsilencio queremosmostrarsilencioentre...

    Elsilencio nosinterpretalasdesilenciocomouncarcterespecial!

    $echoEl\silencio\ lashemosdeescaparElsilencio

    2::: #echo'Soyel/la$LOGNAMEyestoyen$PWD'con''...Soyel/la$LOGNAMEyestoyen$PWD ...nointerpretalos

    $#echoSoyel/la$LOGNAMEyestoyen$PWDcon...Soyel/larootyestoyen/root ...squelos

    interpreta!#echoSoyel/la$LOGNAMEy\$PWD:$PWD mezclandoy\...Soyel/larooty$PWD:/root ...podemos

    interpretaronosegnnosconvenga

    1.5.redireccionamentoe/s

    stdin,stdoutystderr:Haycomandosqueaceptanlosdatosdeentrada por lo denominamos entrada estndar (stdin, condescriptor de fichero 0), que es el teclado. Tambin haycomandosquenosdansusalidaporlaquedenominamossalidaestndar (stdout, con descriptor de fichero 1) que es lapantalla.Porltimo,todosloserroresquepuedaproduciruncomando se dirigen a la salida de errores (stderr, condescriptordefichero2)

    Redireccionamiento de E/S: El redireccionamiento de E/S nospermitirquecogiendolosdatosdeentrada,salidayerrorylasredireccionemoshaciaotroficherodiferentealdonadopordefecto(stdin,stdout,stderr)

    8

  • REDIRECCIONAMENTOE/S

    < redireccionamentodestdin

    > redireccionamentodestdoutsielficheronoexistelocreasielficheroexistesecargaelcontenido

    >> redireccionamentodestdoutsielficheronoexistelocreasielficheroexisteaadeunacontinuacin

    2> redireccionamentodestderrsielficheronoexistelocreasielficheroexistesecargaelcontenido

    2>> redireccionamentd'stderrsielficheronoexistelocreasielficheroexisteaadeunacontinuacin

    1>&2 redireccionarstdoutastderr

    2>&1 redireccionarstderrastdout

    >& redireccionarstdoutystderraunfichero

    ::ejemplos::1::: $mailroots"hackyourmind!">copiafit2>>error.log aadimosfit1alficherocopiafityelerrorseiraerror.log

    3::: $catfit1fit22>fit31>&2 (fit1existe,fit2noexiste)todaslassalidasestnenfit3porqueloserroresvanafit3yredirigimosstdoutastderr

    $catfit1fit2>fit32>&1 (fit1existe,fit2noexiste)todaslassalidasestnenfit3porquestdoutvaafit3yredirigimosstderrastdout

    4::: $catfit1fit2>&fit3 (fit1existe,fit2noexiste)todaslassalidasestnenfit3porqueredirigimosstdoutystderrafit3

    1.6.filtros

    Filtro:Esunprogramaquerecibedatosporstdinysacadatosporstdout,sinmodificarlosdatosintroducidosporstdin.

    FILTROS

    cat[nombre_fichero] muestrastdin/nombre_fichero

    9

  • FILTROS

    cutclista[nombre_fichero]cutflistadsep[nombre_fichero]

    extraelascolumnascitadasenlistaextraeloscamposcitadosenlistasegnelseparadorsepformatodelista:A,Bseleccionarcolumnas/camposAyBABseleccionarcolumnas/camposdesdeAhastaBAdesdelacolumna/campoAhastaelfinalBdesdeelprincipiohastalacolumna/campoB

    grep[cinv]patrn[nombre_fichero]

    Bsquedadelaslneasdelosficheros/stdindelpatrndeterminadocslomuestraelnmerodelneayignoramaysculas/minsculasnaadeelnmerodelneavmuestralaslneasquenocontienenelpatrn

    formatodepatrn(expresionesregularesbsicas):.cualquiercarctersimple[]conjuntodecaracteres[^]cualquiercarcternoincluidoenloscorchetes[]rangos*0omsocurrenciasdelaexpresinprecedente+1omsocurrenciasdelaexpresinprecedente^expcualquiercadenaquecomienceconexpexp$cualquiercadenaqueacabeconexp

    head[num][nombre_fichero] Muestralasprimerasnumlneasdelfichero/stdin(10pordefecto)

    sed's/expr1/expr2/[g]'sedr's/expr1/expr2/[g]'

    Sustituyeexpr1porexpr2Sustituyeexpr1porexpr2conexpresionesregularescomplejasgsubstituyetodaslasocurrencias

    sort[ndutsep][knum][nombre_fichero]

    Ordenarlaslneasdenombre_fichero/stdinnordenacinnumricadnotieneencuentacaracteresquenoseanletras,nmerosoblancosunotieneencuentalaslneasduplicadastsepespecificaundelimitadordecampoknumespecificaqueordenaremosporelcamponum

    tail[num][nombre_fichero] Muestralasltimasnumlneasdelfichero/stdin(10pordefecto)

    tee[a]nombre_fichero1[nombre_fichero2]

    Muestraporpantallanombre_fichero2/stdinyloescribeennombre_fichero1aenlugardesobreescribirnombre_fichero1aadeacontinuacin

    10

  • FILTROS

    trc1c2[nombre_fichero]trsc1[nombre_fichero]

    traducec1porc2denombre_fichero/stdinconviertec1consecutivosenunosolo

    uniq[nombre_fichero] conviertediversaslneasigualesconsecutivasdenombre_fichero/stdinenunadesola

    wc[lwc][nombre_fichero] cuentalneas,palabrasycaracteresdenombre_fichero/stdin.lsloelnombredelneaswsloelnombredepalabrascsloelnombredecaracteres

    1.7.tuberas(pipelines)

    Tubera: Nos permiten redireccionar la salida de un comandocomounaentradaaotrocomando.

    COMANDOS

    comando1|comando2

    Redireccionamosstdoutdecomando1astdindecomando2

    ::ejemplos::1::: Mostrarlosnombresdel@s usuari@s dadosdealtaenel

    sistemaysushelldeinicio,ordenadosalfabticamenteyseparandolosdoscamposporuntabulador.$cat/etc/passwd|cutf1,7d:|sort|tr:\t

    2::: Visualizarunnmeroquesealasumadelaslneasdelosficheros/etc/profiley/etc/hosts$wcl/etc/profile/etc/hosts|tail1|cutf2d

    3::: Contarelnmerodeficheros(excluyendodirectorios)deldirectorioactualmodificadosenenero,alavezquesealmacena el nombre de los ficheros obtenidos en otroficherodenominadoenero.$lsl|trs|cutf6,8d|grep^....01|cutf2d|teeenero|wcl

    4::: A partir del fichero /etc/passwd crear un ficherodenominado migrupo que est formado por el nombre deusuari@,shellinicialydirectorioinicialdel@susuari@sdetumismogrupo.$cat/etc/passwd|grep^.*:.*:.*:`idg`:|cutf1,7,6d:>migrupo

    5::: Obtener unfichero denominado procsroot quecontenga elidentificador(PID)yelnombre(CMD)detodoslosprocesosquepertenecenael/lausuari@root.$psef|grep^root|trs|cutf2,8d>procsroot

    11

  • 6::: Obtenerunficherodenominado propsetcquecontengaunalista (sin repeticiones) con los nombres de l@spropietari@sygrupoalosquepertenecenlosficherosydirectoriosdeldirectorio/etc.$lsl/etc|trs""|cutf3,4d""|sort|uniq>propsetc

    12

  • 2.programacindeshellscripts

    2.1.ejecucindeshellscripts

    Shellscript: Noesmsqueunprogramaqueusaellenguajepropiodelashell.Haydiferentesmanerasdeejecutarlo:

    1.Enunasubshelldelashellactiva a)$bashnombre_scriptb)$./nombre_script (necesitamospermisosdeejecucin)c)$nombre_script (necesitamospermisosdeejecuciny

    queeldirectoriodondeestnombre_scriptestalPATH)

    2.Comounprogramaejecutablequeseejecutacomounproceso hijodelashellComoprimeralneadelscriptpondremosconqushellqueremosquenoslointerprete:#!/bin/bash

    yejecutamoselscriptcomoenelcaso1

    3.Enlamismashellactiva $sourcenombre_script$.nombre_script

    ::ejemplo::Creaunscriptdenombredorm.shconlasiguientelnea:

    sleep222

    Ejecucintipo1:$chmodu+xdorm.sh$./dorm.sh

    enotraconsolaveramos:$pstreep...bash(905)bash(1542)sleep(1543)...

    Ejecucintipo2:Ahoraelscripttendrelsiguientecontenido:#!/bin/bashsleep222

    $./dorm.shenotraconsolaveramos:$pstreep...bash(905)dorm.sh(1564)sleep(1565)...

    13

  • Ejecucintipo3:$.dorm.shenotraconsolaveramos:$pstreep...bash(905)sleep(1576)...

    2.2.depuracindeshellscripts

    Depuracin: Cuando hacemos un programa y los resultados queste produce no son los esperados, es muy til tener unaherramienta que nos permita depurarlo. Es decir, unaherramientaquenospermitahacerunseguimientopasoapasodepordondevaelflujodelprograma.

    DEPURACIN

    setx activaladepuracin

    set+x desactivaladepuracin

    sete Saleinmediatamentesiunaordensimpleacabasinxito(conuncdigoderetornodiferentedecero)

    set+e desactivaelsalirsiunaordensimpleacabasinxito

    ::ejemplo::Sitenemoselsiguientescript:

    SALUDA=holaDESPIDE=adissetxecho$SALUDA$LOGNAMEechoUsuari@sConectad@swhoset+xecho$DESPIDE$LOGNAME

    cuandoloejecutamosnosdepurarlaslneasdecdigoqueestnentresetxyset+xytendremoselsiguienteresultadoporpantalla:

    ++echoholahmholahm++echoUsuari@sConectad@sUsuari@sConectad@s++whohmtty1Jun319:39++set+xadishm

    2.3.comentarios

    Comentarios:Cuandoprogramamoshemosdetenerpresentequenoestamossolosenelmundoo,queaunqueloestemos,lamemorianospuedefallarynoentenderelprogramaquenosotr@smism@s

    14

  • hemos escrito... En resumen, que hemos de comentar nuestrosscriptsparahacernoslavidamsfcil:)

    COMENTARIOS

    #comentario comentarpartesdecdigo

    2.4.parmetrosyvariablesespeciales

    Parmetros: Un parmetro de un script sern todos aquellosvaloresqueadjuntamoscuandoejecutamossteyquequeremospoderverdentrodelprograma.

    $./nombre_scriptparmetro1parmetro2...parmetron

    Podemos hacer referencia a los parmetros pasados segn lasiguientetabla:

    PARMETROS

    $0 nombredelshellscriptqueseestejecutando

    $n Parmetropasadoalshellscriptenlaposicinn

    $* expandelosparmetrosenunacadena:par1par2...

    $@ expandelosparmetrosencadenasdiferenciadas:par1par2...

    shiftn

    Desplazarlosparmetrosennposiciones.Sinparmetrondesplaza1posicin.

    Variablesespeciales:Tenemosdiferentesdefinidasencualquierscriptquepodemosusarsegnnuestrasnecesidades.

    VARIABLESESPECIALES

    $# nmerodeparmetros

    $$ PIDdelashellprocesoqueseestejecutando

    $! PIDdelltimoprocesoejecutado

    $? Cdigoderetornodelltimoprocesoejecutado

    ::ejemplo::(sistema.sh)scriptquenosinformadediversosdatosdelsistema

    2.5.instruccionese/s

    Instruccionesdeentradaysalida: Sonaquellasinstruccionesquenospermitenleerdatosdestdin(entrada)ymostrardatosporstdout(salida)

    15

  • COMANDOS

    readnombre_var entradaporstdin

    echo[ne]cadena/$nombre_var

    salidaporstdoutconsaltodelneafinaleinterpretacaracterescon\\n:saltodelnea\t:tabulador...nsuprimeelsaltodelneafinal

    ::ejemplo::$readvarmia leemosunavariablede3 teclado$echoeMivares:\t\t$varmia mirosuvalorconunMivares:3 formato

    2.6.operadores

    Operadoresnumricos:sonaquellosquenospermitenoperarconnmerosyvariablesquecontienennmeros.

    Operadoreslgicos: sonaquellosquenospermitenespecificarcondicionescompuestas

    OPERADORESNUMRICOS

    OPERADORESLGICOS

    + suma ! no

    resta &&y

    \* producto ||o

    \/ divisin

    % mdulo

    \(\)

    parntesis

    2.7.evaluacindeexpresionesnumricas

    Enmuchasocasionestendremosquehacerclculosnumricosyaseaparamostrarelresultadoobienporalmacenarloenunavariable.

    EXPRESIONESNUMRICAS

    exprexpr_num evalaexpr_numsacandoelresultadoporstdout(aexpr_numhemosdesepararoperadoresdeoperandosconunespacio)

    letexpr_num((expr_num))

    evalaexpr_num(aexpr_numnohemosdesepararoperadoresdeoperandosconunespacio,nossirveparaasignar)

    ::ejemplos::1::: $expr3+5 calculamos3+5

    8 8!

    16

  • 2::: $((a=3+5)) calculamos3+5yponemoselresultadoala$echo$a variablea8 mostramoselvalordelavariable

    3::: $a=1$((a=$a+1)) incrementamoselvalordea$echo$a mostramoselvalordelavariable2

    2.8.especificacindecondiciones

    Condicin: Para romper el flujo de un programa necesitamosespecificarcondicionesquenoslobifurquenhaciaunladoohaciaotro.Paraespecificarcondicionesseusa:

    testexprobien

    [expr]

    A continuacin se exponen las condiciones que podemosespecificar:

    17

  • CONDICIONESFICHEROS

    [enombre_fichero] truesielficheroexiste

    [dnombre_fichero] truesielficheroexisteyesundirectorio

    [fnombre_fichero] truesielficheroexisteyesregular

    [Lnombre_fichero] truesielficheroexisteyesunenlacesimblico

    [rnombre_fichero] truesielficheroexisteytienepermisodelectura

    [wnombre_fichero] truesielficheroexisteytienepermisodeescritura

    [xnombre_fichero] truesielficheroexisteytienepermisodeejecucin

    [nombre_fichero1ntnombre_fichero2]

    truesifichero1esmsnuevoquefichero2

    [nombre_fichero1otnombre_fichero2]

    truesifichero1esmsantiguoquefichero2

    CONDICIONESCADENAS

    [cadena] truesinoeslacadenavaca

    [ncadena] truesilalongituddecadenaesdiferentede0

    [zcadena] truesilalongituddecadenaes0

    [cadena1=cadena2] truesicadena1ycadena2soniguales

    [cadena1!=cadena2] truesicadena1ycadena2sondiferentes

    CONDICIONESENTEROS

    [num1eqnum2] truesinum1ynum2soniguales

    [num1nenum2] truesinum1ynum2sondiferentes

    [num1gtnum2] truesinum1esmsgrandequenum2

    [num1genum2] truesinum1esmsgrandeoigualquenum2

    [num1ltnum2] truesinum1esmspequeoquenum2

    [num1lenum2] truesinum1esmspequeooigualquenum2

    2.9.estructurasalternativas

    Estructuras alternativas: son aquellas que nos permitenejecutar un trozo de cdigo segn si se cumple o no unacondicin.

    18

  • ESTRUCTURAif ESTRUCTURAcase

    ifcondicion1then

    instruccioneselifcondicion2then

    instruccioneselse

    instruccionesfi

    casenombre_varinpatron1)

    instrucciones;;patron2)

    instrucciones;;...patronn)

    instrucciones;;*)

    instrucciones;;esac

    ::ejemplos::1::: (existrc.sh)scriptquecompruebalaexistenciadelfichero

    .bashrc

    2::: (propsfit.sh) script quecomprueba siexiste elficheropasadoporparmetroy,siexiste,nosdasuspropiedades

    3::: (backup.sh) script que crea una copia de seguridad deldirectorioquelepasamoscomoparmetroylaguardaen/var/backupsconnombredeformatobackupaaaammdd.tgz

    4::: (soinifi.sh)scriptpensadoparaponeren/etc/init.d,quenosreproducirunsonidoalentraralsistemayunsonidoalsalir.

    2.10.estructurasiterativas

    Estructurasiterativas:sonaquellasquenospermitenejecutardiversasvecesuntrozodecdigo.

    ESTRUCTURAwhile ESTRUCTURAuntil ESTRUCTURAfor

    whilecondiciondo

    instruccionesdone

    untilcondiciondo

    instruccionesdone

    fornombre_varinlista_valoresdo

    instruccionesdone

    ::ejemplos::1::: (rename.sh)scriptquerenombradiversosficherosalavez

    eneldirectorioactual.

    2::: (llistafit.sh)scriptqueaceptacomoargumentosnombresdeficheros y muestra el contenido de cada uno de ellosprecedidodeunacabeceraconelnombredelfichero.

    3::: (estatdporm.sh)scriptquerealizaunestudiodetodoelrboldedirectoriosyficherosapartirdeldirectoriopasadocomoparmetrodeformaqueobtenemoslasiguienteinfo:

    19

  • Nmero de ficheros que disponemos con permiso delecturaNmero de ficheros que disponemos con permiso deescrituraNmero de ficheros que disponemos con permiso deejecucinNmerodeficherosquenodisponemosconpermisodelecturaNmerodeficherosquenodisponemosconpermisodeescrituraNmerodeficherosquenodisponemosconpermisodeejecucin

    4::: (grafica.sh) script que recibe como argumentos nmeroscomprendidosentre1y75.Darerrorencasoquealgnargumentonoest dentro delrangoyacabar sinhacernada. En caso contrario generar una lnea para cadaargumentocontantosasteriscoscomoindiquesuargumento.

    5::: (onesta.sh) script que busca la presencia del comandopasado como argumento en alguno de los directoriosreferenciadosalavariablePATH,sealandosulocalizacinyunabrevedescripcindelcomando.

    6::: (fitpar.sh) script que pone cada una de las palabraspasadas por parmetro en un fichero. Estos ficheros sedenominarnpalabra0,palabra1,...respectivamente.

    7::: (sequencia.sh)scriptquecuentaporti:)

    8::: (binbash.sh) script que aade la lnea #!/bin/bash alprincipiodelosficherosquelepasescomoparmetro,siesqueyanolotiene(paragenteconpocamemoria...)

    20

  • 3.unapocoms...

    3.1.tablas

    Tabla:esunaestructuradedatoscompuesta.

    va10 va11 va12 va13 va14 va15 va16 va17 va18 va19

    0 1 2 3 4 5 6 7 8 9

    arr

    A continuacin podemos ver como definirla y como hacerlereferencia:

    TAULES

    nombre_arr=(val1val2...valn)

    declaracinyasignacininiciales

    declareanombre_arr declaracindeunatabla.tilparahacerasignacionesdinmicas.

    nombre_arr[index]=val asignacindevalalelementoindexdenombre_arr

    ${nombre_arr[index]} Hacereferenciaalelementosituadoenindexdelatablanombre_arr

    Podemoshacerreferenciaaelementosycaractersticasdelatablaconlassiguientesexpansiones:

    EXPANSIONES

    ${nombre_arr[#]} nmerodeelementosdelatabla

    ${nombre_arr[@]} listaloselementosdelatablatratadoscadaunodeelloscomounacadena

    ${nombre_arr[*]} listaloselementosdelatablatratadoscomounanicacadena

    ${#nombre_arr[index]} longitudde${nombre_arr[index]}

    ::ejemplo::(gen_menu.sh)scriptqueadmitecomoargumentosparejasformadaspor'descripcin'y'comando'yqueconstruyeunmendeopcionesdondecualquieradeloscomandospuedeserejecutadaseleccionandoladescripcincorrespondiente.

    3.2.funciones

    Definicindeunafuncin:Paradefinirunafuncintenemosdosposibilidades:

    nombre_funcion(){ functionnombre_funcion{... ...instrucciones instrucciones... ...} }

    21

  • Parmetros: Para hacer referencia a los parmetros que nospuedanllegaralafuncinloharemoscomohemosexplicadoenelapartado2.4.($1,...,$n,...).Todoslosparmetrossepasanporvalor,esdecir,cuandovolvemosdelafuncinelvalordelosparmetrosnohabrcambiado.

    Retorno:Podemoshacerquelasfuncionesretornenunvalor.

    RETORNO

    returnvalor interrumpelafuncinasignandounvaloralcdigoderetornodelafuncin

    ::ejemplos::1::: (menu.sh)mencondiferentesopciones

    2::: (gen_aniv.sh)Suponemosquetenemosunficherodenominadocumpleaos.txt,ycuyaslaslneastienenelsiguienteformato:

    nombre:fechaaniversarioRealizamos un script denominado generacumple que tegenereelficheroquetenemosquepasaralcomandocrontabparaqueeldaantesdecadafechadeaniversariorecibasunmailquetengalasiguienteinformacin:

    ...Subject:RecordatorioCumpleaos...Maanada[data]eselcumpleaosde[nombre].Noolvidesfelicitarl@.

    3.3.expresionesregulares

    Expresiones regulares: son una herramienta para buscarcoincidenciasentreuntextoyunpatrn.LaexplicacindadaaquestabasadaenlasexpresionesregularesestiloPerl.

    COMODN

    . cualquiercarcter

    CLASESDECARACTERES

    [llista] algunodeloscaracteresdelalista

    [minmax] caracterescomprendidosentreminymax

    [^llista] Cualquiercarcterquenoestenlalista

    \w palabra

    \W contrariode\w

    \s espacios,tabuladores,...(espacio,\t,\n,\r)

    \S contrariode\s

    \d dgito

    \D contrariode\d

    \A comenzaramirarporelprincipiodelacadena

    \Z comenzaramirarporelfinaldelacadena

    22

  • \b concordarconloslmitesdelapalabra

    \B contrariode\b

    [[:alnum:]] alfanumricos

    [[:alpha:]] alfabticos

    [[:cntrl:]] caracteresdecontrol

    [[:digit:]] dgitos

    CLASESDECARACTERES

    [[:graph:]] grficos

    [[:lower:]] minsculas

    [[:print:]] caracteresimprimibles

    [[:punct:]] caracteresdepuntuacin

    [[:space:]] espacios

    [[:uppor:]] maysculas

    [[:xdigit:]] dgitoshexadecimales

    ALTERNATIVAS

    alter1|alter2

    Puedeapareceralter1oalter2

    CUANTIFICADORES

    ? 0o1ocurrenciadelaexpresinprecedente

    * 0omsocurrenciasdelaexpresinprecedente

    + 1omsocurrenciasdelaexpresinprecedente

    {m} mocurrenciasdelaexpresinprecedente

    {m,} mocurrenciasomsdelaexpresinprecedente

    {m,n} demanocurrenciasdelaexpresinprecedente

    ??,*?,+?,{}?

    elmismoperonointentacogerelmximodecaracteres(no'greedy')

    ANCLAS

    ^expr cualquiercadenaquecomienceconexp

    expr$ cualquiercadenaqueacabeconexp

    GRUPOSYREFERENCIAS

    (expr) hacerungrupoparapoderreferenciarlodespus

    \n referenciaalgruponsimo

    (?:expr) gruposinreferencia

    :::ejemplos:::1::: [az] letrasminsculas

    [AZ] letrasmaysculas[09] nmeros[,'!;:\.\?] caracteresdepuntuacin[AZaz] letrasdelalfabeto[aZ] elmismoqueelanterior[AZaz09] caracteresalfanumricos[^az] todomenoslasletrasminsculas[^09] todomenosnmeros

    2::: a.b axbaababbaSba#b...

    23

  • a..b axxbaaababbba4$b...[abc] abc[aA] aA[aA][bB] abAbaBAB[09][09][09] 000001009010019100999[09]* cadena_vaca01900991234569999999[09][09]* 019009912345699999999999999999999^.*$ cualquierlneacompleta[09]+ 019009912345699999999999999999999...[09]? cadena_vaca0123...^a|b ab(ab)* cadena_vacaabababababab...^[09]?b b0b1b2b9b([09]+ab)* cadena_vaca 1234ab 9ab9ab9ab 9876543210ab99ab99ab

    3::: ([09])\1([09]) 335elcargol|gat elcargol elgatho{1,4}la holahoolahooolahoooola(slashdot|barrapunto) slashdotbarrapuntos[aeou]c sac,sec,soc,suc?[09]+ 64,2,65536,5120x[09AF]{2} 0xF0,0x3B,0xAAgo{2,5}ggle google,gooogle,goooogle,gooooogle\bkernel\b kernel,peronokernelpanicomicrokernel\d+\.\d+\.\d+\.\d+ 192.168.0.1(direccinip)(?:\d+\.){3}\d 192.168.0.1(direccinip)(?:[\w]+\.)+(?:net|com|org) ii.jocs.fractals.nets/(.*?)/\1/g itlicas => negritas (endocumentohtml)s/(\d+)\.(\d+)\.(\d+)\.(\d)+/\4.\3.\2.\1/ 192.168.0.1 =>1.0.168.192(\d+\.\d+\.\d+\.\d+)(?:\n)*\1(?:\n)*\1 3veceslamismaip(\d+\.\d+\.\d+\.\d+\n*){3} el mismo que elanterior

    3.4.comandosmuuuuytiles

    3.4.1.sed

    sed:esuneditornointeractivo,recibelaentradaporstdinopor un fichero, hace las operaciones necesarias y saca elresultadoporstdout.Detodassusfuncionalidadesdetallaremosaqutresdelasmspotentes:escribir,borrarysustituir.Lasintaxises:

    sed[opciones]{OPERADOR|scriptfichero}

    24

  • OPCIONES

    r parapoderusarexpresionesregularescomplejas.Porejemplo,parapoderhacerreferenciaagrupos:podemosutilizar\nparahacerreferenciaalnsimogrupo,dondecadagruposedelimitapor(expr).

    f siqueremosusarunscriptenvezdeunOPERADOR

    n noescribeporpantallalalneaqueesttratando

    OPERADORESBSICOS

    rangp imprimelaslneasderang

    rangd borralaslneasderang

    s/patron1/patron2/[modificador]

    sustituyelaprimeraocurrenciadepatron1porpatron2

    rang/s/patron1/patron2/[modificador]

    sustituyelaprimeraocurrenciadepatron1porpatron2delaslneasderang

    MODIFICADORES

    g sustituyeatodaslasocurrenciasdelaslneas,nosloalaprimera

    y nodistingueentreminsculasymaysculas

    :::ejemplos:::8d Borrala8alnea/^$/d Borratodaslaslneasenblanco/kernel/p Imprimelaslneasconlapalabrakernel(conn)s/Windows/Linux/ Sustituye"Linux"porlaprimerainstanciade Windows"encadalneas/Windows/Linux/g Sustituye"Linux"porcadainstanciadeWindowss/*$// Borratodoslosespaciosdelfinaldecadalneas/00*/0/g Reducetodaslassecuenciasde0'saunnico0/Windows/d BorratodaslaslneasdondeapareceWindowss/Windows//g BorratodaslaspalabrasWindows,sinborrarla lnea

    :::ejemplos:::sedr's/(La|El)(.*)es.*/\2/'

    Extraeelsujeto(sinartculo)de frasesdeltipoLapelotapequeaesdeuncolormuyextrao

    sedr's/(La|El)([^]*)(.*)(es.*)/\1\3\2\4/'Ponelaprimerapalabradelsujetoalfinaldeeste

    3.4.2.awk

    awk:esunlenguajeparaprocesartextoconmuchasutilidades.Aqu veremos una pequea introduccin con aquellas que nospuedansermstilesparahacershellscripts.

    25

  • awk[Fseparador][vvar=valor][fprog_awk|'prog_awk'][ficheros]

    Unprogramaawkpuedetenerunaodiversaslneas.Cadaunadeellastendrlasiguienteestructura:

    expresin{accin1;accin2;...}

    Acciones: Si la evaluacin de la expresin es positiva seejecuta/nla/lasaccin/esindicada/s

    ACCIONS

    print Imprimeloquelepiden,siponemosuna,imprimeunespacioenblanco

    :::ejemplo:::$echoe\nun\ndos\ntres|awk'{printYouso;printLinux}'Youso Porcadalnea,comoquelaexpresinescumple,Linux noshacelasacciones:imprimirYousoyimprimirLinuxYousoLinuxYousoLinux

    Campos: Cada lnea del fichero que le pasemos a awk estformadaporcampos(sinolepasemosundelimitador,esteserelespacioenblanco).

    CAMPOS

    $n nsimocampo

    :::ejemplo:::$echoundostres|awk'{print$1,$2}'undos Imprimimoselprimeryelsegundocampo,separadosporunespacio

    Variables: Con awk podemos definir variables como cualquierotrolenguajedeprogramacin.

    Tenemosadems,unconjuntodevariablespredefinidasporelpropioawk:

    VARIABLESPREDEFINIDAS

    FS contienecarcterdelimitadordecampos(pordefecto,espacioenblanco)

    NF contieneelnmerototaldecamposdelregistroqueseestprocesando

    RS contieneelcarcterqueindicadondeseacabacadaregistro(pordefecto,\n)

    NR contieneelnmerodeordendelregistroqueseestprocesando

    OFS contieneelseparadordecamposparalasalidagenerada

    ORS contieneelcarcterdefinalderegistroparalasalidagenerada

    26

  • :::ejemplos:::1::: $echoe"Usoelsistema\noperativodenominadoGNU/Linux"

    |awkvOFS="\t"vORS=\t{print$1,$2,$3}'UsoelsistemaoperativodenominadoGNU/Linux

    Comosalida,laseparacindecamposyladeregistrosesuntabulador

    2::: awk.txt:{print"Procesandolalnea",NR} imprimimoselnmero

    delneaqueestamosprocesando

    NF>1{print"Lalneatienemsdeunapalabra"}miramossitienemsdeuncampo

    $1=="GNU/Linux"{print"LaprimerapalabraesGNU/Linux"}miramossielprimercampoesGNU/Linux

    $echoe"GNU/LinuxesunSO\nMegustaGNU/Linux\nGNU/LinuxesmiSO"|awkfawk.txtProcesandolalnea1LalneatienemsdeunapalabraLaprimerapalabraesGNU/LinuxProcesandolalnea2Lalneatienemsdeunapalabra

    Operadores: Para poder operar tenemos los siguientesoperadores:

    OPERADORES

    + suma

    resta

    * multiplicacin

    / divisin

    % residuo

    ^ exponenciacin

    espacio

    concatenacin

    ! negacin

    var++ incrementarvaren1

    var decrementarvaren1

    > mayorque

    >= mayoroigualque

    < menorque

    >= menoroigualque

    == igual

    != diferente

    ?: estructuraifelse

    Plantillas: En vez de la expresin podemos poner unasplantillas que nos sirven para que se ejecute alguna/saccin/esantesy/oalfinalizarelprograma:

    27

  • PLANTILLASDEPRLOGOYEPLOGO

    BEGIN

    Laaccinseejecutaralprincipio

    END Laaccinseejecutaralfinal

    :::ejemplo:::sumaawk.txt:

    BEGIN{total=0} inicializamoslavariabletotala0

    {total=total+$1} aumentamostotalconelprimercampo

    END{print"Eltotales",total} imprimimoselresultadofinal

    $echoe"12\n15\n10"|sumaawkfawk.txtEltotales37

    Estructurasdecontrol:Disponemostambindelasdiferentesestructurasdecontroldecualquierlenguajedeprogramacin.EnelcasodeawksehanheredadolasintaxidellenguajedeprogramacinC.

    ESTRUCTURAif ESTRUCTURAfor ESTRUCTURAwhile

    ESTRUCTURAdo/while

    if(cond){instrucciones}[else{instrucciones}]

    for(inic;cond;instr){instrucciones}

    while(cond){instrucciones}

    do{instrucciones}while(cond)

    :::ejemplos:::1::: posnegawk.txt:

    {if($1>0){ miramossielprimercampoesprint$1,"espositivo"; positivo...}else{ ...onegativoprint$1,"esnegativo";}}

    $echoe"12\n15\n10"|awkfposnegawk.txt12espositivo15esnegativo10espositivo

    2::: tablaawk.txt:{print"\nTabladel",$1print""

    28

  • for(y=1;y
  • Funciones:Tenemosademsdiversasfuncionespredefinidas:

    FUNCIONES

    length(s) Devuelvelalongituddesenbytes

    rand() Devuelveunnmeroalazarentre0y1

    srand() Inicialasemilladegeneracinalazar

    int(var) Devuelvevarconvertidoenunentero

    substr(s,m,n) Devuelvelasubcadenadescomenzandoporlaposicinmconunalongitudden

    index(s,t) Posicindesdondeapareceto0sinoest

    match(s,r) Posicindesdondesecumplelaexpresinr

    split(s,a,fs) Devuelvesenelementosseparadosporfsalatablaa

    sub(r,t,s) Cambiaenslacadenatporr

    gsub(r,t,s) Cambiaenslacadenatporrentodaslasocurrencias

    sprintf(f,e,e,...) Imprimeconformato

    system(cmd) Ejecutacmdydevuelveelcdigoderetorno

    tolower(s) Devuelvesenminsculas

    touppor(s) Devuelvesenmaysculas

    getline Fuerzaunalecturadefichero

    :::ejemplo:::echoe"holamaria\nholajoan"|awk'{sub("hola","adeu");print}'adeumariaadeujoan

    3.5.unpocodecolorymovimiento...

    LaAmericanNationalStandardsInstitute(ANSI)proporcionaunaserie de secuencias de caracteres para poder realizardeterminadastareasbajoelS.O..Aquveremoslassecuenciasque nos permiten formatear los caracteres de la pantalla(negrita, color,...), mover el cursor, entre otros. Paraconseguirlotendremosqueponer:

    SECUENCIA_ESCAPE+SECUENCIA_CONTROL

    SECUENCIASDEESCAPE

    ^[ SihacemosuntextodirectoyqueremosverloconcatParaobtenerestecarcterconeleditorVI:ctrl+xESC

    \E Sihacemosunechoe

    30

  • SECUENCIASDECONTROL

    ATRIBUTOSDELTEXTO

    [0m Textonormal(reset)

    [1m Negrita

    [3m Cursiva

    [4m Subrayado

    [5m Intermitente

    [7m Inverso

    [22m Nonegrita

    [23m Nocursiva

    [24m Nosubrayado

    [25m Nointermitente

    [27m Noinverso

    COLORS

    [XX;YYm XX:colordeletraYY:colordefondo

    COLORESDELETRA30negro31rojo32verde33amarillo34azul35magenta36cian37blanco

    COLORESDEFONDOS40negro41rojo42verde43amarillo44azul45magenta46cian47blanco

    Sicombinamosestosvalorescon0(textonormal)y1(negrita)obtenemoscoloresfuertesosuaves.

    MOVIMIENTODELCURSOR

    [xA Subirxlneas

    [xB Bajarxlneas

    [yC Iraladerechayespacios

    [yD Iralaizquierdayespacios

    [y;xH[y;xf

    Posicionarelcursoray,x

    [?6h Posicionarenlapartesuperiorizquierda

    [s Grabarcursoryatributos

    [u Restauraratributosgrabados

    CONTROLDEPANTALLA

    [2J Limpiarpantalla

    #8 LlenarconE's

    [K Borrarhastafinaldelnea

    [?5h Enciendeinverso

    [?5l Apagainverso

    ::ejemplos::1::: Textorojoclarosobreverdesubrayadoyvolveradejarlos

    coloresnormalesechoe\E[1;4;31;42mHOLA\E[0m

    31

  • 2::: Posicionarelcursorenlafila15columna40confondoamarillo, texto azul (colores suaves) e intermitente.Ponernuevamenteelcursor5lneasmsabajoechoe"\E[2J\E[15;40H\E[1;5;34;43mHOLA\E[0m\E[5B"

    3::: (testsuma.sh)Scriptqueproponediezsumasytedalanotaquesacas.Seusandiferentescoloresyposicionamientosdelcursor.

    32

  • 4.anexos

    4.1.ejercicios

    :::VARIABLES:::1.Usandovariables:a)AsignarelvalorLunesalavariableDIA1,elvalorMartesalavariableDIA2yasconsecutivamentehastalavariableDIA7.b)Mostrarelvalordetodaslasvariablesporverificar.c)Usandoestasvariablesobtenerlasalida:

    Semana:LunesMartesMircolesJuevesViernesSbadoDomingo

    d)Usandoslolasvariablesdefinidas,cargarenlavariableSEMANAlalistadedasseparadosporespacios.

    2.Usandovariablesdeentorno,mostrar:a)caminodeldirectoriodetrabajodelusuari@b)nombredellogindelusuari@c)nombredelaterminalenusodelusuari@d)nombredelintrpretedecomandosactuale)caminoocaminosdebsquedadeejecutablesf)todaslasvariablesdeentorno

    3.Usandovariables:a)DeclaralavariableVIAScomoelvalor/usr/doc:/var/lib/dpkg.Muestrasucontenido.b)AgregaralavariableVIASeldirectorio/usr/doc/HOWTOalfinaly/usr/DOC/FAQalprincipio(separadostodoslosdirectorioscon:)

    4.Culeslasalidadelossiguientescomandos?echo$LOGNAMEecho$LOGNAMEecho'$LOGNAME'echo\$LOGNAME\echoMilogines$LOGNAMEecho'Milogines$LOGNAME'

    5.Usandovariables:a)Visualizaelcontenidodelavariabledondeseguardaelprompt.GuardasuvalorenunavariablelocalquesedenomineSAVE.b)Cambiarelpromptparaquesemuestreas:

    UNIXllest$c)HazqueelpromptvuelvaatenersuvalorinicialusandolavariableSAVE.

    6.Usandovariables:a)InicializarlavariableVAR1conlacadenashellbash1.Mostrarsucontenido.Invocarlashellcsh.QuvalortieneahoralavariableVAR1?Porqu?b)Saldecsh.QuvalortieneahoraVAR1?Porqu?c)HazquelavariableVAR1seaunavariabledeentornoyrepitelospasosa)yb)Quhapasado?d)Sienlugardeinvocarcshinvocamosbash.Pasalomismo?

    7.Aadeeldirectorio/usr/prog/binalavariablePATH.Cmo

    33

  • harasparacomprobarquefuncionabienelnuevoPATH?8.CrealavariableMIDquecontengalosvaloresdelasvariablesHOMEyLOGNAMEseparadospordospuntos.

    :::REDIRECCIONAMIENTO:::9.Creaelarchivolneasconeltextoarchivolneascomocontenido.Agregaralarchivocreadounalneadetexto,porejemploEstaeslalnea1sinusarningneditordetexto.a)Conelcomandocat,muestraporpantallaelcontenidodelarchivo/etc/servicesb)Escribeelcomandocatredireccionandolaentradaestndardesdeelarchivo/etc/servicesylasalidaestndarhaciaelarchivoservicios.txt.Visualizaservicios.txtc)Usandoecho,creaelarchivoerrores.txtconelcontenidoarchivodErroresd)Conelcomandocatintentamostrarelarchivonoexiste.xxxsinredireccionarentradaestndar,peroredireccionandolasalidaestndarhacianoexiste.txtyelerrorestndarhaciaagregaralarchivoerrores.txt.Visualizanoexiste.txtyerrores.txt.

    10.Utilizalasiguientesentencia"$catf1f2".Elficherof1hadeexistiryelf2nohadeexistir.Observalasalidaporelmonitor.a)Consiguequelasalidadeerroresvayaaunficherodenominadoerrores.b)Consiguequeelcontenidodelficheroqueexistesecopieaunficherodenominadof3(ademsdelquehasconseguidoenelapartadoa)).

    11.Usandoredireccionamento,creaunficheroquecontengalasiguienteinformacin:

    UnalneaconelcontenidoInformedelsistema Doslneasenblanco Elcalendariodelmesactual Lafechaactual Eltipodeordenadoresqueestamosusando Los/lasusuari@squeestnconectad@s

    :::FILTROSIPIPELINES:::12.Dadoelsiguienteficherodenominadotext:

    aaaababaaaaabababbaLacadenaaescapicuaTambinescapicualacadenaaaLacadenaabnoescapicuaEnunacadenacapicuasufinalreflejasuprincipioSiconcatenasunacadenaysureflejoelresultadoescapicuaAAA

    34

  • ABAa)Listarlaslneasquecontenganunaletraab)Listarlaslneasquecontengandosletrasaconsecutivasc)Listarlaslneasquenocontenganlaletraad)Listarlaslneasquenocontenganletrasmaysculase)Listarlaslneasquecomiencenporlaletraaf)Listarlaslneasquecomiencenporunaletraminsculag)Listarlaslneasqueacabenconlacadenacapicua

    13.Listartodoslosarchivosdeldirectorioactualsinqueaparezcanlosdirectorios.14.MostrartodoslosprocesosdelsistemaconUIDroot.15.MostrartodoslosprocesosdelsistemaconUIDdiferentederoot.16.Extraerlosnombresdel@susuari@sdelresultadodelaordenwho.17.Extraerloscampos1y3delresultadodelaordenwho.18.Extraerlospermisosdetodoslosficherosdeldirectorio$HOME.19.Listarel/lapropietari@ymedidadetodoslosficherosdeldirectorio$HOME.20.Elfichero/etc/passwddelservidorLinuxcontieneinformacindetod@slas/[email protected]/unausuari@diferenteyenellaaparecenlossiguientescamposdelimitadospor:

    nombredeusuari@PasswordcdigointroducidoenformadexIdentificadordel/lausuari@Identificadordelgrupoalcualperteneceel/lausuari@Informacinrespecteal/lausuari@(nombre,apellidos,etc.)DirectoriodetrabajoIntrpretedecomandosutilizado

    Unejemplodelalneacorrespondienteaun/ausuari@enesteficherosera:

    maria:x:210:204:MariaSanchez:/home/maria:/bin/basha)[email protected])Listatod@sl@[email protected])[email protected])Listalosshellsusadosporl@[email protected])Listaelcampo1yloscampos3a5.

    21.Mostrarelcontenidodelfichero/etc/passwdordenadoalfabticamente.22.Ordenaralfabticamenteelresultadodelaordenwho23.Extraerlosnombresdel@susuari@sdelresultadodelaordenwhoyordenarlosalfabticamente.24.Extraerlosnombresdel@susuari@sdelresultadodelaordenwho,ordenarlosalfabticamenteyeliminarlosnombresrepetidos.25.Listareltamaoylosnombresdelosficheros(excluyendolosdirectorios)deldirectorioactualordenadosportamao.

    35

  • 26.Enelfichero/etc/groupseespecificanlosgruposexistentesenelsistemaconsuidentificadorysuscomponentes.Elformatodecadalneaeselsiguiente:

    nombre_grupo:id_grupo:comp1,comp2,...compna)[email protected])Muestraporpantallaencuntosgruposests.c)Muestraporpantallalaslneasdelosgruposdondeeststyalgn/[email protected])Ahora,[email protected])AlmacenaestosnombresdegruposenunavariablequesellameMISGRUPOSf)Muestraporpantallaelprimerytercercampo(nombreyidentificador)delalneacorrespondienteatuusuari@enelarchivo/etc/passwd.Elnombreeidentificadorestarnseparadospor:.g)Muestraelmismoresultadoqueenelapartadof)peroahoraelnombreyelidentificadorestarnseparadosporunespacioenblanco.h)AsignalasalidaanterioraunavariabledenominadaIDENTIDAD.i)CreaunavariablequesellameYOconelcontenidodelavariableIDENTIDADydelavariableMISGRUPOS,separadosconun$.Muestraelresultadoporpantalla.

    27.QueremosimprimirporpantallaHoladondenum_idestuidentificador.Hazlodetresmanerasdiferentes:a)Usandoelcomandoidconopcionesb)Usandoelcomandoidsinopcionesc)Usandoelarchivo/etc/passwd

    28.Usandoelcomandodatesinningunaopcinhazque:a)Salgaelda(nm)porpantalla.AlmacenarelmesenlavariableDIA.b)Salgaelmesporpantalla.AlmacenarelmesenlavariableMES.c)Salgaelaoporpantalla.AlmacenarelmesenlavariableAO.d)SalgaporpantallaHoyesdadelmesdelao,usandolasvariablescreadas.e)Guardarlalneaanteriorenelficherohoy.datsinquelasalidaseveaporpantalla.f)Guardarlalneaanteriorenelficherohoy.datyquesevealasalidaporpantalla.

    :::SHELLSCRIPTS:::29.Disearunscriptquepasndoledosargumentoslossumesielprimeroesmenorqueelsegundoylosresteencasocontrario.30.Disearunscriptquepidauncarcterynosdigasiesunnmero,unaletrauotracosa.31.Disearunscriptalcualselepasaunargumentoysisteesundirectoriolistasucontenido.32.Disearunscriptquesumetodoslosnmerosqueselepasanporparmetro.

    36

  • 33.Disearunscriptquecuenteelnmerodecaracteresquetienenlosnombresdelosficherosdeldirectorioactual.34.Disearunscriptquedeterminesilosnmerosqueselepasancomoparmetrossonparesoimpares.35.Disearunscriptquepidaunnombred'usuari@ynosdigasisteexistey,siexiste,nosdigasiestconectado.36.Disearunscriptdenominadolsequemuestreporpantallalosficherosydirectoriosquehayeneldirectorioactualdelasiguientemanera:Siconelcomandolsobtenemoslasiguientesalida

    fit1prog1prog2jocConnuestroscriptlsenoslomostraras:

    |_fit1.|_prog1..|_prog2...|_joc

    37.Disearunscriptdenominadosumatamquesumeeltamaodetodoslosficherosqueselepasencomoargumentosdandounerrorparatodosaquellosargumentosquenoexistenoqueseandirectorios.38.Disearunscriptdenominadosumadirquesumeeltamaodetodoslosficherosdeldirectoriopasadocomargumento,dandounmensajedeerrorsielargumentopasadonoesundirectorioonoexiste.39.Disearunscriptdenominadoopfquepermitacopiar(c),mover(m)yborrar(d)ficheros.Elscripthadecomprobarquelasintaxisutilizadaeslacorrecta.40.Disearunscriptdenominadousuaquenosvayapidiendonombresdeusuari@ysistosexistenyestnconectad@snosdirlafechayhoradesuconexin.Elscriptseacabarcuandoel/lausuari@tecleeFI.41.Disearunscriptdenominadolroquemuestretodoslosficherosconpermisodelecturadeundirectorioqueseproporcionacomoparmetro.42.Disearunscriptdenominadolusque,dadounidentificadordegrupo,liste,paracadausuari@quepertenezcaalgrupo,suid,sunombreysudirectoriodetrabajo.Lasalidasera:USUARI@SDELGRUPO52(5)NUM.ID. NOMBRE DIR.TREBALL235 maria /home/maria246 jordi /home/jordi...

    43.Editaunficherodenominadocumpleaos.txtlaslneasdelcualtenganelsiguienteformato

    nombre:fechacumpleaosRealizaunscriptdenominadogeneracumplequetegenereelficheroquedeberamosdepasarenelcomandocrontabparaqueeldaantesdecadafechadecumpleaosrecibasunmailquetengalasiguienteinformacin:

    ...Subject:RecordatorioCumpleaos

    37

  • ...Maanada[data]eselcumpleaosde[nombre].Noolvidesfelicitrl@.

    44.Diseacrontabsparaqueserealicenlassiguientestareas: Cadadaalas7delamaanamiraquetamaotieneeldirectorio/tmpysiesmsgrandeque10Mbloborreyenveunmailaladministradorinformndolo. Cadadosdasalas12delanoche,comprimayempaqueteeldirectorio/homeyguardeestearchivoeneldirectorio/usr/src/backups.Sieldirectorionoexiste,secrear. Cadada,delunesaviernes,creeuninformealas19:00,alas20:00yalas21:00conl@susuari@squeestnconectad@syleenvealadministrador.Esteinformetendrelsiguienteaspecto:

    FECHA:[fecha]HORA:[hora]

    USUARI@SCONECTAD@S([numusuari@s])NUM.ID. NOMBRE GRUPO[id1] [nomusu1] [grupousu1][id2] [nomusu2] [grupousu2][id3] [nomusu3] [grupousu3]...

    :::EXPRESIONESREGULARES:::45.Crearlasexpresionesregularesparaobtenercadenasque:a)contenganlacadena"aba"b)contengantres"b"seguidasc)comiencenpordos"a"d)acabenpor"ba"e)comiencenpor"a"yacabenpor"b"(enelmediopuedehabercualquiercosa)f)slocontenga"a"(lacantidadnoimporta)g)primerouna"b"ydespusvarias"a"h)tengatanto"a"como"b"(elordenolacantidadnoimporta)i)notengamsdetres"a"otres"b"seguidasj)vayaalternandolas"a"ylas"b"sinrepetirsek)slotengaparejasde"a"yde"b"l)tenganunanica"a"ounanica"b"m)hayaunascuantas"a"ydespusunascuantas"b"oalrevsn)contengalacadena"aba"olacadena"bab"o)contengalacadena"ba"dosveces

    46.Crearlasexpresionesregularesparaobtenercadenasquecontengan:a)nmerosdecimales(conunacomacomoseparadordecimal)b)nmerosdecimales(conunacomaounpuntocomoseparadordecimal)c)nmerosdetelfonos(denuevecifras,quecomiencenpor9o6)d)cdigospostales(decincocifras,quecomiencencomo

    38

  • muchopor5)e)DNI(sieteuochocifrasquepuedenirseguidasdeunaletra)f)palabrasenminsculassinnmerosg)palabrasenlascualesslolaprimeraletraseamaysculah)tresocuatropalabras(sinnmeros)

    47.Usandoelfichero/etc/passwddarlasexpresionesregularesparaobtener:a)usuari@sconlapalabra"Unix"alprincipiodelcampodecomentario.b)[email protected])usuari@sdelosgrupos100,101o105.d)[email protected])[email protected])[email protected])usuari@connombrede4caracterescomenzandoporr.

    48.Hacerexpresionesregularespora:a)Fecha(DD/MM/AAAA)b)Horac)Correoelectrnicod)Nmerosdetelfono:(93)841.61.00e)urlsdetipo.org

    4.2.linksrecomendados

    :::shellscripts:::

    http://www.tldp.org/LDP/BashBeginnersGuide/BashBeginnersGuide.pdf

    Cursointroductoriodeshellscripts,muycompleto.Completaraopcionesyalgunosaspectosnoexplicadosenesteminicurso.

    http://www.ciberdroide.com/misc/novato/curso/

    Curso de GNU/Linux por consola. Tiene una parte de shellscripting.

    :::expresionesregulares:::

    http://bulma.net/body.phtml?nIdNoticia=770

    Tutorialdeexpresionesregulares.

    http://iie.fing.edu.uy/~vagonbar/unixbas/expreg.htm

    Tutorialdeexpresionesregulares.

    http://gmckinney.info/resources/regex.pdf

    Referenciarpidadeexpresionesregulares

    :::awk:::

    http://www.wikilearning.com/awk_paso_a_pasowkc31.htm

    39

  • Pequeotutorialdeawk

    http://www.inicia.es/de/chube/Manual_Awk/Manual_Awk_castellano.pdf

    Tutorialcompletodeawkencastellano

    4.3.offtopic

    Encapmomentnoespotdirpersempre.Encanvi,semprehihaunmomentenqucaldirmaims.Per:noselmaimsunpersempre?Tanmateix,elpersempresesituaeneltemps,mentreelmaimssintemporal.

    (ManueldePedrolo)

    40