Escolar Documentos
Profissional Documentos
Cultura Documentos
IntroduccinalShellScript
Qu es Shell Script?
Shell Script es una serie de comandos de bash, u otro intrprete de comandos
de linux, escritas en un fichero de texto plano. Siendo similar a un proceso batch
de MS-DOS, pero con bastantes ms prestaciones.
DEFINICIONES
Las siguientes definiciones se usan a travs del resto de este documento.
blanco Un espacio en blanco o una tabulacin (tab).
palabra Una secuencia de caracteres considerados por el shell como
una sola unidad. Tambin se conoce como un lexema
(token).
1
MODELO DE SECCIN EXPOSICIN
EXPANSIONES
La expansinserealizaenla lneade rdenesuna vezque la
ordenhasidodivididaenpalabras.
Haysieteclasesdeexpansin:
1. expansindellaves,
2. expansindetilde,
3. expansindeparmetroyvariable,
4. sustitucindeorden,
5. expansinaritmtica,
6. divisindepalabrasy,
7. expansindenombredecamino.
El ordendeaplicacindedichasexpansioneseselmismoque
figuraenlalistaanterior,esdecir:expansindellaves,detilde,de
parmetro,variableyaritmtica,ysustitucindeorden(hechasde
izquierdaaderecha),divisindepalabras,yexpansindenombre
decamino.
Ensistemasquepuedanadmitirla,hayunaexpansinadicional
disponible:sustitucindeproceso.
NOTA: Slolaexpansindellaves,divisindepalabras,y
expansindenombredecamino,puedencambiarelnmero
depalabrasdelaexpansin;lasotrasexpandenunapalabra
simpleaotrapalabrasimple.Lasnicasexcepcionesaesto
son las expansiones de $@ y ${nombre[@]} que
expanden arrays y por tanto dependen del nmero de
elementosdelmismo.
Expansindenombredecamino
Trasladivisindepalabras,amenosquelaopcinfestpuesta,
bashexaminacadapalabrabuscandoloscaracteres*,?y[.Si
uno de estos caracteres aparece, entonces la palabra se
consideracomounpatrn,ysereemplazaporunalistaordenada
alfabticamente de nombresdeficheros que concuerden con el
patrn.
2
MODELO DE SECCIN EXPOSICIN
Silaopcindelshellnocaseglobestpuesta,labsquedadela
concordanciaserealizasinimportarsiloscaracteresalfabticos
sonletrasmaysculasominsculas.
Cuandounpatrnseusaparaexpansindenombredecamino,el
carcter.alprincipiodeunnombreoinmediatamentedespus
deunabarrainclinadadebeconcordarexplcitamente,amenos
queestpuestalaopcindelshelldotglob./Enlaconcordanciade
unnombredecamino,elcarcterdebarrainclinadadebesiempre
coincidirexplcitamente.Enotroscasos,elcarcter.nosetrata
deformaespecial.Vealadescripcindeshoptenelmanual(man
shopt)paraunadescripcindelasopcionesdelshellnocaseglob,
nullglob,ydotglob.
LavariabledelshellGLOBIGNOREpuedeutilizarsepararestringir
elconjuntodenombresdeficherosqueconcuerdenconunpatrn.
Si GLOBIGNORE est definido, cada nombre de fichero
concordante que tambin coincida con uno de los patrones en
GLOBIGNOREsequitadelalistadeconcordancias.Losnombres
defichero.y..nuncasontenidosencuenta,inclusocuando
GLOBIGNOREestpuesto.Sinembargo,definirGLOBIGNORE
tieneelefectodeactivarlaopcindelshelldotglob,demodoque
todos los otros nombres de fichero que comiencen con un .
concordarn.Paraobtenerelcomportamientoantiguodenohacer
casodenombresdeficherosquecomienzanconun.,hagaque
.*seaunodelospatronesdeGLOBIGNORE.Laopcindotglob
estdeshabilitadacuandoGLOBIGNOREnoestdefinido.
Expansindellaves
3
MODELO DE SECCIN EXPOSICIN
echoes{un,una,unos}prueba
Laexpansindellavesserealizaantesquecualquierotra,y
cualquiercarcterespecialparaotrasexpansionessepreservaen
el resultado. Es estrictamente textual. Bash no aplica ninguna
interpretacin sintctica al contexto de la expansin ni al texto
entrelasllaves.
Estaconstruccinseempleanormalmentecomounaabreviatura
cuandoelprefijocomndelascadenasageneraresmayorque
enelejemplodeantes:
mkdir/usr/local/src/bash/{old,new,dist,bugs}o
ls/usr/{doc/{l*,at},lib/{tc*,libnss*}}
Expansindetilde
echo~rootoecho~usuario1
ls~/midirols~root/sudir
Sielprefijotildeesun~+,elvalordelavariabledelshellPWD
reemplazaalprefijotilde.Sielprefijotildeesun~,elvalordela
variabledelshellOLDPWD,siestdefinido,sesustituye.Silos
caracteresquesiguenalatildeenelprefijotildeconsistenenun
nmeroN,prefijadoopcionalmenteporun+oun,elprefijotilde
se reemplaza con el elemento correspondiente de la pila de
directorios,comolomostraralaordeninternadirsllamadaconel
prefijotildecomoargumento.Siloscaracterestraslatildeenel
prefijotildeconsistenenunnmerosinun+niiniciales,se
supone+.
Sielnombredeentradaesinvlido,osilaexpansindetildefalla,
lapalabrasedejatalcual.
Acadaasignacindevariablesecompruebasihayprefijostilde
sinentrecomillarinmediatamentetrasun:oun=.Enestoscasos,
laexpansindetildetambintienelugar.Consecuentemente,uno
puede usar nombres de ficheros con tildes en asignaciones a
PATH, MAILPATH, y CDPATH, y el shell asigna el valor
expandido.
Expansindeparmetro
Elcarcter$introducelaexpansindeparmetro,sustitucinde
orden,oexpansinaritmtica.Elnombredeparmetroosmbolo
a ser expandido puede estar encerrado entre llaves, que son
opcionalesperosirvenparaprotegeralavariableenlaexpansin
decaracteresquelasiganypuedaninterpretarsecomopartede
sunombre.
Cuando se empleen llaves, la de cierre es la primera } no
protegidaconunabarrainvertidaoenunacadenaentrecomillada,
ynodentrodeunaexpansinaritmticaempotrada,sustitucinde
orden,oexpansindeparmetro.
${parmetro}
X=HOME;echo${!X}
>/home/usuario
${parmetro:palabra}
Emplearvalorespredeterminados.Siparmetronoestdefinidoo
estvaco,sesustituyelaexpansindepalabra.Deotromodo,se
sustituyeelvalordeparmetro.
${parmetro:=palabra}
Asignarvalorespredeterminados.Siparmetronoestdefinidoo
esnulo,laexpansindepalabraseasignaaparmetro.Luego,el
valor de parmetro se sustituye. No se puede asignar nada de
estamaneraalosparmetrosposicionalesnialosespeciales.
${parmetro:?palabra}
Muestraunerrorsinoestdefinidooestvaco.Siparmetroes
nuloonoestdefinido,laexpansindepalabra(ounmensajea
tal efecto si palabra no est presente) se escribe en la salida
estndardeerroresyelshell,sinoesinteractivo,acaba.Deotra
manera,sesustituyeelvalordeparmetro.
X=;echo${X:?malmalmal...adios}
6
MODELO DE SECCIN EXPOSICIN
${parmetro:+palabra}
Emplearunvaloralternativo.Siparmetroestvacoonoest
definido, no se sustituye nada; de otro modo, se sustituye la
expansindepalabra.
${parmetro:desplazamiento}
${parmetro:desplazamiento:longitud}
X="Cucurbitacea";echo${X:2:5}
./ejemplo_expansion1.shabcdef
./ejemplo_expansion2.sh
${#parmetro}
Sesustituyelalongitudencaracteresdelvalordeparmetro.Si
parmetroes*o@,elvalorsustituidoeselnmerodeparmetros
posicionales.Siparmetroesunnombredevectorindexadopor*
o@,elvalorsustituidoeselnmerodeelementosenelvector.
${parmetro#palabra}
${parmetro##palabra}
7
MODELO DE SECCIN EXPOSICIN
Lapalabraseexpandeparaproducirunpatrnlomismoqueen
unaexpansindenombredecamino.Sielpatrnconcuerdacon
el principio del valor de parmetro, entonces el resultado de la
expansineselvalorexpandidodeparmetroconelpatrnms
cortoqueconcuerde(elcaso#)oconelpatrnmslargoque
concuerde (el caso ##) eliminado. Si parmetro es @ o *, la
operacin de borrado del patrn se aplica a cada parmetro
posicional por turnos, y la expansin es la lista resultante. Si
parmetroesunavariablevectorindexadacon@o*,laoperacin
de borrado del patrn seaplica acada miembro del vectorpor
orden,ylaexpansineslalistaresultante.
X=$(pwd);echo${X##*/}
${parmetro%palabra}
${parmetro%%palabra}
Lapalabraseexpandeparaproducirunpatrnjustocomoenla
expansindenombredecamino.Sielpatrnconcuerdaconuna
porcin del final del valor expandido de parmetro, entonces el
resultadodelaexpansineselvalorexpandidodeparmetrocon
elpatrnmscortoqueconcuerde(elcaso%)oelmslargo(el
caso %%) borrado. Si parmetro es @ o *, la operacin de
borrado del patrn se aplica a cada parmetro posicional por
orden,ylaexpansineslalistaresultante.Siparmetroesuna
variablevectorindexadapor@o*,laoperacindeborradodel
patrn se aplica a cada miembro del vector por orden, y la
expansineslalistaresultante.
${parmetro/patrn/cadena}
${parmetro//patrn/cadena}
Elpatrnseexpandeparaproducirunpatrnjustocomoenla
expansin de nombre de camino. parmetro se expande y la
concordanciamslargadepatrncontraestevalorsereemplaza
por cadena. En la primera forma, slo se reemplaza la primera
concordancia. La segunda forma hace que todas las
concordancias de patrn se reemplacen con cadena. Si patrn
empiezapor#,debeconcordarconelprincipiodelacadena.Si
patrnempiezapor%,debeconcordarconelfinaldelacadena.
Sicadenaestvaca,lasconcordanciasdepatrnseborranyel/
que sigue al patrn puede omitirse. Si parmetro es @ o *, la
operacindesustitucinseaplicaacadaparmetroposicionalpor
orden,ylaexpansineslalistaresultante.Siparmetroesuna
variablevectorindexadapor@o*,laoperacindesustitucinse
8
MODELO DE SECCIN EXPOSICIN
aplicaacadamiembrodelvectorpororden,ylaexpansinesla
listaresultante.
Sustitucindeorden
$(orden)
u
orden
Cuandoseemplealaformadesustitucinalviejoestiloconlas
comillasinversas,labarrainvertidamantienesusignificadoliteral
exceptocuandoesseguidapor$,,o\.Laprimeracomillainversa
no precedida por una barra invertida termina la sustitucin de
orden.Cuandoseemplealaforma$(orden),todosloscaracteres
entre los parntesis forman parte de la orden; ninguno se trata
especialmente.
Lassustitucionesdeordenpuedenanidarse.Paraanidarcuando
se emplee la forma de comillas inversas, proteja las comillas
inversasinternasconbarrasinversas.
Silasustitucinaparecedentrodelasdoblescomillas,ladivisin
de palabras y la expansin de nombres no se realiza en los
resultados.
Expansinaritmtica
Laexpansinaritmticapermitelaevaluacindeunaexpresin
aritmtica y la sustitucin del resultado. El formato para la
expansinaritmticaes:
9
MODELO DE SECCIN EXPOSICIN
$((expresin))
Laexpresinsetratacomosiestuvieraentrecomillasdobles,pero
un signo de doble comilla dentro de los parntesis no se trata
especialmente.Todosloslexemasenlaexpresinestnsujetosa
expansin de parmetro, expansin de cadena, sustitucin de
orden, y eliminacin de comillas. Las sustituciones aritmticas
puedenanidarse.
Divisindepalabras
ElshelltratacadacarcterdeIFScomoundelimitador,ydivide
losresultadosdelasotrasexpansionesenpalabrasseparadaspor
estos caracteres. Si IFS no est definido, o su valor es
exactamente <espacio><tab><nuevalnea>, el valor
predeterminado, entonces cualquier secuencia de caracteres de
IFS sirve para delimitar palabras. Si IFS tiene algn otro valor,
entonces las secuencias de los caracteres blancos espacio y
tabulador no se tienen en cuenta al principio y al final de la
palabra,siemprequeelcarcterdeespacioenblancoestenel
valordeIFS(uncarcterdeespacioenblancodeIFS).Cualquier
carcterenIFSquenoseaespacioenblancodeIFS,juntocon
cualquier carcter de espacio en blanco adyacente de IFS,
delimitauncampo.Unasecuenciadecaracteresdeespacioen
blancodeIFStambinsetratacomoundelimitador.Sielvalorde
IFSesnulo,noserealizaladivisindepalabras.
Los argumentos nulos explcitos (" o ) se mantienen. Los
argumentos nulos no protegidos implcitos, resultantes de la
expansindeparmetrosquenotienenvalores,seeliminan.Siun
parmetrosinningnvalorseexpandedentrodecomillasdobles,
elresultadoesunargumentonulo,yesmantenido.
Observequesinohayexpansin,tampocoserealizaladivisin
depalabras.
Eliminacindecomillas
1
0
MODELO DE SECCIN EXPOSICIN
entrecomilladasdeloscaracteres\,,yquenoresultendeuna
delasexpansionesanteriores,seeliminan.
Patrones
[...]
Concuerdaconunodeloscaracteresentrecorchetes.Un
pardecaracteresseparadosporunsignomenosdenotaun
rango; cualquier carcter lxicamente entre esos dos,
incluidos,concuerda.Sielprimercarctertrasel[esun!o
un^,entonceslaconcordanciaesconcualquiercarcterde
los que no estn entre los corchetes. Un puede
representarse para la concordancia incluyndolo como el
primeroltimocarcterdelconjunto.Un]puedehacerse
concordar incluyndolo como el primer carcter del
conjunto.
Enlasiguientedescripcin,unalistapatrnesunalistadeunoo
ms patrones separados por un |. Se pueden formar patrones
compuestosusandounoomsdelossiguientessubpatrones:
?(listapatrn)
Concuerdaconningunaounaocurrenciadelospatrones
dados
*(listapatrn)
Concuerdaconningunaomsocurrenciasdelospatrones
dados
+(listapatrn)
Concuerda con una o ms ocurrencias de los patrones
dados
@(listapatrn)
Concuerdaexactamenteconunodelospatronesdados
!(listapatrn)
Concuerda con cualquier cosa excepto con uno de los
patronesdados
FUNCIONES
[function]nombre(){lista;}
Estodefineunafuncinllamadanombre.Elcuerpodelafuncin
eslalistaderdenesentre{y}.Estalistaseejecutacadavez
queseespecificanombrecomoelnombredeunaordensimple.El
estadodesalidadeunafuncineseldelaltimaordenejecutada
enelcuerpo.
Lasfuncionesseejecutanenelcontextodelshellencurso;nose
creaningnnuevoprocesoparainterpretarlas(encontrasteconla
ejecucindeunguindelshell).Cuandounafuncinseejecuta,
los argumentos de la funcin se convierten en los parmetros
posicionales durante su ejecucin. El parmetro especial # se
actualiza para reflejar el cambio. El parmetro posicional 0
permanece intacto. Todos los dems aspectos del entorno de
ejecucindelshellsonidnticosentreunafuncinyquienlallama
conlaexcepcindequelatrampaDEBUG(vealadescripcinde
laordeninternatrapbajoRDENESINTERNASDELSHELLms
adelante)nosehereda.
Variables locales a la funcin se pueden declarar con la orden
interna local. Normalmente, las variables y sus valores se
comparten entre la funcin y quien la llama, como variables
globales.
1
2
MODELO DE SECCIN EXPOSICIN
Siseejecutalaordeninternareturnenunafuncin,steseacaba
ylaejecucinsereanudaconlasiguienteordentraslallamadaa
la funcin.Cuando una funcin se completa, losvalores de los
parmetrosposicionalesyelparmetroespecial#serestaurana
losvaloresquetenanantesdelaejecucindelafuncin.
Losnombresdefuncinysusdefinicionespuedenlistarseconla
opcinfdelasrdenesinternasdeclareotypeset.LaopcinF
de declare o typeset listar solamente los nombres de las
funciones. Las funciones pueden exportarse de modo que los
subshellslastengandefinidasautomticamenteconlaopcinfde
laordeninternaexport.
Lasfuncionespuedenserrecursivas.Noseimponeningnlmite
enelnmerodellamadasrecursivas.
VISIBILIDADDEVARIABLES
declare[afFirx][p][nombre[=valor]]
typeset[afFirx][p][nombre[=valor]]
Usar+envezdedesactivaelatributoenvezdeactivarlo,con
la excepcin de que no puede emplearse +a para destruir una
variablevector.Cuandoseusaenunafuncin,hacelocalcada
nombre,comoconlaordeninternalocal.Elvalorderetornoes0a
menosqueseencuentreunaopcininvlida,seintentedefiniruna
funcinutilizandoffuu=bar",seintenteasignarunvalorauna
variable de lectura exclusiva, se intente asignar un valor a una
variablevectorsinemplearlasintaxisdeasignacincompuesta
(vea Vectores arriba), uno de los nombres no sea un nombre
vlido de variable del shell, se intente desactivar el estado de
lectura exclusiva para una variable de slo lectura, se intente
desactivar el estado de vector para una variable vector, o se
intentemostrarunafuncinnoexistenteconf.
local[nombre[=valor]...]
Paracadaargumento,secreaunavariablelocalllamadanombre,
yseleasignaelvalorvalor.Cuandolocalseempleadentrode
una funcin, hace que la variable nombre tenga una visibilidad
restringidaaesafuncinysushijas.Sinoperandos,localescribe
enlasalidaestndarunalistadelasvariableslocales.Esunerror
emplearlocalfueradeunafuncin.Elestadoderetornoes0a
menosquelocalseusefueradeunafuncin,osedunnombre
invlido.
1
4