Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion Avanzada en Shell
Programacion Avanzada en Shell
PROGRAMACIN AVANZADA EN
SHELL (lnea de comandos)
NDICE
1. Introduccin.................................................................................4
1.1. Caractersticas principales de BASH................................................4
1.2. Cundo utilizar el intrprete de mandatos.......................................5
2. Redirecciones...............................................................................6
2.1. Redireccin de entrada.....................................................................6
2.2. Redirecciones de salida.....................................................................7
2.3. Combinacin de redirecciones..........................................................7
2.4. Redireccin de entrada/salida...........................................................8
2.5. Documento interno............................................................................9
2.6. Tuberas...........................................................................................10
3. Variables....................................................................................12
3.1. Tipos de variables...........................................................................12
3.1.1. Variables locales.......................................................................12
3.1.2. Variables de entorno.................................................................13
3.1.3. Parmetros de posicin.............................................................15
3.1.4. Variables especiales..................................................................15
3.2. Matrices..........................................................................................17
3.3. Configuracin del entorno...............................................................17
4. Expresiones................................................................................19
4.1. Expresiones aritmticas..................................................................20
4.2. Expresiones condicionales..............................................................22
4.2.1. Expresiones de ficheros............................................................22
4.3.2. Expresiones comparativas numricas.......................................24
4.3.3. Expresiones comparativas de cadenas.....................................24
5. Entrecomillado...........................................................................26
6. Referencias................................................................................27
1. Introduccin.
El intrprete de mandatos o "shell" es la interfaz principal entre el
usuario y el sistema, permitindole a aqul interactuar con los recursos
de ste. El usuario introduce sus rdenes, el intrprete las procesa y
genera la salida correspondiente.
Por lo tanto, un intrprete de mandatos de Unix es tanto una interfaz de
ejecucin de rdenes y utilidades, como un lenguaje de programacin,
que admite crear nuevas rdenes denominadas guiones o
shellscripts, utilizando combinaciones de mandatos y estructuras
lgicas de control, que cuentan con caractersticas similares a las del
sistema y que permiten que los usuarios y grupos de la mquina cuenten
con un entorno personalizado [2].
En Unix existen 2 familias principales de intrpretes de mandatos: los
basados en el intrprete de Bourne (BSH, KSH o BASH) y los basados en
el intrprete C (CSH o TCSH).
Los 2 seminarios de formacin sobre programacin en shell pretenden
formar una gua para el usuario de Linux, que le permitir comprender,
ejecutar y empezar a programar en la Shell, haciendo referencia
especialmente a BASH (Bourne Again Shell) evolucin de BSH, con
caractersticas de KSH y CSH, ya que es el intrprete de mandatos ms
utilizado en Linux e incluye un completo lenguaje para programacin
estructurada y gran variedad de funciones internas.
Proyectos
bloqueos.
Proceso de grficos.
formados
por
componentes
con
dependencias
de
2. Redirecciones.
Unix hereda 3 ficheros especiales del lenguaje de programacin C, que
representan las funciones de entrada y salida de cada programa. stos
son:
Descripcin
[N]> Fichero
[N]>| Fichero
[N]>> Fichero
&> Fichero
Redireccin
Descripcin
[N]<&M
[N]<&-
[N]<&M-
[N]>&M
[N]>&-
[N]>&M-
Conviene hacer notar, que siguiendo las normas anteriores las 2 lneas
siguientes son equivalentes y ambas sirven para almacenar las salidas
normal y de error en el fichero indicado:
ls al /var/* &>ls.txt
ls al /var/* >ls.txt 2>&1
#
#
#
#
#
#
#
#
#
#
Descripcin
Se usa el propio shellscript como entrada estndar,
hasta la lnea donde se encuentra el delimitador.
Los tabuladores se eliminan de la entrada en el caso de
usar la redireccin <<- y se mantienen con <<.
Formato:
config OPCION ...
OPCIONES:
--cflags
--ldflags
--libs
--version
--help
OPCIONES:
--cflags
--ldflags
--libs
--version
--help
FIN
2.6. Tuberas.
La tubera es una herramienta que permite utilizar la salida normal de
un programa como entrada de otro, por lo que suele usarse en el filtrado
y depuracin de la informacin, siendo una de las herramientas ms
potentes de la programacin con intrpretes Unix.
Pueden combinarse ms de una tubera en la misma lnea de rdenes,
usando el siguiente formato:
Mandato1 | Mandato2 ...
Descripcin
head
tail
grep
cut
uniq
sort
Lista el contenido
numricamente.
wc
find
sed
diff
comm
Compara 2 ficheros.
tr
awk
del
fichero
ordenado
alfabtica
El siguiente ejemplo muestra una orden compuesta que ordena todos los
ficheros con extensin ".txt", elimina las lneas duplicadas y guarda los
datos en el fichero "resultado.sal".
10
11
3. Variables.
Al contrario que en otros lenguajes de programacin, BASH no hace
distincin en los tipos de datos de las variables; son esencialmente
cadenas de caracteres, aunque segn el contexto tambin pueden
usarse con operadores de nmeros enteros y condicionales. Esta filosofa
de trabajo permite una mayor flexibilidad en la programacin de guiones,
pero tambin puede provocar errores difciles de depurar [4].
Una variable BASH se define o actualiza mediante operaciones de
asignacin, mientras que se hace referencia a su valor utilizando el
smbolo del dlar delante de su nombre.
Suele usarse la convencin de definir las variables en maysculas para
distinguirlas fcilmente de los mandatos y funciones, ya que en Unix las
maysculas y minsculas se consideran caracteres distintos.
VAR1="Esto es una prueba
VAR2=35
echo $VAR1
echo "VAR2=$VAR2"
#
#
#
#
#!/bin/bash
# prog2 variables prueba 2
VAR1="otra prueba"
echo $VAR1
#
#
#
#
#
Asigna 2
ERR
2
2
Error
a la variable ERR.
(cadena "ERR").
(valor de ERR).
(es equivalente).
2: salir
13
Variable de
entorno
Descripcin
programa
Valor por
omisin
SHELL
Camino
del
mandatos.
intrprete
de La propia shell.
PWD
Lo modifica la
sheil.
OLDPWD
Lo modifica la
sheil.
PPID
Lo modifica la
shell
IFS
HOME
Lo define root.
LOGNAME
Activado
por
login
PATH
Segn
sistema
el
LANG
EDITOR
TERM
Tipo de terminal.
FUNCNAME
LINENO
secundario,
14
Recomendaciones de seguridad:
Siempre deben indicarse caminos absolutos en la definicin de la variable
PATH y, sobre todo, nunca incluir el directorio actual (.), ni el directorio padre
(..).
Declarar la variable IFS de slo lectura, para evitar intrusiones del tipo
caballos de Troya.
15
Variable
especial
Descripcin
$$
$*
$@
$#
Nmero de parmetros.
$?
$!
$_
argumento
del
comando
ejecutado
16
3.2. Matrices.
Una matriz (o array) es un conjunto de valores identificados por el
mismo nombre de variable, donde cada una de sus celdas cuenta con un
ndice que la identifica. Las matrices deben declararse mediante la
clusula interna declare, antes de ser utilizadas.
BASH soporta matrices de una nica dimensin conocidas tambin como
vectores, con un nico ndice numrico, pero sin restricciones de
tamao ni de orden numrico o continuidad.
Los valores de las celdas pueden asignarse de manera individual o
compuesta. Esta segunda frmula permite asignar un conjunto de valores
a varias de las celdas del vector. Si no se indica el ndice en asignaciones
compuestas, el valor para ste por defecto es 0 o sumando 1 al valor
previamente usado.
El uso de los caracteres especiales [@] o [*] como ndice de la matriz,
supone referirse a todos los valores en su conjunto, con un significado
similar al expresado en el apartado anterior.
El siguiente ejemplo describe la utilizacin de matrices.
declare a NUMEROS
NUMEROS=( cero uno dos tres )
echo ${NUMEROS[2]}
NUMEROS[4]="cuatro"
echo ${NUMEROS[4]}
NUMEROS=( [6]=seis siete [9]=nueve ) #
echo ${NUMEROS[7]}
# Declarar la matriz.
# Asignacin compuesta.
# dos
# Asignacin simple.
# cuatro
celdas 6, 7 y 9.
# siete
Ejercicio 3.3: segn los datos de la matriz del ejemplo anterior, cul es la
salida de la siguiente orden:
echo ${NUMEROS[*]}
17
18
4. Expresiones.
El intrprete BASH permite utilizar una gran variedad de expresiones en
el desarrollo de programas y en la lnea de mandatos. Las distintas
expresiones soportadas por el intrprete pueden englobarse en las
siguientes categoras:
cadenas
de
+ - * / % ++ --
de
Operadores lgicos:
! && ||
Operadores binarios:
Operadores
asignacin:
de
Operadores de tipos de
ficheros:
-e b c d f -h -L -p -S t
Operadores
permisos:
-r -w -x -g -u -k -O -G N
de
Operadores de fechas:
-nt ot et
Operadores
cadenas:
-z -n
de
19
Descripcin
Comentarios
La variable se incrementa o
decrementa en 1 despus de
evaluarse su expresin.
Var++
Post-incremento de variable.
Var--
Post-decremento de variable.
++Var
Pre-incremento de variable.
--Var
Pre-decremento de variable.
+Expr
Ms unario.
-Expr
Menos unario.
! Expr
Negacin lgica.
~ Expr
Negacin binaria.
Negacin de la expresin
lgica o negacin bit a bit.
E1 ** E2
Exponenciacin.
E1 * E2
Multiplicacin.
E1 / E2
Divisin.
E1 % E2
Resto.
Operaciones de multiplicacin
y divisin entre nmeros
enteros.
E1 + E2
Suma..
E1 - E2
Resta.
Expr << N
Expr> > N
La variable se incrementa o
decrementa en 1 antes de
evaluarse su expresin.
Signo positivo o negativo de la
expresin (por defecto se
considera positivo).
Desplazamiento binario a la
izquierda.
Desplazamiento binario a la
derecha.
20
Comparaciones
(menor,
menor o igual, mayor, mayor o
igual).
E1 < E2
E1 <= E2
E1 > E2
E1 >= E2
E1 = E2
Igualdad.
E1 != E2
Desigualdad.
E1 & E2
Operacin binaria Y.
E1 ^ E2
E1 | E2
Operacin binaria O.
E1 && E2
Operacin lgica Y.
E1 || E2
Operacin lgica O.
E1 ? E2 : E3
Evaluacin lgica.
E1 = E2
Operaciones independientes.
Se ejecutan en orden.
E1 Op= E2
E1, E2
N=59
N=034
N=0x34AF
N=[20#]G4H2
#
#
#
#
Base
Base
Base
Base
decimal (0-9).
octal (0-7), empieza por 0.
hexadecimal (0-9A-F), empieza por 0x.
20 (especificada entre 2 y 64).
21
establecen la
-e Fich
-s Fich
-f Fich
Es un fichero normal.
-d Fich
Es un directorio.
-b Fich
Es un dispositivo de bloques.
-c Fich
Es un dispositivo de caracteres.
-p Fich
Es una tubera.
22
-h Fich
Es un enlace simblico.
-L Fich
-S Fich
-t Desc
F1 -ef F2
-r Fich
-w Fich
-x Fich
-u Fich
-g Fich
-t Fich
-O Fich
-G Fich
-N Fich
F1 -nt F2
F1 -ot F2
Vanse
ejemplos
/etc/rc.d/rc.sysinit.
extrados
del
23
fichero
de
configuracin
# Si
if [
...
# Si
#
if [
...
N1 -lt N2
N1 -gt N2
Continuando
con
el
ejemplo,
se
comentan
unas
lneas
de
/etc/rc.d/rc.sysinit.
# Si la variable RESULT es > 0 y
#
/sbin/raidstart es ejecutable; entonces ...
if [ $RESULT -gt 0 -a -x /sbin/raidstart ]; then
...
# Si el cdigo de la ejecucin del 1er mandato es 0 y
#
el del 2 es distinto de 0; entonces ...
if grep -q /initrd /proc/mounts && \
! grep -q /initrd/loopfs /proc/mounts ; then
...
# Si la expresin de que existe el fichero /fastboot es cierta o
#
el cdigo de salida del mandato es correcto; entonces ...
if [ -f /fastboot ] || \
grep -iq "fastboot" /proc/cmdline 2>/dev/null ; then
...
24
Formato
Cad1 = Cad2
Cad1 != Cad2
[-n] Cad
-z Cad
La longitud de la cadena es 0.
Como en los prrafos previos, se revisa parte del cdigo del fichero
/etc/rc.d/rc.sysinit.
# Si
#
if [
...
# Si
#
if [
...
25
5. Entrecomillado.
[2]
26
6. Referencias.
1. B. Fox, C. Ramey: BASH(1) (pginas de manuales de BASH v2.5b).
2.002.
2. C. Ramey, B. Fox: Bash Reference Manual, v2.5b. Free Software
Foundation, 2.002.
3. Mike G, trad. G. Rodrguez Alborich: Programacin en BASH COMO
de Introduccin. 2.000.
4. M. Cooper: Advanced Bash-Scripting Guide, v2.1. Linux
Documentation Project, 2.003.
5. R. M. Gmez Labrador: Administracin Avanzada de Sistemas Linux
(3 edicin). Secretariado de Formacin del PAS (Universidad de
Sevilla), 2.004.
i. Proyecto GNU.: http://www.gnu.org/
ii. The Linux Documentation Project (TLDP): http://www.tldp.org/
iii. Proyecto HispaLinux (LDP-ES): http://www.hispalinux.es/
27