curso shellccript
DESCRIPTION
libroTRANSCRIPT
-
.::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