Documentos de Académico
Documentos de Profesional
Documentos de Cultura
dunetna.kernelpanic
Copyright20042010dunetna
Se garantiza permiso para copiar, distribuir y modificar este
documento segn los trminos de la GNU Free Documentation
License,Versin1.2 ocualquierapublicadaposteriormentepor
la Free Software Foundation, sin secciones invariantes ni
textosdecubiertadelanteraoposterior.
Tabladecontenidos
0.intro.......................................................4
1.conceptosbsicos...........................................5
1.1.variables.............................................5
1.2.sustitucindevariables..............................6
1.3.sustitucindecomandos...............................7
1.4.caracteresespeciales.................................8
1.5.redireccionamentoe/s.................................8
1.6.filtros...............................................9
1.7.tuberas(pipelines).................................11
2.programacindeshellscripts..............................13
2.1.ejecucindeshellscripts...........................13
2.2.depuracindeshellscripts..........................14
2.3.comentarios..........................................14
2.4.parmetrosyvariablesespeciales....................15
2.5.instruccionese/s....................................15
2.6.operadores...........................................16
2.7.evaluacindeexpresionesnumricas..................16
2.8.especificacindecondiciones........................17
2.9.estructurasalternativas............................18
2.10.estructurasiterativas..............................19
3.unapocoms...............................................21
3.1.tablas...............................................21
3.2.funciones............................................21
3.3.expresionesregulares................................22
3.4.comandosmuuuuytiles...............................24
3.4.1.sed............................................24
3.4.2.awk............................................25
3.5.unpocodecolorymovimiento........................30
4.anexos.....................................................33
4.1.ejercicios...........................................33
4.2.linksrecomendados...................................39
4.3.offtopic............................................40
0.intro
Estemanual,tutorialocomolequerisdecir,eselresultado
del curso realizado por kernelpanic (hacklab de Barcelona) de
programacindeshellscripts.
No pretende ser un gran manual sino una ayuda a aquellas
personasque,yasabiendoprogramarytienenunosconocimientos
genricos de UNIX, quieren usar el lenguaje que ofrece la
shellparahacerscriptsquelasfacilitenlavida;)
Dedicamos estos apuntes al CSO Les Naus, desalojado el 9 de
diciembre del 2003. Nos quitarn los espacios pero seguiremos
luchando, construyendo y compartiendo conocimientos e
ilusiones.
NOTA:Podeisencontrarlosejemplosdescriptsque tienensu
nombre
entre
parntesis
en
la
web
http://kernelpanic.hacklabs.org. Para cualquier duda o
sugerencia
podeis
enviar
un
a
info@kernelpanic.hacklabs.org.
1.conceptosbsicos
1.1.variables
La shell nos permite definir variables donde almacenar datos.
Tenemos dos zonas de memoria donde podemos definir nuestras
variables:elrealocalyelentorno.
Variableslocales:slosonvisiblesporlashelldondeestamos
trabajando,nosonvisiblesporningunasubshell,esdecir,no
sonvisiblesporningnsubprocesodelashell.
Variables de entorno: son visibles tanto por la shell donde
estamos como por cualquier subshell que abrimos (o por
cualquiersubprocesodelashell)
NOTA:unavariabledeclaradaenunprocesohijonoservisible
porsuprocesopadre(aunqueseadeentorno)
COMANDOS
set
Vertodaslasvariablesdefinidas
env
Vertodaslasvariablesdeentornodefinidas
nombre_var=valor_var
Definirvariableyasignarlevalor
export
nombre_var=valor_var
Definirvariableentornoyasignarlevalor
exportnombre_var
Convertirvariablelocalavariablede
entorno
unsetnombre_var
Liberarunavariable
::ejemplo::
$varmeva=3
$echo$varmeva
3
$bash
$echo$varmeva
$exit
$exportvarmeva
$echo$varmeva
3
$bash
$echo$varmeva
3
$exit
declarounavariablelocal
mirosuvalor
entroenunasubshell
notienevalorporqueeslocal
volvemosalashellprincipal
conviertolavar.localavar.deentorno
enlashellprincipalsigoviendosuvalor
3
entroenunasubshell
ahorasquevemossuvalor!!!
(esdeentorno)
VARIABLESPREDEFINIDAS
HOME
Directoriodetrabajoactual
PATH
Lugaresdondepodemosaccederdirectamentesinescribir
elcamino
PS1
Promptprimario
PS2
Promptsecundario
BASH
Caminodelprogramabash
BASH_VERSION
Versindelabashactual
COLUMNS
Nmerodecolumnasenlapantalla
GROUPS
Identificadordelgrupoprincipaldelusuari@
HISTCMD
ndiceenelhistricodelcomandoactual
HISTFILE
Ficherodondeseguardaelhistrico
HISTFILESIZE
Medidadelficherohistrico
HOSTNAME
Nombredelamquina
LANG
Idiomapordefecto,sinosehaespecificadoenningn
LC_
LC_ALL
Idioma
PID
Identificadordelprocesoactual
PWD
Caminodondeestamossituados
RANDOM
Nmeroaleatorio
SECONDS
Segundosquellevaencendidalamquina
UID
Identificadordelusuari@actual
::ejemplo::
$echoMidirectoriodetrabajoes$HOMEymiiddegrupoes
$GROUPS
Midirectoriodetrabajoes/home/kpymiiddegrupoes
1000
1.2.sustitucindevariables
Sustitucin de variables: Es la tcnica que utilizaremos para
hacerreferenciaalvalorcontenidoenunavariable.
SUSTITUCINDEVARIABLES
$nombre_var
Hacerreferenciaalvalordelavariablenombre_var
${nombre_var} Hacereferenciaalvalordelavariablenombre_var.Las
llavesnosdelimitanelnombredelavariable.
::ejemplos::
1::: $saluda=hola
$nombre=anna
$echosaludanombre
saludanombre
$echo$saluda$nombre
holaanna
definovariablesaludaconvalorhola
definovariablenombreconvaloranna
muestroporpantallalosvaloresdelas
variables...
estmal:hepuestolosnombredelas
vars,nosuvalor
ahoraestbien!
2::: $masc=gat
definovariablemascconvalorgat
$echomasculino:$mascfemenino:$masca
muestroel$mascy
masculino:gatfemenino:
$masculino:$mascfemenino:${masc}a
masculino:gatfemenino:gata
$mascseguidodeuna
a
meinterpretamasca
comounavar(vaca)
pongo{}para
diferenciarel
nombredela
variable
esoesloque
quera!!!
1.3.sustitucindecomandos
Sustitucin de comandos: Es la tcnica que utilizaremos para
sustituirennombredeuncomandoporlasalidadesta.
SUSTITUCINDECOMANDOS
`comando`
$(comando)
Sustituirelnombredelcomandoporsusalida
::ejemplos::
1::: #whoami
ejecutamosuncomando
root
quenosdiceaquienestsconectado
#echoSoyel/lawhoami
siqueremosmostrarporpantallay
Soyel/lawhoami
#echoSoyel/la`whoami`
Soyel/laroot
#echoSoyel/la$(whoami)
Soyel/laroot
2::: $date+%F;date+%D
20041021
10/21/04
$aaaammdd=%F
ponemoselcomando...
...nossaleliteralmenteloquele
ponemos
sustituimoswhoamiporelvalorque
devuelvey...
...obtenemoselquequeramos!!!
otramaneradehacerlo
ejecutamosdateconformatos%Fy%D
dosvariables
$mmddaa=%D
$echoData(aaaammdd):`date+$aaaammdd`
hacemos
Data(aaaammdd):20041021
sustitucinde
$echoData(mm/dd/aa):`date+$mmddaa` comandosyde
Data(mm/dd/aa):10/21/04
variables...
3::: pequeo script que nos crea una copia de seguridad de
nuestrodirectoriodetrabajo:
CS=/var/backup`date+%Y%m%d`.tgz variableconelnombredela
tarczf$CS/home/nomusu
copiade seguridad
(ej:/var/backup20040601)
comprimimosyempaquetamosel
directoriodetrabajo
1.4.caracteresespeciales
Caracteresespeciales: Haycaracteresqueparalashelltienen
un significado especial. Existen diferentes tcnicas para que
la shell ignore este significado o para que lo tenga en
cuenta.
COMANDOS
\
anulaelsignificadoespecialdelcarcterquevadetrs
''
anulaelsignificadoespecialdetodosloscaracteresque
estndentrodelascomillas
anulaelsignificadoespecialdetodosloscaracteres
excepto:$\``
::ejemplos::
1::: $echoElsilencio
Elsilencio
$echoEl\silencio\
Elsilencio
queremosmostrarsilencioentre...
nosinterpretalasdesilenciocomo
uncarcterespecial!
lashemosdeescapar
2::: #echo'Soyel/la$LOGNAMEyestoyen$PWD'con''...
Soyel/la$LOGNAMEyestoyen$PWD
...nointerpretalos
$
#echoSoyel/la$LOGNAMEyestoyen$PWDcon...
Soyel/larootyestoyen/root
...squelos
#echoSoyel/la$LOGNAMEy\$PWD:$PWD
Soyel/larooty$PWD:/root
interpreta!
mezclandoy\...
...podemos
interpretarono
segnnosconvenga
1.5.redireccionamentoe/s
stdin, stdout y stderr: Haycomandosqueaceptanlosdatosde
entrada por lo denominamos entrada estndar (stdin, con
descriptor de fichero 0), que es el teclado. Tambin hay
comandos que nos dan su salida por la que denominamos salida
estndar (stdout, con descriptor de fichero 1) que es la
pantalla. Por ltimo, todos loserrores quepueda producir un
comando se dirigen a la salida de errores (stderr, con
descriptordefichero2)
Redireccionamiento de E/S: El redireccionamiento de E/S nos
permitirquecogiendolosdatosdeentrada,salidayerrory
lasredireccionemoshaciaotroficherodiferentealdonadopor
defecto(stdin,stdout,stderr)
REDIRECCIONAMENTOE/S
<
redireccionamentodestdin
>
redireccionamentodestdout
sielficheronoexistelocrea
sielficheroexistesecargaelcontenido
>>
redireccionamentodestdout
sielficheronoexistelocrea
sielficheroexisteaadeunacontinuacin
2>
redireccionamentodestderr
sielficheronoexistelocrea
sielficheroexistesecargaelcontenido
2>>
redireccionamentd'stderr
sielficheronoexistelocrea
sielficheroexisteaadeunacontinuacin
1>&2 redireccionarstdoutastderr
2>&1 redireccionarstderrastdout
>&
redireccionarstdoutystderraunfichero
::ejemplos::
1::: $mailroots"hackyourmind!"<mailpr mailprseraun
2:::
ficheroconel
mensaje
$catfit1fit2
fit1existe,fit2no
existe
estoeselcontenidodelfichero1
stdout
cat:fit2:Noexisteelficherooeldirectorio
stderr
$catfit1fit2>>copiafit2>>error.log aadimosfit1al
ficherocopiafity
elerrorseira
error.log
3::: $catfit1fit22>fit31>&2
(fit1existe,fit2noexiste)
todaslassalidasestnen
fit3porqueloserrores
vanafit3yredirigimos
stdoutastderr
$catfit1fit2>fit32>&1
4::: $catfit1fit2>&fit3
(fit1existe,fit2noexiste)
todaslassalidasestnen
fit3porquestdoutvaa
fit3yredirigimosstderra
stdout
(fit1existe,fit2noexiste)
todaslassalidasestnenfit3porque
redirigimosstdoutystderrafit3
1.6.filtros
Filtro: Esunprogramaquerecibedatospor stdin ysacadatos
porstdout,sinmodificarlosdatosintroducidosporstdin.
FILTROS
cat[nombre_fichero]
muestrastdin/nombre_fichero
FILTROS
cutclista[nombre_fichero]
cutflistadsep
[nombre_fichero]
extraelascolumnascitadasenlista
extraeloscamposcitadosenlista
segnelseparadorsep
formatodelista:
A,Bseleccionarcolumnas/camposAy
B
ABseleccionarcolumnas/campos
desdeAhastaB
Adesdelacolumna/campoAhasta
elfinal
Bdesdeelprincipiohastala
columna/campoB
grep[cinv]patrn
[nombre_fichero]
Bsquedadelaslneasdelos
ficheros/stdindelpatrndeterminado
cslomuestraelnmerodelnea
yignoramaysculas/minsculas
naadeelnmerodelnea
vmuestralaslneasqueno
contienenelpatrn
formatodepatrn(expresiones
regularesbsicas):
.cualquiercarctersimple
[]conjuntodecaracteres
[^]cualquiercarcternoincluido
enloscorchetes
[]rangos
*0omsocurrenciasdela
expresinprecedente
+1omsocurrenciasdela
expresinprecedente
^expcualquiercadenaquecomience
conexp
exp$cualquiercadenaqueacabecon
exp
head[num][nombre_fichero]
Muestralasprimerasnumlneasdel
fichero/stdin(10pordefecto)
sed's/expr1/expr2/[g]'
sedr's/expr1/expr2/[g]'
Sustituyeexpr1porexpr2
Sustituyeexpr1porexpr2con
expresionesregularescomplejas
gsubstituyetodaslasocurrencias
sort[ndutsep][knum]
[nombre_fichero]
Ordenarlaslneasde
nombre_fichero/stdin
nordenacinnumrica
dnotieneencuentacaracteres
quenoseanletras,
nmerosoblancos
unotieneencuentalaslneas
duplicadas
tsepespecificaundelimitadorde
campo
knumespecificaqueordenaremospor
elcamponum
tail[num][nombre_fichero]
Muestralasltimasnumlneasdel
fichero/stdin(10pordefecto)
tee[a]nombre_fichero1
[nombre_fichero2]
Muestraporpantalla
nombre_fichero2/stdinyloescribe
ennombre_fichero1
aenlugardesobreescribir
nombre_fichero1aadeacontinuacin
10
FILTROS
trc1c2[nombre_fichero]
trsc1[nombre_fichero]
traducec1porc2de
nombre_fichero/stdin
conviertec1consecutivosenunosolo
uniq[nombre_fichero]
conviertediversaslneasiguales
consecutivasdenombre_fichero/stdin
enunadesola
wc[lwc][nombre_fichero]
cuentalneas,palabrasycaracteres
denombre_fichero/stdin.
lsloelnombredelneas
wsloelnombredepalabras
csloelnombredecaracteres
1.7.tuberas(pipelines)
Tubera: Nos permiten redireccionar la salida de un comando
comounaentradaaotrocomando.
COMANDOS
comando1|
comando2
Redireccionamosstdoutdecomando1astdinde
comando2
::ejemplos::
11
12
2.programacindeshellscripts
2.1.ejecucindeshellscripts
Shell script: No es ms que un programa que usa el lenguaje
propiodelashell.Haydiferentesmanerasdeejecutarlo:
1.Enunasubshelldelashellactiva
a)$bashnombre_script
b)$./nombre_script
(necesitamospermisosdeejecucin)
c)$nombre_script
(necesitamospermisosdeejecuciny
queeldirectoriodondeest
nombre_scriptestalPATH)
2.Comounprogramaejecutablequeseejecutacomounproceso
hijodelashell
Comoprimeralneadelscriptpondremosconqushell
queremosquenoslointerprete:
#!/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/bash
sleep222
$./dorm.sh
enotraconsolaveramos:
$pstreep
...
bash(905)dorm.sh(1564)sleep(1565)
...
13
Ejecucintipo3:
$.dorm.sh
enotraconsolaveramos:
$pstreep
...
bash(905)sleep(1576)
...
2.2.depuracindeshellscripts
Depuracin: Cuando hacemos un programa y los resultados que
ste produce no son los esperados, es muy til tener una
herramienta que nos permita depurarlo. Es decir, una
herramientaquenospermitahacerunseguimientopasoapasode
pordondevaelflujodelprograma.
DEPURACIN
setx
activaladepuracin
set+x
desactivaladepuracin
sete
Saleinmediatamentesiunaordensimpleacabasinxito
(conuncdigoderetornodiferentedecero)
set+e
desactivaelsalirsiunaordensimpleacabasinxito
::ejemplo::
Sitenemoselsiguientescript:
SALUDA=hola
DESPIDE=adis
setx
echo$SALUDA$LOGNAME
echoUsuari@sConectad@s
who
set+x
echo$DESPIDE$LOGNAME
cuandoloejecutamosnosdepurarlaslneasdecdigoque
estnentresetxyset+xytendremoselsiguiente
resultadoporpantalla:
++echoholahm
holahm
++echoUsuari@sConectad@s
Usuari@sConectad@s
++who
hmtty1Jun319:39
++set+x
adishm
2.3.comentarios
Comentarios: Cuandoprogramamoshemosdetenerpresentequeno
estamossolosenelmundoo,queaunqueloestemos,lamemoria
nospuedefallarynoentenderelprogramaque nosotr@s mism@s
14
comentarpartesdecdigo
2.4.parmetrosyvariablesespeciales
Parmetros: Un parmetro de un script sern todos aquellos
valores que adjuntamos cuando ejecutamos ste y que queremos
poderverdentrodelprograma.
$./nombre_scriptparmetro1parmetro2...parmetron
Podemos hacer referencia a los parmetros pasados segn la
siguientetabla:
PARMETROS
$0
nombredelshellscriptqueseestejecutando
$n
Parmetropasadoalshellscriptenlaposicinn
$*
expandelosparmetrosenunacadena:par1par2...
$@
expandelosparmetrosencadenasdiferenciadas:par1
par2...
shift
n
Desplazarlosparmetrosennposiciones.Sinparmetron
desplaza1posicin.
Variablesespeciales: Tenemosdiferentesdefinidasencualquier
scriptquepodemosusarsegnnuestrasnecesidades.
VARIABLESESPECIALES
$#
nmerodeparmetros
$$
PIDdelashellprocesoqueseest
ejecutando
$!
PIDdelltimoprocesoejecutado
$?
Cdigoderetornodelltimo
procesoejecutado
::ejemplo::
(sistema.sh)scriptquenosinformadediversosdatosdel
sistema
2.5.instruccionese/s
Instrucciones de entrada y salida: Son aquellas instrucciones
quenospermitenleerdatosde stdin (entrada)ymostrardatos
porstdout(salida)
15
COMANDOS
readnombre_var
entradaporstdin
echo[ne]cadena/
$nombre_var
salidaporstdoutconsaltodelneafinal
einterpretacaracterescon\
\n:saltodelnea
\t:tabulador
...
nsuprimeelsaltodelneafinal
::ejemplo::
$readvarmia
3
$echoeMivares:\t\t$varmia
Mivares:3
leemosunavariablede
teclado
mirosuvalorconun
formato
2.6.operadores
Operadoresnumricos: sonaquellosquenospermitenoperarcon
nmerosyvariablesquecontienennmeros.
Operadores lgicos: son aquellos que nos permiten especificar
condicionescompuestas
OPERADORES
NUMRICOS
OPERADORES
LGICOS
suma
! no
resta
& y
&
\*
producto | o
|
\/
divisin
mdulo
parntes
\
(\) is
2.7.evaluacindeexpresionesnumricas
En muchas ocasiones tendremos que hacer clculos numricos ya
sea para mostrar el resultado o bien por almacenarlo en una
variable.
EXPRESIONESNUMRICAS
exprexpr_num
evalaexpr_numsacandoelresultadoporstdout(a
expr_numhemosdesepararoperadoresdeoperandosconun
espacio)
letexpr_num
((expr_num))
evalaexpr_num(aexpr_numnohemosdesepararoperadores
deoperandosconunespacio,nossirveparaasignar)
::ejemplos::
1::: $expr3+5
8
calculamos3+5
8!
16
2::: $((a=3+5))
$echo$a
8
calculamos3+5yponemoselresultadoala
variablea
mostramoselvalordelavariable
3::: $a=1
$((a=$a+1))
$echo$a
2
incrementamoselvalordea
mostramoselvalordelavariable
2.8.especificacindecondiciones
Condicin: Para romper el flujo de un programa necesitamos
especificar condiciones que nos lo bifurquen hacia un lado o
haciaotro.Paraespecificarcondicionesseusa:
testexpr
obien
[expr]
A continuacin se exponen las condiciones que podemos
especificar:
17
CONDICIONESFICHEROS
[enombre_fichero]
truesielficheroexiste
[dnombre_fichero]
truesielficheroexisteyesundirectorio
[fnombre_fichero]
truesielficheroexisteyesregular
[Lnombre_fichero]
truesielficheroexisteyesunenlace
simblico
[rnombre_fichero]
truesielficheroexisteytienepermisode
lectura
[wnombre_fichero]
truesielficheroexisteytienepermisode
escritura
[xnombre_fichero]
truesielficheroexisteytienepermisode
ejecucin
[nombre_fichero1nt
nombre_fichero2]
truesifichero1esmsnuevoquefichero2
[nombre_fichero1ot
nombre_fichero2]
truesifichero1esmsantiguoquefichero2
CONDICIONESCADENAS
[cadena]
truesinoeslacadenavaca
[ncadena]
truesilalongituddecadenaesdiferentede
0
[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 permiten
ejecutar un trozo de cdigo segn si se cumple o no una
condicin.
18
ESTRUCTURAif
ESTRUCTURAcase
ifcondicion1
then
casenombre_varin
patron1)
instrucciones;;
patron2)
instrucciones;;
...
patronn)
instrucciones;;
*)
instrucciones;;
esac
instrucciones
elif
condicion2
then
instrucciones
else
instrucciones
fi
::ejemplos::
1::: (existrc.sh)scriptquecompruebalaexistenciadelfichero
.bashrc
2::: (propsfit.sh) script que comprueba si existe el fichero
pasadoporparmetroy,siexiste,nosdasuspropiedades
3::: (backup.sh) script que crea una copia de seguridad del
directorio que le pasamos como parmetro y la guarda en
/var/backupsconnombredeformatobackupaaaammdd.tgz
4::: (soinifi.sh)scriptpensadoparaponeren/etc/init.d,que
nosreproducirunsonidoalentraralsistemayunsonido
alsalir.
2.10.estructurasiterativas
Estructurasiterativas: sonaquellasquenospermitenejecutar
diversasvecesuntrozodecdigo.
ESTRUCTURAwhile
ESTRUCTURAuntil
ESTRUCTURAfor
whilecondicion
untilcondicion
fornombre_varin
do
do
lista_valores
instrucciones
instrucciones do
done
done
instrucciones
done
::ejemplos::
1::: (rename.sh)scriptquerenombradiversosficherosalavez
eneldirectorioactual.
2::: (llistafit.sh)scriptqueaceptacomoargumentosnombresde
ficheros y muestra el contenido de cada uno de ellos
precedidodeunacabeceraconelnombredelfichero.
3::: (estatdporm.sh) script que realiza un estudio de todo el
rbol de directorios y ficheros a partir del directorio
pasadocomoparmetrodeformaqueobtenemoslasiguiente
info:
19
20
3.unapocoms...
3.1.tablas
Tabla:esunaestructuradedatoscompuesta.
va10
va11
va12
va13
va14
va15
va16
va17
va18
va19
arr
A continuacin podemos ver como definirla y como hacerle
referencia:
TAULES
nombre_arr=(val1val2...
valn)
declaracinyasignacininiciales
declareanombre_arr
declaracindeunatabla.tilparahacer
asignacionesdinmicas.
nombre_arr[index]=val
asignacindevalalelementoindexde
nombre_arr
${nombre_arr[index]}
Hacereferenciaalelementosituadoen
indexdelatablanombre_arr
nmerodeelementosdelatabla
${nombre_arr[@]}
listaloselementosdelatablatratadoscada
unodeelloscomounacadena
${nombre_arr[*]}
listaloselementosdelatablatratadoscomo
unanicacadena
${#nombre_arr[index]} longitudde${nombre_arr[index]}
::ejemplo::
(gen_menu.sh)scriptqueadmitecomoargumentosparejas
formadaspor'descripcin'y'comando'yqueconstruyeun
mendeopcionesdondecualquieradeloscomandospuedeser
ejecutadaseleccionandoladescripcincorrespondiente.
3.2.funciones
Definicindeunafuncin:Paradefinirunafuncintenemosdos
posibilidades:
nombre_funcion(){
functionnombre_funcion{
...
...
instrucciones
instrucciones
...
...
}
}
21
interrumpelafuncinasignandounvaloralcdigode
retornodelafuncin
::ejemplos::
1::: (menu.sh)mencondiferentesopciones
2::: (gen_aniv.sh) Suponemos que tenemos un fichero denominado
cumpleaos.txt, y cuyas las lneas tienen el siguiente
formato:
nombre:fechaaniversario
Realizamos un script denominado generacumple que te
genereelficheroquetenemosquepasaralcomandocrontab
paraqueeldaantesdecadafechadeaniversariorecibas
unmailquetengalasiguienteinformacin:
...
Subject:RecordatorioCumpleaos
...
Maana da [data] es el cumpleaos de [nombre]. No
olvidesfelicitarl@.
3.3.expresionesregulares
Expresiones regulares: son una herramienta para buscar
coincidencias entre untexto yunpatrn. Laexplicacin dada
aquestabasadaenlasexpresionesregularesestiloPerl.
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 9876543210ab
99ab99ab
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
(\d+\.\d+\.\d+\.\d+\n*){3}
3veceslamismaip
el mismo que el
anterior
3.4.comandosmuuuuytiles
3.4.1.sed
sed:esuneditornointeractivo,recibelaentradaporstdino
por un fichero, hace las operaciones necesarias y saca el
resultadoporstdout.Detodassusfuncionalidadesdetallaremos
aqutresdelasmspotentes:escribir,borrarysustituir.La
sintaxises:
sed[opciones]{OPERADOR|scriptfichero}
24
OPCIONES
r parapoderusarexpresionesregularescomplejas.
Porejemplo,parapoderhacerreferenciaagrupos:podemos
utilizar\nparahacerreferenciaalnsimogrupo,dondecadagrupo
sedelimitapor(expr).
f siqueremosusarunscriptenvezdeunOPERADOR
n noescribeporpantallalalneaqueesttratando
OPERADORESBSICOS
rangp
imprimelaslneasderang
rangd
borralaslneasderang
s/patron1/patron2/
[modificador]
sustituyelaprimeraocurrenciade
patron1porpatron2
rang/s/patron1/patron2/
[modificador]
sustituyelaprimeraocurrenciade
patron1porpatron2delaslneasde
rang
MODIFICADORES
g sustituyeatodaslasocurrenciasdelaslneas,nosloalaprimera
y nodistingueentreminsculasymaysculas
:::ejemplos:::
8d
/^$/d
/kernel/p
Borrala8alnea
Borratodaslaslneasenblanco
Imprimelaslneasconlapalabrakernel
(conn)
s/Windows/Linux/
de
cadalnea
s/Windows/Linux/g
Sustituye"Linux"porlaprimerainstancia
Windows"en
Sustituye"Linux"porcadainstanciade
Windows
s/*$//
Borratodoslosespaciosdelfinaldecada
lnea
s/00*/0/g
Reducetodaslassecuenciasde0'saun
nico0
/Windows/d
Borratodaslaslneasdondeaparece
Windows
s/Windows//g
BorratodaslaspalabrasWindows,sin
borrarla
lnea
:::ejemplos:::
sedr's/(La|El)(.*)es.*/\2/'
Extraeelsujeto(sinartculo)de
frasesdeltipo
Lapelotapequeaesdeuncolormuyextrao
sedr's/(La|El)([^]*)(.*)(es.*)/\1\3\2\4/'
Ponelaprimerapalabradel sujetoalfinaldeeste
3.4.2.awk
awk: esunlenguajeparaprocesartextoconmuchasutilidades.
Aqu veremos una pequea introduccin con aquellas que nos
puedansermstilesparahacershellscripts.
25
awk[Fseparador][vvar=valor][fprog_awk|'prog_awk']
[ficheros]
Unprogramaawkpuedetenerunaodiversaslneas.Cadaunade
ellastendrlasiguienteestructura:
expresin{accin1;accin2;...}
Acciones: Si la evaluacin de la expresin es positiva se
ejecuta/nla/lasaccin/esindicada/s
ACCIONS
print Imprimeloquelepiden,siponemosuna,imprimeunespacioen
blanco
:::ejemplo:::
$echoe\nun\ndos\ntres|awk'{printYouso;print
Linux}'
Youso Porcadalnea,comoquelaexpresinescumple,
Linux
noshacelasacciones:imprimirYousoyimprimirLinux
Youso
Linux
Youso
Linux
Campos: Cada lnea del fichero que le pasemos a awk est
formadaporcampos(sinolepasemosundelimitador,esteser
elespacioenblanco).
CAMPOS
$n
nsimocampo
:::ejemplo:::
$echoundostres|awk'{print$1,$2}'
undos Imprimimoselprimeryelsegundocampo,separadosporun
espacio
contienecarcterdelimitadordecampos(pordefecto,espacioen
blanco)
NF
contieneelnmerototaldecamposdelregistroqueseest
procesando
RS
contieneelcarcterqueindicadondeseacabacadaregistro(por
defecto,\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,laseparacindecamposyladeregistrosesun
tabulador
2::: awk.txt:
{print"Procesandolalnea",NR}
imprimimoselnmero
delnea
queestamos
procesando
NF>1{print"Lalneatienemsdeunapalabra"}
miramossitienemsdeuncampo
$1=="GNU/Linux"{print"LaprimerapalabraesGNU/Linux"}
miramossielprimercampoesGNU/Linux
$echoe"GNU/LinuxesunSO\nMegusta
GNU/Linux\nGNU/LinuxesmiSO"|awkfawk.txt
Procesandolalnea1
Lalneatienemsdeunapalabra
LaprimerapalabraesGNU/Linux
Procesandolalnea2
Lalneatienemsdeunapalabra
Operadores:
operadores:
suma
resta
multiplicacin
divisin
residuo
exponenciacin
espac concatenacin
io
!
negacin
var++ incrementarvaren1
var decrementarvaren1
>
mayorque
>=
mayoroigualque
<
menorque
>=
menoroigualque
==
igual
!=
diferente
?:
estructuraifelse
27
PLANTILLASDEPRLOGOY
EPLOGO
BEG Laaccinseejecutar
alprincipio
IN
END Laaccinseejecutar
alfinal
:::ejemplo:::
sumaawk.txt:
BEGIN{total=0}
inicializamoslavariabletotala
0
{total=total+$1}
aumentamostotalconelprimer
campo
END{print"Eltotales",total} imprimimoselresultado
final
$echoe"12\n15\n10"|sumaawkfawk.txt
Eltotales37
Estructuras de control: Disponemos tambin de las diferentes
estructuras de control de cualquier lenguaje de programacin.
Enelcaso deawk sehan heredado la sintaxi del lenguaje de
programacinC.
ESTRUCTURAif
ESTRUCTURAfor
ESTRUCTURA
while
ESTRUCTURA
do/while
if(cond){
instruccion
es
}
[else{
instruccion
es
}]
for
(inic;cond;instr){
instrucciones
}
while(cond){
instruccio
nes
}
do{
instruccione
s
}while(cond)
:::ejemplos:::
1::: posnegawk.txt:
{
if($1>0){
print$1,"espositivo";
}
else{
print$1,"esnegativo";
}
}
miramossielprimercampoes
positivo...
...onegativo
$echoe"12\n15\n10"|awkfposnegawk.txt
12espositivo
15esnegativo
10espositivo
2::: tablaawk.txt:
{
print"\nTabladel",$1
print""
28
for(y=1;y<11;y++){
j=$1*y;
printy,"*",$1,"=",j;
}
}
$echoe"2\n3"|awkfawk.txt
tabladel2
1*2=2
2*2=4
3*2=6
4*2=8
5*2=10
6*2=12
7*2=14
8*2=16
9*2=18
10*2=20
tabladel3
1*3=3
2*3=6
3*3=9
4*3=12
5*3=15
6*3=18
7*3=21
8*3=24
9*3=27
10*3=30
29
Funciones:Tenemosademsdiversasfuncionespredefinidas:
FUNCIONES
length(s)
Devuelvelalongituddesenbytes
rand()
Devuelveunnmeroalazarentre0y1
srand()
Inicialasemilladegeneracinalazar
int(var)
Devuelvevarconvertidoenunentero
substr(s,m,n)
Devuelvelasubcadenadescomenzandoporlaposicinm
conunalongitudden
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}'
adeumaria
adeujoan
3.5.unpocodecolorymovimiento...
LaAmericanNationalStandardsInstitute(ANSI)proporcionauna
serie de secuencias de caracteres para poder realizar
determinadas tareas bajo el S.O.. Aqu veremos las secuencias
que nos permiten formatear los caracteres de la pantalla
(negrita, color,...), mover el cursor, entre otros. Para
conseguirlotendremosqueponer:
SECUENCIA_ESCAPE+SECUENCIA_CONTROL
SECUENCIASDEESCAPE
^[
Sihacemosuntextodirectoyqueremosverloconcat
ParaobtenerestecarcterconeleditorVI: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:colordeletra
YY:colordefondo
COLORESDELETRA
30negro
31rojo
32verde
33amarillo
34azul
35magenta
36cian
37blanco
COLORESDEFONDOS
40negro
41rojo
42verde
43amarillo
44azul
45magenta
46cian
47blanco
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
coloresnormales
echoe\E[1;4;31;42mHOLA\E[0m
31
32
4.anexos
4.1.ejercicios
:::VARIABLES:::
1.Usandovariables:
a)AsignarelvalorLunesalavariableDIA1,elvalor
MartesalavariableDIA2yasconsecutivamentehastala
variableDIA7.
b)Mostrarelvalordetodaslasvariablesporverificar.
c)Usandoestasvariablesobtenerlasalida:
Semana:LunesMartesMircolesJuevesViernesSbado
Domingo
d)Usandoslolasvariablesdefinidas,cargarenlavariable
SEMANAlalistadedasseparadosporespacios.
2.Usandovariablesdeentorno,mostrar:
a)caminodeldirectoriodetrabajodelusuari@
b)nombredellogindelusuari@
c)nombredelaterminalenusodelusuari@
d)nombredelintrpretedecomandosactual
e)caminoocaminosdebsquedadeejecutables
f)todaslasvariablesdeentorno
3.Usandovariables:
a)DeclaralavariableVIAScomoelvalor
/usr/doc:/var/lib/dpkg.Muestrasucontenido.
b)AgregaralavariableVIASeldirectorio/usr/doc/HOWTOal
finaly/usr/DOC/FAQalprincipio(separadostodoslos
directorioscon:)
4.Culeslasalidadelossiguientescomandos?
echo$LOGNAME
echo$LOGNAME
echo'$LOGNAME'
echo\$LOGNAME\
echoMilogines$LOGNAME
echo'Milogines$LOGNAME'
5.Usandovariables:
a)Visualizaelcontenidodelavariabledondeseguardael
prompt.Guardasuvalorenunavariablelocalquesedenomine
SAVE.
b)Cambiarelpromptparaquesemuestreas:
UNIXllest$
c)Hazqueelpromptvuelvaatenersuvalorinicialusando
lavariableSAVE.
6.Usandovariables:
a)InicializarlavariableVAR1conlacadenashellbash1.
Mostrarsucontenido.Invocarlashellcsh.Quvalortiene
ahoralavariableVAR1?Porqu?
b)Saldecsh.QuvalortieneahoraVAR1?Porqu?
c)HazquelavariableVAR1seaunavariabledeentornoy
repitelospasosa)yb)Quhapasado?
d)Sienlugardeinvocarcshinvocamosbash.Pasalomismo?
7.Aadeeldirectorio/usr/prog/binalavariablePATH.Cmo
33
harasparacomprobarquefuncionabienelnuevoPATH?
8.CrealavariableMIDquecontengalosvaloresdelas
variablesHOMEyLOGNAMEseparadospordospuntos.
:::REDIRECCIONAMIENTO:::
9.Creaelarchivolneasconeltextoarchivolneascomo
contenido.Agregaralarchivocreadounalneadetexto,por
ejemploEstaeslalnea1sinusarningneditordetexto.
a)Conelcomandocat,muestraporpantallaelcontenidodel
archivo/etc/services
b)Escribeelcomandocatredireccionandolaentradaestndar
desdeelarchivo/etc/servicesylasalidaestndarhaciael
archivoservicios.txt.Visualizaservicios.txt
c)Usandoecho,creaelarchivoerrores.txtconelcontenido
archivodErrores
d)Conelcomandocatintentamostrarelarchivonoexiste.xxx
sinredireccionarentradaestndar,peroredireccionandola
salidaestndarhacianoexiste.txtyelerrorestndarhacia
agregaralarchivoerrores.txt.Visualizanoexiste.txty
errores.txt.
10.Utilizalasiguientesentencia"$catf1f2".Elfichero
f1hadeexistiryelf2nohadeexistir.Observalasalida
porelmonitor.
a)Consiguequelasalidadeerroresvayaaunfichero
denominadoerrores.
b)Consiguequeelcontenidodelficheroqueexistesecopie
aunficherodenominadof3(ademsdelquehasconseguidoen
elapartadoa)).
11.Usandoredireccionamento,creaunficheroquecontengala
siguienteinformacin:
UnalneaconelcontenidoInformedelsistema
Doslneasenblanco
Elcalendariodelmesactual
Lafechaactual
Eltipodeordenadoresqueestamosusando
Los/lasusuari@squeestnconectad@s
:::FILTROSIPIPELINES:::
12.Dadoelsiguienteficherodenominadotext:
a
aa
ab
aba
aaa
abab
abba
Lacadenaaescapicua
Tambinescapicualacadenaaa
Lacadenaabnoescapicua
Enunacadenacapicuasufinalreflejasuprincipio
Siconcatenasunacadenaysureflejoelresultadoes
capicua
A
AA
34
ABA
a)Listarlaslneasquecontenganunaletraa
b)Listarlaslneasquecontengandosletrasa
consecutivas
c)Listarlaslneasquenocontenganlaletraa
d)Listarlaslneasquenocontenganletrasmaysculas
e)Listarlaslneasquecomiencenporlaletraa
f)Listarlaslneasquecomiencenporunaletraminscula
g)Listarlaslneasqueacabenconlacadenacapicua
13.Listartodoslosarchivosdeldirectorioactualsinque
aparezcanlosdirectorios.
14.MostrartodoslosprocesosdelsistemaconUIDroot.
15.MostrartodoslosprocesosdelsistemaconUIDdiferentede
root.
16.Extraerlosnombresdel@susuari@sdelresultadodela
ordenwho.
17.Extraerloscampos1y3delresultadodelaordenwho.
18.Extraerlospermisosdetodoslosficherosdeldirectorio
$HOME.
19.Listarel/lapropietari@ymedidadetodoslosficherosdel
directorio$HOME.
20.Elfichero/etc/passwddelservidorLinuxcontiene
informacindetod@slas/losusuari@squetienenunacuentaen
lamquina.Cadalneacorrespondeaun/unausuari@diferentey
enellaaparecenlossiguientescamposdelimitadospor:
nombredeusuari@
Passwordcdigointroducidoenformadex
Identificadordel/lausuari@
Identificadordelgrupoalcualperteneceel/lausuari@
Informacinrespecteal/lausuari@(nombre,apellidos,
etc.)
Directoriodetrabajo
Intrpretedecomandosutilizado
Unejemplodelalneacorrespondienteaun/ausuari@eneste
ficherosera:
maria:x:210:204:MariaSanchez:/home/maria:/bin/bash
a)Compruebasiexisteonounaentradadetuusuari@este
fichero.
b)Listatod@sl@susuari@sdelmismogrupoquetque
existenenestefichero.
c)Listalosidentificadoresdeusuari@.
d)Listalosshellsusadosporl@susuari@squetenganel
mismogrupoquet.
e)Listaelcampo1yloscampos3a5.
21.Mostrarelcontenidodelfichero/etc/passwdordenado
alfabticamente.
22.Ordenaralfabticamenteelresultadodelaordenwho
23.Extraerlosnombresdel@susuari@sdelresultadodela
ordenwhoyordenarlosalfabticamente.
24.Extraerlosnombresdel@susuari@sdelresultadodela
ordenwho,ordenarlosalfabticamenteyeliminarlosnombres
repetidos.
25.Listareltamaoylosnombresdelosficheros(excluyendo
losdirectorios)deldirectorioactualordenadosportamao.
35
26.Enelfichero/etc/groupseespecificanlosgrupos
existentesenelsistemaconsuidentificadorysus
componentes.Elformatodecadalneaeselsiguiente:
nombre_grupo:id_grupo:comp1,comp2,...compn
a)Muestraporpantallalaslneasdelosgruposdondeest
tuusuari@.
b)Muestraporpantallaencuntosgruposests.
c)Muestraporpantallalaslneasdelosgruposdondeests
tyalgn/ausuari@ms.
d)Ahora,hazqueslosalganlosnombresdelosgruposdonde
esttuusuari@.
e)Almacenaestosnombresdegruposenunavariablequese
llameMISGRUPOS
f)Muestraporpantallaelprimerytercercampo(nombrey
identificador)delalneacorrespondienteatuusuari@enel
archivo/etc/passwd.Elnombreeidentificadorestarn
separadospor:.
g)Muestraelmismoresultadoqueenelapartadof)pero
ahoraelnombreyelidentificadorestarnseparadosporun
espacioenblanco.
h)Asignalasalidaanterioraunavariabledenominada
IDENTIDAD.
i)CreaunavariablequesellameYOconelcontenidodela
variableIDENTIDADydelavariableMISGRUPOS,separadoscon
un$.Muestraelresultadoporpantalla.
27.QueremosimprimirporpantallaHola<num_id>dondenum_id
estuidentificador.Hazlodetresmanerasdiferentes:
a)Usandoelcomandoidconopciones
b)Usandoelcomandoidsinopciones
c)Usandoelarchivo/etc/passwd
28.Usandoelcomandodatesinningunaopcinhazque:
a)Salgaelda(nm)porpantalla.Almacenarelmesenla
variableDIA.
b)Salgaelmesporpantalla.Almacenarelmesenlavariable
MES.
c)Salgaelaoporpantalla.Almacenarelmesenlavariable
AO.
d)SalgaporpantallaHoyesda<num_da>delmes<mes>del
ao<ao>,usandolasvariablescreadas.
e)Guardarlalneaanteriorenelficherohoy.datsinquela
salidaseveaporpantalla.
f)Guardarlalneaanteriorenelficherohoy.datyquese
vealasalidaporpantalla.
:::SHELLSCRIPTS:::
29.Disearunscriptquepasndoledosargumentoslossumesi
elprimeroesmenorqueelsegundoylosresteencaso
contrario.
30.Disearunscriptquepidauncarcterynosdigasiesun
nmero,unaletrauotracosa.
31.Disearunscriptalcualselepasaunargumentoysiste
esundirectoriolistasucontenido.
32.Disearunscriptquesumetodoslosnmerosquesele
pasanporparmetro.
36
33.Disearunscriptquecuenteelnmerodecaracteresque
tienenlosnombresdelosficherosdeldirectorioactual.
34.Disearunscriptquedeterminesilosnmerosquesele
pasancomoparmetrossonparesoimpares.
35.Disearunscriptquepidaunnombred'usuari@ynosdiga
sisteexistey,siexiste,nosdigasiestconectado.
36.Disearunscriptdenominadolsequemuestreporpantalla
losficherosydirectoriosquehayeneldirectorioactualde
lasiguientemanera:
Siconelcomandolsobtenemoslasiguientesalida
fit1prog1prog2joc
Connuestroscriptlsenoslomostraras:
|_fit1
.|_prog1
..|_prog2
...|_joc
37.Disearunscriptdenominadosumatamquesumeeltamao
detodoslosficherosqueselepasencomoargumentosdandoun
errorparatodosaquellosargumentosquenoexistenoquesean
directorios.
38.Disearunscriptdenominadosumadirquesumeeltamao
detodoslosficherosdeldirectoriopasadocomargumento,
dandounmensajedeerrorsielargumentopasadonoesun
directorioonoexiste.
39.Disearunscriptdenominadoopfquepermitacopiar(c),
mover(m)yborrar(d)ficheros.Elscripthadecomprobar
quelasintaxisutilizadaeslacorrecta.
40.Disearunscriptdenominadousuaquenosvayapidiendo
nombresdeusuari@ysistosexistenyestnconectad@snos
dirlafechayhoradesuconexin.Elscriptseacabar
cuandoel/lausuari@tecleeFI.
41.Disearunscriptdenominadolroquemuestretodoslos
ficherosconpermisodelecturadeundirectorioquese
proporcionacomoparmetro.
42.Disearunscriptdenominadolusque,dadoun
identificadordegrupo,liste,paracadausuari@quepertenezca
algrupo,suid,sunombreysudirectoriodetrabajo.La
salidasera:
USUARI@SDELGRUPO52(5)
NUM.ID.
NOMBRE
DIR.TREBALL
235
maria
/home/maria
246
jordi
/home/jordi
...
43.Editaunficherodenominadocumpleaos.txtlaslneasdel
cualtenganelsiguienteformato
nombre:fechacumpleaos
Realizaunscriptdenominadogeneracumplequetegenereel
ficheroquedeberamosdepasarenelcomandocrontabparaque
eldaantesdecadafechadecumpleaosrecibasunmailque
tengalasiguienteinformacin:
...
Subject:RecordatorioCumpleaos
37
...
Maanada[data]eselcumpleaosde[nombre].No
olvidesfelicitrl@.
44.Diseacrontabsparaqueserealicenlassiguientestareas:
Cadadaalas7delamaanamiraquetamaotieneel
directorio/tmpysiesmsgrandeque10Mbloborrey
enveunmailaladministradorinformndolo.
Cadadosdasalas12delanoche,comprimay
empaqueteeldirectorio/homeyguardeestearchivoen
eldirectorio/usr/src/backups.Sieldirectoriono
existe,secrear.
Cadada,delunesaviernes,creeuninformealas
19:00,alas20:00yalas21:00conl@susuari@sque
estnconectad@syleenvealadministrador.Este
informetendrelsiguienteaspecto:
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"seguidas
c)comiencenpordos"a"
d)acabenpor"ba"
e)comiencenpor"a"yacabenpor"b"(enelmediopuede
habercualquiercosa)
f)slocontenga"a"(lacantidadnoimporta)
g)primerouna"b"ydespusvarias"a"
h)tengatanto"a"como"b"(elordenolacantidadno
importa)
i)notengamsdetres"a"otres"b"seguidas
j)vayaalternandolas"a"ylas"b"sinrepetirse
k)slotengaparejasde"a"yde"b"
l)tenganunanica"a"ounanica"b"
m)hayaunascuantas"a"ydespusunascuantas"b"oal
revs
n)contengalacadena"aba"olacadena"bab"
o)contengalacadena"ba"dosveces
46.Crearlasexpresionesregularesparaobtenercadenasque
contengan:
a)nmerosdecimales(conunacomacomoseparadordecimal)
b)nmerosdecimales(conunacomaounpuntocomoseparador
decimal)
c)nmerosdetelfonos(denuevecifras,quecomiencenpor9
o6)
d)cdigospostales(decincocifras,quecomiencencomo
38
muchopor5)
e)DNI(sieteuochocifrasquepuedenirseguidasdeuna
letra)
f)palabrasenminsculassinnmeros
g)palabrasenlascualesslolaprimeraletraseamayscula
h)tresocuatropalabras(sinnmeros)
47.Usandoelfichero/etc/passwddarlasexpresionesregulares
paraobtener:
a)usuari@sconlapalabra"Unix"alprincipiodelcampode
comentario.
b)usuari@sdelgrupo101.
c)usuari@sdelosgrupos100,101o105.
d)listarusuari@sconUIDdeundgito.
f)listarusuari@sconUIDde1o2dgitos.
g)usuari@sconnombredeexactamente4caracteres.
h)usuari@connombrede4caracterescomenzandoporr.
48.Hacerexpresionesregularespora:
a)Fecha(DD/MM/AAAA)
b)Hora
c)Correoelectrnico
d)Nmerosdetelfono:(93)841.61.00
e)urlsdetipo.org
4.2.linksrecomendados
:::shellscripts:::
http://www.tldp.org/LDP/BashBeginnersGuide/BashBeginners
Guide.pdf
Cursointroductoriodeshellscripts,muycompleto.Completara
opcionesyalgunosaspectosnoexplicadosenesteminicurso.
http://www.ciberdroide.com/misc/novato/curso/
Curso de GNU/Linux por consola. Tiene una parte de shell
scripting.
:::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,semprehiha
unmomentenqucaldirmaims.Per:noselmaimsunper
sempre?Tanmateix,elpersempresesituaeneltemps,mentre
elmaimssintemporal.
(ManueldePedrolo)
40