Está en la página 1de 40

.::shellscripts::.

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

mail

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)

Variables predefinidas: Disponemos tambin de una serie de


variables ya definidas que nos pueden ser de gran ayuda para
obtenerodejarinformacingenrica.

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

damos como valores estos formatos a a

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::

1::: Mostrar los nombres de l@s usuari@s dados de alta en el


sistemaysushelldeinicio,ordenadosalfabticamentey
separandolosdoscamposporuntabulador.
$cat/etc/passwd|cutf1,7d:|sort|tr:\t
2::: Visualizarunnmeroquesealasumadelaslneasdelos
ficheros/etc/profiley/etc/hosts
$wcl/etc/profile/etc/hosts|tail1|cutf2d
3::: Contar elnmero deficheros (excluyendo directorios) del
directorio actual modificados en enero, a la vez que se
almacena el nombre de los ficheros obtenidos en otro
ficherodenominadoenero.
$lsl|trs|cutf6,8d|grep^....01|
cutf2d|teeenero|wcl
4::: A partir del fichero /etc/passwd crear un fichero
denominado migrupo que est formado por el nombre de
usuari@,shellinicialydirectorioinicialdel@susuari@s
detumismogrupo.
$cat/etc/passwd|grep^.*:.*:.*:`idg`:|cutf1,7,6
d:>migrupo
5::: Obtener un fichero denominado procsroot que contenga el
identificador(PID)yelnombre(CMD)detodoslosprocesos
quepertenecenael/lausuari@root.
$psef|grep^root|trs|cutf2,8d>
procsroot

11

6::: Obtener un fichero denominado propsetc que contenga una


lista (sin repeticiones) con los nombres de l@s
propietari@s y grupo a los que pertenecen los ficheros y
directoriosdeldirectorio/etc.
$lsl/etc|trs""|cutf3,4d""|sort|uniq>
propsetc

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

hemos escrito... En resumen, que hemos de comentar nuestros


scriptsparahacernoslavidamsfcil:)
COMENTARIOS
#comentario

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

Nmero de ficheros que disponemos con permiso de


lectura
Nmero de ficheros que disponemos con permiso de
escritura
Nmero de ficheros que disponemos con permiso de
ejecucin
Nmero de ficheros que no disponemos con permiso de
lectura
Nmero de ficheros que no disponemos con permiso de
escritura
Nmero de ficheros que no disponemos con permiso de
ejecucin
4::: (grafica.sh) script que recibe como argumentos nmeros
comprendidos entre 1 y 75. Dar error en caso que algn
argumento no est dentro del rango y acabar sin hacer
nada. En caso contrario generar una lnea para cada
argumentocontantosasteriscoscomoindiquesuargumento.
5::: (onesta.sh) script que busca la presencia del comando
pasado como argumento en alguno de los directorios
referenciadosalavariablePATH,sealandosulocalizacin
yunabrevedescripcindelcomando.
6::: (fitpar.sh) script que pone cada una de las palabras
pasadas por parmetro en un fichero. Estos ficheros se
denominarnpalabra0,palabra1,...respectivamente.
7::: (sequencia.sh)scriptquecuentaporti:)
8::: (binbash.sh) script que aade la lnea #!/bin/bash al
principiodelosficherosquelepasescomoparmetro,si
esqueyanolotiene(paragenteconpocamemoria...)

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

Podemos hacer referencia a elementos y caractersticas de la


tablaconlassiguientesexpansiones:
EXPANSIONES
${nombre_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

Parmetros: Para hacer referencia a los parmetros que nos


puedanllegaralafuncinloharemoscomohemosexplicadoen
el apartado 2.4. ($1, ..., $n,...). Todos los parmetros se
pasan por valor, es decir, cuando volvemos de la funcin el
valordelosparmetrosnohabrcambiado.
Retorno:Podemoshacerquelasfuncionesretornenunvalor.
RETORNO
returnvalor

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

3::: ([09])\1([09]) 335


elcargol|gat
elcargol elgat
ho{1,4}la
holahoolahooolahoooola
(slashdot|barrapunto)
slashdotbarrapunto
s[aeou]c
sac,sec,soc,suc
?[09]+
64,2,65536,512
0x[09AF]{2}
0xF0,0x3B,0xAA
go{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.net
s/<y>(.*?)<\/y>/<b>\1<\/b>/g
itlicas => negritas (en
documentohtml)

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

Variables: Con awk podemos definir variables como cualquier


otrolenguajedeprogramacin.
Tenemos adems, un conjunto de variables predefinidas por el
propioawk:
VARIABLESPREDEFINIDAS
FS

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:

Para poder operar tenemos los siguientes


OPERADORES
+

suma

resta

multiplicacin

divisin

residuo

exponenciacin

espac concatenacin
io
!

negacin

var++ incrementarvaren1
var decrementarvaren1
>

mayorque

>=

mayoroigualque

<

menorque

>=

menoroigualque

==

igual

!=

diferente

?:

estructuraifelse

Plantillas: En vez de la expresin podemos poner unas


plantillas que nos sirven para que se ejecute alguna/s
accin/esantesy/oalfinalizarelprograma:

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

2::: Posicionar el cursor en la fila 15 columna 40 con fondo


amarillo, texto azul (colores suaves) e intermitente.
Ponernuevamenteelcursor5lneasmsabajo
echoe"\E[2J\E[15;40H\E[1;5;34;43mHOLA\E[0m\E[5B"
3::: (testsuma.sh)Scriptqueproponediezsumasytedalanota
que sacas. Se usan diferentes colores y posicionamientos
delcursor.

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

También podría gustarte