Programacion BASH PDF
Programacion BASH PDF
Programacion BASH PDF
PROGRAMACIN AVANZADA EN
SHELL
2
05-08 Programacin Avanzada en Shell
NDICE
1. Introduccin. ......................................................................................................................... 5
1.1. Caractersticas principales de BASH. ............................................................................. 5
1.2. Cundo utilizar el intrprete de mandatos. ...................................................................... 6
2. Modos de operacin. ............................................................................................................ 7
2.1. La lnea de mandatos. ...................................................................................................... 7
2.2. Edicin y ejecucin de un guin. .................................................................................... 7
2.3. Recomendaciones de programacin. ............................................................................... 8
3. Redirecciones...................................................................................................................... 10
3.1. Redireccin de entrada. ................................................................................................. 10
3.2. Redirecciones de salida. ................................................................................................ 10
3.3. Combinacin de redirecciones. ..................................................................................... 11
3.4. Redireccin de entrada/salida........................................................................................ 12
3.5. Documento interno. ....................................................................................................... 12
3.6. Tuberas. ........................................................................................................................ 13
4. Variables. ............................................................................................................................ 15
4.1. Tipos de variables.......................................................................................................... 15
4.1.1. Variables locales. ................................................................................................... 15
4.1.2. Variables de entorno............................................................................................... 16
4.1.3. Parmetros de posicin. .......................................................................................... 17
4.1.4. Variables especiales. .............................................................................................. 18
4.2. Matrices. ........................................................................................................................ 19
4.3. Configuracin del entorno............................................................................................. 20
5. Expresiones......................................................................................................................... 21
5.1. Expresiones aritmticas. ................................................................................................ 21
5.2. Expresiones condicionales. ........................................................................................... 23
5.2.1. Expresiones de ficheros.......................................................................................... 24
5.3.2. Expresiones comparativas numricas..................................................................... 25
5.3.3. Expresiones comparativas de cadenas.................................................................... 26
6. Entrecomillado y expansin. ............................................................................................. 27
6.1. Entrecomillado. ............................................................................................................. 27
6.2..Expansin. ..................................................................................................................... 27
6.2.1. Expansin de llaves. ............................................................................................... 28
2.6.2. Expansin de tilde. ................................................................................................. 28
6.2.3. Expansin de parmetro o de variable. .................................................................. 29
6.2.4. Sustitucin de mandato. ......................................................................................... 31
6.2.5. Expansin aritmtica. ............................................................................................. 31
6.2.6. Sustitucin de proceso............................................................................................ 32
6.2.7. Divisin en palabras. .............................................................................................. 32
6.2.8. Expansin de fichero. ............................................................................................. 32
7. Programacin estructurada. ............................................................................................. 34
7.1. Listas de mandatos. ....................................................................................................... 34
7.1.1. Listas condicionales. .............................................................................................. 34
3
7.2. Estructuras condicionales y selectivas. ......................................................................... 35
7.2.1. Estructuras condicionales. ...................................................................................... 35
7.2.2. Estructura selectiva. ............................................................................................... 37
7.3. Bucles. ........................................................................................................................... 38
7.3.1. Bucles genricos..................................................................................................... 38
7.3.2. Bucles condicionales mientras y hasta. ........................................................... 39
7.3.3. Bucle de seleccin interactiva. ............................................................................... 40
8. Funciones............................................................................................................................. 41
9. Caractersticas especiales .................................................................................................. 43
9.1. Programas interactivos. ................................................................................................. 43
9.2. Control de trabajos. ....................................................................................................... 44
9.3. Intrprete de uso restringido.......................................................................................... 45
10. Referencias........................................................................................................................ 47
APNDICE A. Cuestionario del curso................................................................................. 48
APNDICE B. Respuestas al cuestionario. ......................................................................... 51
4
1. Introduccin.
5
Posibilidad de usar una "shell" para controlar el entorno del usuario.
Como se ha indicado anteriormente, una shell de Unix puede utilizarse como interfaz para
ejecutar rdenes en la lnea de comandos o como intrprete de un lenguaje de programacin
para la administracin del sistema.
El lenguaje de BASH incluye una sintaxis algo engorrosa, pero relativamente fcil de
aprender, con una serie de rdenes internas que funcionan de forma similar a la lnea de
comandos. Un programa o guin puede dividirse en secciones cortas, cmodas de depurar,
permitiendo realizar prototipos de aplicaciones ms complejas.
Sin embargo, hay ciertas tareas que deben ser resueltas con otros intrpretes ms complejos o
con lenguajes compilados de alto nivel, tales como [4]:
Procesos a tiempo real, o donde la velocidad es un factor fundamental.
Operaciones matemticas de alta precisin, de lgica difusa o de nmeros complejos.
Portabilidad de cdigo entre distintas plataformas.
Aplicaciones complejas que necesiten programacin estructurada o proceso
multihilvanado.
Aplicaciones crticas para el funcionamiento del sistema.
Situaciones donde debe garantizarse la seguridad e integridad del sistema, para
protegerlo contra intrusin o vandalismo.
Proyectos formados por componentes con dependencias de bloqueos.
Proceso intensivo de ficheros, que requieran accesos directos o indexados.
Uso de matrices multidimensionales o estructuras de datos (listas, colas, pilas, etc.).
Proceso de grficos.
Manipulacin de dispositivos, puertos o sockets.
Uso de bibliotecas de programacin o de cdigo propietario
.
6
2. Modos de operacin.
La lnea de mandatos es el interfaz del usuario con el sistema, que permite personalizar el
entorno de operacin y ejecutar programas y guiones.
El formato tpico de una lnea consta de una orden y unos modificadores y parmetros
opcionales, aunque puede incluir algunos caracteres especiales, que modifican el
comportamiento tpico.
Mandato [Modificador ...][Parmetro ...]
Un caso especial es el de las lneas que comienzan por la almohadilla (#), que se consideran
comentarios. Tambin puede insertarse un comentario en mitad de una lnea, a la derecha de
una orden.
# Esto es un comentario
ls -al # lista el contenido del directorio actual
Pueden agruparse varias rdenes en la misma lnea separadas por el punto y coma (;), que se
ejecutan siempre en secuencia. Asimismo, si un mandato es muy largo o engorroso, puede
usarse el carcter de escape (\ ) para continuar escribindolo en la lnea siguiente.
cd /var/log; grep i error *
find /tmp /var/tmp ! user root type f \
-perm +2 print
Un guin interpretado por BASH es un fichero de texto normal que consta de una serie de
bloques de cdigo formados por lneas de mandatos que se ejecutan en secuencia. El usuario
debe tener los permisos de modificacin (escritura) en el directorio para crear un nuevo
programa o sobre el propio fichero, para modificar uno existente.
Como un programa binario, el usuario debe tener permiso de ejecucin en el fichero del
guin, y se lanza tecleando su camino completo junto con sus opciones y parmetros.
Asimismo, como veremos en el Captulo 4, si el programa se encuentra en un directorio
incluido en la variable de entorno PATH, slo se necesita teclear el nombre, sin necesidad de
especificar el camino.
El proceso completo de edicin y ejecucin de un guin es el siguiente:
vi prueba.sh # o cualquier otro editor de textos
chmod u+x prueba.sh # activa el permiso de ejecucin
./prueba.sh # ejecuta el guin
prueba.sh # si est en un directorio de $PATH
7
Existe una manera especial para ejecutar un guin, precedindolo por el signo punto, que se
utiliza para exportar todas las variables del programa al entorno de ejecucin del usuario (para
ms informacin sobre las variables de entorno revisar el Captulo 4). El siguiente ejemplo
ilustra el modo de ejecutar
apachectl start # Ejecucin normal de un guin.
. miprofile # Ejecucin exportando las variables.
source miprofile # Equivalente a la lnea anterior.
Un script puede y debe comenzar con la marca #! para especificar el camino completo
y los parmetros del intrprete de mandatos que ejecutar el programa. Esta marca puede
usarse para ejecutar cualquier intrprete instalado en la mquina (BASH, BSH, PERL, AWK,
etc.).
El siguiente cuadro muestra un pequeo ejemplo de guin BASH.
#!/bin/bash
# ejemplo1: informe de la capacidad de la cuenta
Como cualquier otro programa, un guin BASH puede requerir un cierto mantenimiento, que
incluya modificaciones, actualizaciones o mejoras del cdigo. Por lo tanto, el programador
debe ser precavido y desarrollarlo teniendo en cuenta las recomendaciones tpicas para
cualquier programa.
Una prctica ordenada permite una verificacin y comprensin ms cmoda y rpida, para
realizar las modificaciones de forma ms segura y ayudar al usuario a ejecutar el programa
correctamente. Para ello, es conveniente seguir estas medidas.
El cdigo debe ser fcilmente legible, incluyendo espacios y sangras que separen
claramente los bloques de cdigo
Deben aadirse comentarios claros sobre el funcionamiento general del programa
principal y de las funciones, que contengan: autor, descripcin, modo de uso del
programa, versin y fechas de modificaciones.
Incluir comentarios para los bloques o mandatos importantes, que requieran cierta
aclaracin.
Agregar comentarios y ayudas sobre la ejecucin del programa.
Depurar el cdigo para evitar errores, procesando correctamente los parmetros de
ejecucin.
No desarrollar un cdigo excesivamente enrevesado, ni complicado de leer, aunque
sto haga ahorrar lneas de programa.
8
Utilizar funciones y las estructuras de programacin ms adecuadas para evitar repetir
cdigo reiterativo.
Los nombres de variables, funciones y programas deben ser descriptivos, pero sin
confundirse con otros de ellos, ni con los mandatos internos o externos; no deben ser
ni muy largos ni muy cortos.
Todos los nombres de funciones y de programas suelen escribirse en letras
minsculas, mientras que las variables acostumbran a definirse en maysculas.
9
3. Redirecciones.
Unix hereda 3 ficheros especiales del lenguaje de programacin C, que representan las
funciones de entrada y salida de cada programa. stos son:
Entrada estndar: procede del teclado; abre el fichero con descriptor 0 (stdin ) para
lectura.
Salida estndar: se dirige a la pantalla; abre el fichero con descriptor 1 (stdout) para
escritura.
Salida de error: se dirige a la pantalla; abre el fichero con descriptor 2 (stderr) para
escritura y control de mensajes de error.
El proceso de redireccin permite hacer una copia de uno de estos ficheros especiales hacia o
desde otro fichero normal. Tambin pueden asignarse los descriptores de ficheros del 3 al 9
para abrir otros tantos archivos, tanto de entrada como de salida.
El fichero especial /dev/null se utiliza para descartar alguna redireccin e ignorar sus
datos.
La redireccin de entrada sirve para abrir para lectura el archivo especificado usando un
determinado nmero descriptor de fichero. Se usa la entrada estndar cuando el valor del
descriptor es 0 o ste no se especifica.
El siguiente cuadro muestra el formato genrico de la redireccin de entrada.
[N]<Fichero
La redireccin de entrada se usa para indicar un fichero que contiene los datos que sern
procesados por el programa, en vez de teclearlos directamente por teclado. Por ejemplo:
miproceso.sh < fichdatos
Sin embargo, conviene recordar que la mayora de las utilidades y filtros de Unix soportan los
ficheros de entrada como parmetro del programa y no es necesario redirigirlos.
De igual forma a los descrito en el apartado anterior, la redireccin de salida se utiliza para
abrir un fichero asociado a un determinado nmero de descriptor para operaciones de
escritura.
10
Se reservan 2 ficheros especiales para el control de salida de un programa: la salida normal
(con nmero de descriptor 1) y la salida de error (con el descriptor 2).
En la siguiente tabla se muestran los formatos genricos para las redirecciones de salida.
Redireccin Descripcin
[N]> Fichero Abre el fichero de descriptor N para escritura. Por defecto se usa la salida
estndar (N=1). Si el fichero existe, se borra; en caso contrario, se crea.
[N]>| Fichero Como en el caso anterior, pero el fichero debe existir previamente.
[N]>> Fichero Como en el primer caso, pero se abre el fichero para aadir datos al final,
sin borrar su contenido.
&> Fichero Escribe las salida normal y de error en el mismo fichero.
El siguiente ejemplo crea un fichero con las salidas generadas para configurar, compilar e
instalar una aplicacin GNU.
configure > aplic.sal
make >> aplic.sal
make install >> aplic.sal
Redireccin Descripcin
[N]<&M Duplicar descriptor de entrada M en N (N=0, por defecto).
[N]<&- Cerrar descriptor de entrada N.
[N]<&M- Mover descriptor de entrada M en N, cerrando M (N=0, por defecto).
[N]>&M Duplicar descriptor de salida M en N (N=1, por defecto).
11
[N]>&- Cerrar descriptor de salida N.
[N]>&M- Mover descriptor de salida M en N, cerrando M (N=1, por defecto).
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
Sin embargo, el siguiente ejemplo muestra 2 mandatos que no tienen por qu dar el mismo
resultado, ya que las redirecciones se procesan de izquierda a derecha, teniendo en cuenta los
posibles duplicados de descriptores hechos en lneas anteriores.
ls al * >ls.txt 2>&1 # Salida normal y de error a "ls.txt".
ls al * 2>&1 >ls.txt # Asigna la de error a la normal anterior
# (puede haberse redirigido) y luego
# manda la estndar a "ls.txt".
La redireccin de documento interno usa parte del propio programa hasta encontrar un
delimitador de final como redireccin de entrada al comando correspondiente. Suele
utilizarse para mostrar o almacenar texto fijo, como por ejemplo un mensaje de ayuda.
12
El texto del bloque que se utiliza como entrada se trata de forma literal, esto es, no se realizan
sustituciones ni expansiones.
El texto interno suele ir tabulado para obtener una lectura ms comprensible. El formato <<
mantiene el formato original, pero en el caso de usar el smbolo <<-, el intrprete elimina los
caracteres de tabulacin antes de redirigir el texto.
La siguiente tabla muestra el formato de la redireccin de documento interno.
Redireccin Descripcin
<<[-] Delimitador Se usa el propio shellscript como entrada estndar, hasta la lnea donde se
Texto encuentra el delimitador.
... Los tabuladores se eliminan de la entrada en el caso de usar la redireccin
Delimitador <<- y se mantienen con <<.
3.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 ...
Todos los dialectos Unix incluyen gran variedad de filtros de informacin. La siguiente tabla
recuerda algunos de los ms utilizados.
Mandato Descripcin
head Corta las primeras lneas de un fichero.
tail Extrae las ltimas lneas de un fichero.
13
grep Muestra las lneas que contienen una determinada cadena de caracteres o cumplen
un cierto patrn.
cut Corta columnas agrupadas por campos o caracteres.
uniq Muestra o quita las lneas repetidas.
sort Lista el contenido del fichero ordenado alfabtica o numricamente.
wc Cuenta lneas, palabras y caracteres de ficheros.
find Busca ficheros que cumplan ciertas condiciones y posibilita ejecutar operaciones con
los archivos localizados
sed Edita automticamente un fichero.
diff Muestra las diferencias entre 2 ficheros, en formato compatible con la orden sed.
comm Compara 2 ficheros ordenados.
tr Sustituye grupos de caracteres uno a uno.
awk Procesa el fichero de entrada segn las reglas de dicho lenguaje.
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 ".
cat *.txt | sort | uniq >resultado.sal
La orden tee es un filtro especial que recoge datos de la entrada estndar y lo redirige a la
salida normal y a un fichero especificado, tanto en operaciones de escritura como de
aadidura. Esta es una orden muy til que suele usarse en procesos largos para observar y
registrar la evolucin de los resultados.
El siguiente ejemplo muestra y registra el proceso de compilacin e instalacin de una
aplicacin GNU.
configure 2>&1 | tee aplic.sal
make 2>&1 | tee a aplic.sal
make instal 2>&1 | tee a aplic.sal
14
4. 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 # asignacin de una variable
VAR2=35 # asignar valor numrico
echo $VAR1 # Esto es una prueba
echo "VAR2=$VAR2" # VAR2=35
Las variables del intrprete BASH pueden considerarse desde los siguientes puntos de vista:
Las variables locales son definidas por el usuario y se utilizan nicamente dentro de
un bloque de cdigo, de una funcin determinada o de un guin.
Las variables de entorno son las que afectan al comportamiento del intrprete y al de
la interfaz del usuario.
Los parmetros de posicin son los recibidos en la ejecucin de cualquier programa
o funcin, y hacen referencia a su orden ocupado en la lnea de mandatos.
Las variables especiales son aquellas que tienen una sintaxis especial y que hacen
referencia a valores internos del proceso. Los parmetros de posicin pueden incluirse
en esta categora.
Las variables locales son definidas para operar en un mbito reducido de trabajo, ya sea en un
programa, en una funcin o en un bloque de cdigo. Fuera de dicho mbito de operacin, la
variable no tiene un valor preciso.
Una variable tiene un nombre nico en su entorno de operacin, sin embargo pueden aunque
no es nada recomendable usarse variables con el mismo nombre en distintos bloques de
cdigo.
El siguiente ejemplo muestra los problemas de comprensin y depuracin de cdigo que
pueden desatarse en caso de usar variables con el mismo nombre. En la primera fila se
15
presentan 2 programas que usan la misma variable y en la segunda, la ejecucin de los
programas (ntese que el signo > es el punto indicativo del interfaz de la shell y que lo
tecleado por el usuario se representa en letra negrita).
#!/bin/bash #!/bin/bash
# prog1 variables prueba 1 # prog2 variables prueba 2
VAR1=prueba VAR1="otra prueba"
echo $VAR1 echo $VAR1
> echo $VAR1
> prog1
prueba
> prog2
otra prueba
> prog1
prueba
Por lo tanto, para asignar valores a una variable se utiliza simplemente su nombre, pero para
hacer referencia a su valor hay que utilizar el smbolo dlar ($). El siguiente ejemplo muestra
los modos de referirse a una variable.
ERR=2 # Asigna 2 a la variable ERR.
echo ERR # ERR (cadena "ERR").
echo $ERR # 2 (valor de ERR).
echo ${ERR} # 2 (es equivalente).
echo "Error ${ERR}: salir" # Error 2: salir
Al igual que cualquier otro proceso Unix, la shell mantiene un conjunto de variables que
informan sobre su propio contexto de operacin. El usuario o un guin puede actualizar y
aadir variables exportando sus valores al entorno del intrprete (mandato export), lo que
afectar tambin a todos los procesos hijos generados por ella. El administrador puede definir
variables de entorno estticas para los usuarios del sistema (como, por ejemplo, en el caso de
la variable IFS).
La siguiente tabla presenta las principales variables de entorno.
16
IFS Separador de campos de entrada (debe ser de slo lectura). ESP, TAB, NL.
HOME Directorio personal de la cuenta. Lo define root.
LOGNAME Nombre de usuario que ejecuta la shell. Activado por login
PATH Camino de bsqueda de mandatos. Segn el sistema
LANG Idioma para los mensajes.
EDITOR Editor usado por defecto.
TERM Tipo de terminal.
PS1 ... PS4 Puntos indicativos primario, secundario, selectivo y de errores.
FUNCNAME Nombre de la funcin que se est ejecutando. Lo modifica la shell.
LINENO N de lnea actual del guin (para depuracin de cdigo) Lo modifica la shell.
Debe hacerse una mencin especial a la variable PATH, que se encarga de guardar la lista de
directorios con ficheros ejecutables. Si no se especifica el camino exacto de un programa, el
sistema busca en los directorios especificados por PATH, siguiendo el orden de izquierda a
derecha. El carcter separador de directorios es dos puntos.
El administrador del sistema debe establecer los caminos por defecto para todos los usuarios
del sistema y cada uno de stos puede personalizar su propio entorno, aadiendo sus propios
caminos de bsqueda (si no usa un intrprete restringido).
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.
Los parmetros de posicin son variables especiales de BASH que contienen los valores de
los parmetros que recibe un programa o una funcin. El nmero indica la posicin de dicho
parmetro en la llamada al cdigo.
El 1er parmetro se denota por la variable $1, el 9 por $9 y a partir del 10 hay que usar la
notacin ${Nmero}. El mandato interno shift desplaza la lista de parmetros hacia la
17
izquierda para procesar los parmetros ms cmodamente. El nombre del programa se denota
por la variable $0.
Para observar el uso de parmetros posicionales y de variables locales, el siguiente cuadro
muestra algunas lneas de un programa para gestin de usuarios.
grep "^$1:" /etc/passwd
grep ":$GID:" /etc/group | cut -f1 -d:
1. Muestra la lnea del usuario especificado en el 1er parmetro recibido por el programa.
2. Presenta el nombre del grupo cuyo identificador se encuentra en la variable GID.
Las variables especiales informan sobre el estado del proceso, son tratadas y modificadas
directamente por el intrprete, por lo tanto, son de slo lectura. La siguiente tabla describe
brevemente estas variables.
Variable Descripcin
especial
$$ Identificador del proceso (PID).
$* Cadena con el contenido completo de los parmetros recibidos por el programa.
$@ Como en el caso anterior, pero trata cada parmetro como un palabra diferente.
$# Nmero de parmetros.
$? Cdigo de retorno del ltimo mandato (0=normal, >0=error).
$! ltimo identificador de proceso ejecutado en segundo plano.
$_ Valor del ltimo argumento del comando ejecutado previamente.
La construccin cat "$@" se utiliza para procesar datos tanto de ficheros como de la entrada
estndar [4].
La 1 fila de la tabla del siguiente ejemplo muestra el cdigo de un programa para convertir
minsculas en maysculas; mientras que la 2, indica cmo puede utilizarse el programa (el
texto tecleado est representado en letra negrita).
Nota: la construccin ^D representa la combinacin de teclas Control- D (carcter fin de
texto).
#!/bin/bash
# mayusculas convierte a maysculas usando ficheros o stdin
# Uso: mayusculas [ [<]fichero ]
18
> mayusculas datos.txt >datos.sal
> mayusculas <datos.txt >datos.sal
> mayusculas
Esto es una prueba de ejecucin del programa.
^D
ESTO ES UNA PRUEBA DE EJECUCIN DEL PROGRAMA.
4.2. Matrices.
Ejercicio 4.3: segn los datos de la matriz del ejemplo anterior, cul es la salida de la
siguiente orden:
echo ${NUMEROS[*]}
19
4.3. Configuracin del entorno.
20
5. Expresiones.
Operadores aritmticos: + - * / % ++ --
Operadores de permisos: -r -w -x -g -u -k -O -G N
Operadores de cadenas: -z -n
21
La divisin por 0 genera un error que puede ser procesado.
La prioridad y asociatividad de los operadores sigue las reglas del lenguaje C.
La siguiente tabla describe las operaciones aritmticas enteras y binarias agrupadas en orden
de prioridad.
E1 * E2 Multiplicacin.
Operaciones de multiplicacin y divisin
E1 / E2 Divisin.
entre nmeros enteros.
E1 % E2 Resto.
E1 + E2 Suma..
Suma y resta de enteros.
E1 - E2 Resta.
E1 = E2 Igualdad.
E1 != E2 Desigualdad.
E1 & E2 Operacin binaria Y.
E1 ^ E2 Operacin binaria O Exclusivo.
E1 | E2 Operacin binaria O.
E1 && E2 Operacin lgica Y.
E1 || E2 Operacin lgica O.
22
E1 ? E2 : E3 Evaluacin lgica. Si E1=cierto, se devuelve E2; si no, E3.
E1 = E2 Asignacin normal y con pre-operacin Asigna el valor de E2 a E1. Si es
E1 Op= E2 (operadores vlidos: *=, /=, %=, +=, especifica un operador, primero se realiza
-=, <<=, >>=, &=, ^=, |=). la operacin entre las 2 expresiones y se
asigna el resultado (E1 = E1 Op E2).
E1, E2 Operaciones independientes. Se ejecutan en orden.
Los nmeros enteros pueden expresarse en bases numricas distintas a la decimal (base por
defecto). El siguiente ejemplo muestra los formatos de cambio de base.
let N=59 # Base decimal (0-9).
let N=034 # Base octal (0-7), empieza por 0.
let N=0x34AF # Base hexadecimal (0-9A-F), empieza por 0x.
let N=[20#]G4H2 # Base 20 (especificada entre 2 y 64).
Las expresiones condicionales son evaluadas por los mandatos internos del tipo test, dando
como resultado un valor de cierto o de falso. Suelen emplearse en operaciones condicionales
y bucles, aunque tambin pueden ser empleadas en rdenes compuestas.
Existen varios tipos de expresiones condicionales segn el tipo de parmetros utilizado o su
modo de operacin:
Expresiones con ficheros, que comparan la existencia , el tipo, los permisos o la
fecha de ficheros o directorios.
Expresiones comparativas numricas, que evalan la relacin de orden numrico
entre los parmetros.
Expresiones comparativas de cadenas, que establecen la relacin de orden
alfabtico entre los parmetros.
23
Todas las expresiones condicionales pueden usar el modificador de negacin (! Expr) para
indicar la operacin inversa. Asimismo, pueden combinarse varias de ellas en una expresin
compleja usando los operadores lgicos Y (Expr1 && Expr2) y O (Expr1 || Expr2 ).
Las condiciones sobre permisos establecen si el usuario que realiza la comprobacin puede
ejecutar o no la operacin deseada sobre un determinado fichero. La tabla describe estas
condiciones.
24
-u Fich Tiene el permiso SUID.
-g Fich Tiene el permiso SGID.
-t Fich Tiene permiso de directorio compartido o fichero en cach.
-O Fich Es el propietario del archivo.
-G Fich El usuario pertenece al grupo con el GID del fichero.
Las operaciones sobre fechas descritas en la siguiente tabla establecen comparaciones entre
las correspondientes a 2 ficheros.
25
Continuando con el ejemplo, se comentan algunas lneas del fichero de configuraci n
/etc/rc.d/rc.sysinit.
Como en los prrafos previos, se revisa parte del cdigo del fichero /etc/rc.d/rc.sysinit.
# Si LOGNAME es una variable vaca o
# tiene el valor "(none)"; entonces ...
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
...
# Si la variable $fastboot no tiene contenido y
# la variable $ROOTFSTYPE no es "nfs"; entonces ...
if [ -z "$fastboot" -a "$ROOTFSTYPE" != "nfs" ]; then
...
26
6. Entrecomillado y expansin.
6.1. Entrecomillado.
[2]
Los 3 tipos bsicos de entrecomillado definidos en BASH son :
Carcter de escape (\Carcter): mantiene el valor literal del carcter que lo
precede; la secuencia \\ equivale a presentar el carcter \. Cuando aparece omo
ltimo carcter de la lnea, sirve para continuar la ejecucin de una orden en la lnea
siguiente.
Comillas simples ('Cadena'): siempre conserva el valor literal de cada uno de los
caracteres de la cadena.
Comillas dobles ("Cadena"): conserva el valor de literal de la cadena, excepto para
los caracteres dlar ($), comilla simple (') y de escape (\$, \\, \', \", ante el fin de
lnea y secuencia de escape del tipo ANSI-C).
El entrecomillado con formato $"Cadena" se utiliza para procesos de traduccin segn el
idioma expresado por la variable LANG. Si se utiliza el valor de idioma por defecto (C o
POSIX), la cadena se trata normalmente con comillas dobles.
Veamos unos ejemplos:
echo "Slo con permiso \"root\"" # Slo con permiso "root"
echo 'Slo con permiso \"root\"' # Slo con permiso \"root\"
6.2..Expansin.
Como se lleva observando en todo el curso, la lnea de comandos se divide en una serie de
elementos que representan cierto significado en la semntica del intrprete. La expansin es
un procedimiento especial que se realiza sobre dichos elementos individuales.
27
[2]
BASH dispone de 8 topos de expansiones, que segn su orden de procesado son :
Expansin de llaves: modifica la exp resin para crear cadenas arbitrarias.
Expansin de tilde : realiza sustituciones de directorios.
Expansin de parmetro y variable : tratamiento general de variables y parmetros,
incluyendo la sustitucin de prefijos, sufijos, valores por defecto y otros operaciones
con cadenas.
Sustitucin de mandato: procesa el mandato y devuelve su salida normal.
Expansin aritmtica: sustituye la expresin por su valor numrico.
Sustitucin de proceso: comunicacin de procesos mediante tuberas con nombre de
tipo cola (FIFO).
Divisin en palabras : separa la lnea de mandatos resultante en palabras usando los
caracteres de divisin incluidos en la variable IFS.
Expansin de fichero : permite buscar patrones con comodines en los nombres de
ficheros.
Formato Descripcin
[Pre]{C1,C2[,...]}[Suf] El resultado es una lista de palabras donde se le aade a cada una de
las cadenas de las llaves y separadas por comas un prefijo y un
sufijo opcionales.
Este tipo de expansin obtiene el valor de un directorio, tanto de las cuentas de usuarios,
como de la pila de directorios accedidos. Los formatos vlidos de la expansin de tilde son:
28
Formato Descripcin
~[Usuario] Directorio personal del usuario indicado. Si no se expresa nada $HOME.
~+ Directorio actual ($PWD).
~- Directorio anterior ($OLDPWD).
Es recomendable definir un alias en el perfil de entrada del usuario para cambiar al directorio
anterior, ya que la sintaxis del comando es algo engorrosa. Para ello, aadir la siguiente lnea
al fichero de configuracin ~/.bashrc.
alias cda='cd ~-'
Permite la sustitucin del contenido de la variable siguiendo una amplia variedad de reglas.
Los distintos formatos para la expansin de parmetros son [1]:
Formato Descripcin
${!Var} Se hace referencia a otra variable y se obtiene su valor (expansin
indirecta).
${Parm:-Val} Se devuelve el parmetro; si ste es nulo, se obtiene el valor por
defecto.
${Parm:=Val} Si el parmetro es nulo se le asigna el valor por defecto y se expande.
${Parm:?Cad} Se obtiene el parmetro; si es nulo se manda un mensaje de error.
${Parm:+Val} Se devuelve el valor alternativo si el parmetro no es nulo.
${Parm:Inic} Valor de subcadena del parmetro, desde el punto inicial hasta el final o
${Parm:Inic:Long} hasta la longitud indicada.
${!Pref*} Devuelve los nombres de variables que empiezan por el prefijo.
29
${#Parm} El tamao en caracteres del parmetro o en elementos de una matriz.
${#Matriz[*]}
BASH proporciona unas potentes herramientas para el tratamiento de cadenas, sin embargo la
sintaxis puede resultar engorrosa y requiere de experiencia para depurar el cdigo. Por lo
tanto, se recomienda crear guiones que resulten fciles de comprender, documentando
claramente las rdenes ms complejas.
Unos ejemplos para estudiar:
# Si el 1er parmetro es nulo, asigna el usuario que lo ejecuta.
USUARIO=${1:-`whoami`}
30
6.2.4. Sustitucin de mandato.
Esta expansin sustituye el mandato ejecutado incluyendo sus parmetros por su salida
normal, ofreciendo una gran potencia y flexibilidad de ejecucin a un shellscrpit. Los
formatos vlido son:
Formato Descripcin
$(Mandato) Sustitucin literal del mandato y sus parmetros.
`Mandato` Sustitucin de mandatos permitiendo caracteres de escape.
Cuando la sustitucin de mandatos va en una cadena entre comillas dobles se evita que
posteriormente se ejecute una expansin de ficheros.
El siguiente programa lista informacin sobre un usuario.
#!/bin/bash
# infous lista informacin de un usuario.
# Uso: infous usuario
TEMPORAL=`grep "^$1:" /etc/passwd 2>/dev/null`
USUARIO=`echo $TEMPORAL | cut -f1 -d:`
echo "Nombre de usuario: $USUARIO"
echo -n "Identifidor (UID): "
echo $TEMPORAL | cut -f3 -d:
echo -n "Nombre del grupo primario: "
GID=`echo $TEMPORAL | cut -f4 -d:`
grep ":$GID:" /etc/group | cut -f1 -d:
echo "Directorio personal: "
ls -ld `echo $TEMPORAL | cut -f6 -d:`
Formato Descripcin
$((Expresin)) Sustituye la expresin por su resultado.
$[Expresin]
31
Ejercicio 6.4: interpretar la siguiente lnea, algo difcil de leer.
if [ ${#cad} -lt $[${#1}-1] ]; then ...
La sustitucin de proceso permite utilizar un fichero especial de tipo cola para intercambiar
informacin entre 2 procesos, uno que escribe en la cola y el otro que lee de ella en orden (el
primero en llegar es el primero en salir). Los formatos vlidos para esta expansin son:
Formato Descripcin
Fich <(Lista) La lista de rdenes escribe en el fichero para que ste pueda ser ledo por otro
Descr<(Lista) proceso.
Fich >(Lista) Cuando otro proceso escribe en el fichero, el contenido de ste se pasa como
Descr>(Lista) parmetro de entrada a la lista de rdenes.
Una vez que se hayan realizado las expansiones previas, el intrprete divide la lnea de
entrada en palabras, utilizando como separadores los caracteres especificados en la variable de
entorno IFS. Para evitar problemas de seguridad generados por un posible Caballo de
Troya, el administrador debe declarar esta variable como de slo lectura y establecer unos
valores fijos para los separadores de palabra; que por defecto stos son espacio, tabulador y
salto de lnea. Una secuencia de varios separadores se considera como un nico delimitador.
Por ejemplo, si se ejecuta el siguiente mandato:
du hs $HOME
el intrprete realiza las sustituciones y antes de ejecutar la orden divide la lnea en las
siguientes palabras.
du -hs /home/ramon
Si algunas de las palabras obtenidas tras la divisin anterior contiene algn caracteres especial
conocido como comodn (*, ? o [), sta se trata como un patrn que se sustituye por la lista
32
[2]
de nombres de ficheros que cumplen dicho patrn, ordena da alfabticamente . El resto de
caracteres del patrn se tratan normalmente.
Los patrones vlidos son:
Formato Descripcin
* Equivale a cualquier cadena de caracteres, incluida una cadena nula.
? Equivale a cualquier carcter nico.
[Lista] Equivale a cualquier carcter que aparezca en la lista. Pueden incluirse rangos de
caracteres separados por guin (-). Si el primer carcter de la lista es ^, se
comparan los caracteres que no formen parte de ella.
33
7. Programacin estructurada.
Las estructuras de programacin se utilizan para generar un cdigo ms legible y fiable. Son
vlidas para englobar bloques de cdigo que cumplen un cometido comn, para realizar
comparaciones, selecciones, bucles repetitivos y llamadas a subprogramas.
Los mandatos BASH pueden agruparse en bloques de cdigo que mantienen un mismo
mbito de ejecucin. La siguiente tabla describe brevemente los aspectos fundamentales de
cada lista de rdenes.
Lista de Descripcin
rdenes
Mandato & Ejecuta el mandato en 2 plano. El proceso tendr menor prioridad y no debe ser
interactivo..
Man1 | Man2 Tubera. Redirige la salida de la primera orden a la entrada de la segundo. Cada
mandato es un proceso separado.
Man1; Man2 Ejecuta varios mandatos en la misma lnea de cdigo.
Man1 && Man2 Ejecuta la 2 orden si la 1 lo hace con xito (su estado de salida es 0).
Man1 || Man2 Ejecuta la 2 orden si falla la ejecucin de la anterior (su cdigo de salida no es 0).
(Lista) Ejecuta la lista de rdenes en un subproceso con un entorno comn.
{ Lista; } Bloque de cdigo ejecutado en el propio intrprete.
Lnea1 \ Posibilita escribir listas de rdenes en ms de una lnea de pantalla. Se utiliza para
Lnea2 ejecutar mandatos largos.
Los mandatos condicionales son aquellos que se ejecutan si una determinada orden se
realiza correctamente lista Y (&&) o si se produce algn error lista O (||).
34
A continuacin se comentan algunos ejemplos, sacados del fichero /etc/rc.d/rc.sysinit.
# Si se ejecuta correctamente converquota, se ejecuta rm.
/sbin/convertquota -u / && rm -f /quota.user
#
# Si da error la ejecucin de grep, se ejecuta modprobe.
grep 'hid' /proc/bus/usb/drivers || modprobe hid 2> /dev/null
Ambas estructuras de programacin se utilizan para escoger un bloque de cdigo que debe ser
ejecutado tras evaluar una determinada condicin. En la estructura condicional se opta entre 2
posibilidades, mientras que en la selectiva pueden existir un nmero variable de opciones.
Estructura de Descripcin
programacin
if Expresin; Estructura condicional simple: se ejecuta la lista de rdenes si se
then Bloque; cumple la expresin. En caso contrario, este cdigo se ignora.
fi
Aunque el formato de codificacin permite incluir toda la estructura en una lnea, cuando sta
es compleja se debe escribir en varias, para mejorar la comprensin del programa. En caso de
35
teclear la orden compleja en una sola lnea debe tenerse en cuenta que el carcter separador
(;) debe colocarse antes de las palabras reservadas: then, else, elif y fi.
Hay que resaltar la versatilidad para teclear el cdigo de la estructura condicional, ya que la
palabra reservada then puede ir en la misma lnea que la palabra if, en la lnea siguiente
sola o conjuntamente con la primera orden del bloque de cdigo, lo que puede aplicarse
tambin a la palabra else ).
Puede utilizarse cualquier expresin condicional para evaluar la situacin, incluyendo el
cdigo de salida de un mandato o una condicin evaluada por la orden interna test. Este
ltimo caso se expresa colocando la condicin entre corchetes (formato: [ Condicin ]).
Vanse algunos sencillos ejemplos de la estructura condicional simple extrados del script
/etc/rc.d/rc.sysinit. Ntese la diferencia en las condiciones sobre la salida normal de
una orden expresada mediante una sustitucin de mandatos y aquellas referidas al estado de
ejecucin de un comando (si la orden se ha ejecutado correctamente o si se ha producido un
error).
# La condicin ms simple escrita en una lnea:
# si RESULT>0; entonces rc=1
if [ $RESULT -gt 0 ]; then rc=1; fi
#
# La condicin doble:
# si la variable HOSTNAME es nula o vale (none); entonces ...
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
#
# Combinacin de los 2 tipos de condiciones:
# si existe el fichero /fastboot o la cadena fastboot est
# en el fichero /proc/cmdline; entonces ...
if [ -f /fastboot ] || grep -iq "fastboot" /proc/cmdline \
2>/dev/null; then
fastboot=yes
fi
Obsrvense los ejemplos para las estructuras condicionales complejas, basados tambin en el
programa de configuracin /etc/rc.d/rc.sysinit.
# Estructura condicional compleja con 2 bloques:
# si existe el fichero especificado, se ejecuta; si no, se da
# el valor no a la variable NETWORKING
if [ -f /etc/sysconfig/network ];
then
. /etc/sysconfig/network
else
NETWORKING=no
fi
# Estructura anidada:
# si rc=0; entonces ...; si no, si rc=1; entonces ...; en caso
# contrario; no se hace nada.
if [ "$rc" = "0" ]; then
success "$STRING"
echo
elif [ "$rc" = "1" ]; then
passed "$STRING"
echo
fi
36
Ejercicio 7.2: describir el comportamiento de la siguiente estructura.
if [ -f /etc/sysconfig/console/default.kmap ]; then
KEYMAP=/etc/sysconfig/console/default.kmap
else
if [ -f /etc/sysconfig/keyboard ]; then
. /etc/sysconfig/keyboard
fi
if [ -n "$KEYTABLE" -a -d "/usr/lib/kbd/keymaps" -o -d
"/lib/kbd/keymaps" ]; then
KEYMAP=$KEYTABLE
fi
fi
Estructura de Descripcin
programacin
case Variable in Estructura selectiva mltiple: si la variable cumple un
[(]Patrn1) Bloque1 ;; determinado patrn, se ejecuta el bloque de cdigo
... correspondiente. Cada bloque de cdigo acaba con ;;.
esac La comprobacin de patrones se realiza en secuencia.
Las posibles opciones soportadas por la estructura selectiva mltiple se expresan mediante
patrones, donde puede aparecer caracteres comodines, evalundose como una expansin de
ficheros, por lo tanto el patrn para representar la opcin por defecto es el asterisco (*).
Dentro de una misma opcin pueden aparecer varios patrones separados por la barra vertical
(|), como en una expresin lgica O.
Si la expresin que se comprueba cumple varios patrones de la lista, slo se ejecuta el bloque
de cdigo correspondiente al primero de ellos, ya que la evaluacin de la estructura se realiza
en secuencia.
Obsrvense el siguientes ejemplos:
# Segn el valor de la variable UTC:
# - si es yes o true, ...
# - si es no o false, ...
case "$UTC" in
yes|true) CLOCKFLAGS="$CLOCKFLAGS --utc";
CLOCKDEF="$CLOCKDEF (utc)";
;;
no|false) CLOCKFLAGS="$CLOCKFLAGS --localtime";
CLOCKDEF="$CLOCKDEF (localtime)";
;;
esac
37
Ejercicio 7.3: describir el modo de ejecucin de la siguiente estructura selectiva.
case "$SO" in
AIX) echo n "$US: "
lsuser -ca expires $US|fgrep -v "#"|cut -f2 -d:`"
;;
SunOS) echo "$US: `logins -aol $US|cut -f7 -d:`"
;;
Linux) echo "$US: `chage -l $US|grep Account|cut -f2 -d:`"
;;
*) echo "Sistema operativo desconocido" ;;
esac
7.3. Bucles.
Los bucles son estructuras reiterativas que se ejecutan repetitivamente, para no tener que
teclear varias veces un mismo bloque de cdigo. Un bucle debe tener siempre una condicin
de salida para evitar errores provocados por bucles infinitos.
La siguiente tabla describe las 2 rdenes especiales que pueden utilizarse para romper el
modo de operacin tpico de un bucle.
Orden Descripcin
break Ruptura inmediata de un bucle (debe evitarse en programacin estructurada
para impedir errores de lectura del cdigo).
continue Salto a la condicin del bucle (debe evitarse en programacin estructurada para
impedir errores de lectura del cdigo).
Los siguientes puntos describen los distintos bucles que pueden usarse tanto en un guin
como en la lnea de mandatos de BASH.
Los bucles genricos de tipos para cada ejecutan el bloque de cdigo para cada valor
asignado a la variable usada como ndice del bucle o a su expresin de control. Cada iteracin
debe realizar una serie de operaciones donde dicho ndice vare, hasta la llegar a la condicin
de salida.
El tipo de bucle for ms utilizado es aqul que realiza una iteracin por cada palabra (o
cadena) de una lista. Si se omite dicha lista de valores, se realiza una iteracin por cada
parmetro posicional.
Por otra parte, BASH soporta otro tipo de bucle iterativo genrico similar al usado en el
lenguaje de programacin C, usando expresiones aritmticas. El modo de operacin es el
siguiente:
38
Se evala la primera expresin aritmtica antes de ejecutar el bucle para dar un valor
inicial al ndice.
Se realiza una comprobacin de la segunda expresin aritmtica, si sta es falsa se
ejecutan las iteraciones del bucle. Siempre debe existir una condicin de salida para
evitar que el bucle sea infinito.
como ltima instruccin del bloque se ejecuta la tercera expresin aritmtica que
debe modificar el valor del ndice y se vuelve al paso anterior.
La siguiente tabla describe los formatos de los bucles iterativos genricos (de tipo para
cada) interpretados por BASH.
Bucle Descripcin
for Var [in Lista]; do Bucle iterativo: se ejecuta el bloque de mandatos del bucle
Bloque sustituyendo la variable de evaluacin por cada una de las palabras
done incluidas en la lista.
For ((Exp1; Exp2; Exp3)) Bucle iterativo de estilo C: se evala Exp1, mientras Exp2 sea
do Bloque cierta se ejecutan en cada iteracin del bucle el bloque de
done mandatos y Exp3 (las 3 expresiones deben ser aritmticas).
Los bucles condicionales evalan la expresin en cada iteracin del bucle y dependiendo del
resultado se vuelve a realizar otra iteracin o se sale a la instruccin siguiente.
La siguiente tabla describe los formatos para los 2 tipos de bucles condicionales soportados
por el intrprete BASH.
39
Bucle Descripcin
while Expresin; do Bucle iterativo mientras: se ejecuta el bloque de rdenes
Bloque mientras que la condicin sea cierta. La expresin de evaluacin
done debe ser modificada en algn momento del bucle para poder salir.
until Expresin; do Bucle iterativo hasta: se ejecuta el bloque de cdigo hasta que
Bloque la condicin sea cierta. La expresin de evaluacin debe ser
done modificada en algn momento del bucle para poder salir.
Ejercicio 7.5: convertir este bucle while en un bucle until y en uno for de estilo C.
i=5
while [ $i -ge 0 ] ; do
if [ -f /var/log/ksyms.$i ] ; then
mv /var/log/ksyms.$i /var/log/ksyms.$(($i+1))
fi
i=$(($i-1))
done
Bucle Descripcin
select Var [in Lista]; Bucle de seleccin interactiva: se presenta un men de seleccin
do Bloque1 y se ejecuta el bloque de cdigo correspondiente a la opcin
... elegida. El bucle se termina cuando se ejecuta una orden break.
done La variable PS3 se usa como punto indicativo.
40
8. Funciones.
Una funcin en BASH es una porcin de cdigo declarada al principio del programa, que
puede recoger parmetro de entrada y que puede ser llamada desde cualquier punto del
programa principal o desde otra funcin, tantas veces como sea necesario.
El uso de funciones permite crear un cdigo ms comprensible y que puede ser depurado ms
fcilmente, ya que evita posibles errores tipogrficos y repeticiones innecesarias.
Los parmetros recibidos por la funcin se tratan dentro de ella del mismo modo que los del
programa principal, o sea los parmetros posicionales de la funcin se corresponden con las
variables internas $0, $1, etc.
El siguiente cuadro muestra los formatos de declaracin y de llamada de una funcin..
Declaracin LLamada
[function] NombreFuncin () NombreFuncin [Parmetro1 ...]
{
Bloque
...
[ return [Valor] ]
...
}
La funcin ejecuta el bloque de cdigo encerrado entre sus llaves y al igual que un
programa devuelve un valor numrico. En cualquier punto del cdigo de la funcin, y
normalmente al final, puede usarse la clusula return para terminar la ejecucin y
opcionalmente indicar un cdigo de salida.
Las variables declaradas con la clusula local tienen un mbito de operacin interno a la
funcin. El resto de variables pueden utilizarse en cualquier punto de todo el programa. Esta
caracterstica permite crear funciones recursivas sin que los valores de las variables de una
llamada interfieran en los de las dems.
En el ejemp lo del siguiente cuadro se define una funcin de nombre salida, que recibe 3
parmetros. El principio del cdigo es la definicin de la funcin (la palabra function es
opcional) y sta no se ejecuta hasta que no se llama desde el programa principal. Asimismo, la
variable TMPGREP se declara en el programa principal y se utiliza en la funcin manteniendo
su valor correcto.
#/bin/bash
# comprus - comprueba la existencia de usuarios en listas y en
# el archivo de claves (normal y NIS).
# Uso: comprus ? | cadena
# ?: ayuda.
# Ramn Gmez - Septiembre 1.998.
# Rutina de impresin.
# Parmetros:
# 1 - texto de cabecera.
# 2 - cadena a buscar.
41
# 3 - archivo de bsqueda.
salida ()
{
if egrep "$2" $3 >$TMPGREP 2>/dev/null; then
echo " $1:"
cat $TMPGREP
fi
}
## PROGRAMA PRINCIPAL ##
PROG=$(basename $0)
TMPGREP=/tmp/grep$$
DIRLISTAS=/home/cdc/listas
if [ "x$*" = "x?" ]
then
echo "
Uso: $PROG ? | cadena
Propsito: $PROG: Bsqueda de usuarios.
cadena: expresin regular a buscar.
"
exit 0
fi
if [ $# -ne 1 ]; then
echo "$PROG: Parmetro incorrecto.
Uso: $PROG) ? | cadena
?: ayuda" >&2
exit 1
fi
echo
for i in $DIRLISTAS/*.lista; do
salida "$1" "$(basename $i | sed 's/.lista//')" "$i"
done
salida "$1" "passwd" "/etc/passwd"
[ -e "$TMPGREP" ] && rm -f $TMPGREP
Ejercicio 7.6: desarrollar en BASH una funcin que reciba un nico parmetro, una cadena
de caracteres, y muestre el ltimo carcter de dicha cadena. Debe tenerse en cuenta que el
primer carcter de una cadena tiene como ndice el valor 0.
Ejercicio 7.7: programar una funcin BASH que reciba una cadena de caracteres y que la
imprima centrada en la pantalla. Tener en cuenta que el ancho del terminal puede estar
definido en la variable de entorno COLUMNS, en caso contrario usar un valor por defecto de 80
columnas.
42
9. Caractersticas especiales
En ltima instancia se van a describir algunas de las caractersticas especiales que el intrprete
BASH aade a su lenguaje para mejorar la funcionalidad de su propia interfaz y de los
programas que interpreta.
Seguidamente se enumeran algunas de las caractersticas especiales de BASH y en el resto de
puntos de este captulo se tratan en mayor profundidad las que resultan ms interesantes:
Posibilidad de llamar al intrprete BASH con una serie de opciones que modifican su
comportamiento normal.
Mandatos para creacin de programas interactivos.
Control de trabajos y gestin de seales.
Manipulacin y personalizacin del punto indicativo.
Soporte de alias de comandos.
Gestin del histrico de rdenes ejecutadas.
Edicin de la lnea de mandatos.
Manipulacin de la pila de ltimos directorios visitados.
Intrprete de uso restringido, con caractersticas limitadas.
Posibilidad de trabajar en modo compatible con la norma POSIX 1003.2 [2].
Mandato Descripcin
read [-p "Cadena"] [Var1 ...] Asigna la entrada a variables: lee de la entrada estndar y
asigna los valoras a las variables indicadas en la orden.
Puede mostrarse un mensaje antes de solicitar los datos.
Si no se especifica ninguna variable, REPLY contiene la
lnea de entrada.
echo [-n] Cadena Muestra un mensaje: manda el valor de la cadena a la
salida estndar; con la opcin n no se hace un salto de
lnea.
43
printf Formato Parm1 ... Muestra un mensaje formateado: equivalente a la funcin
printf del lenguaje C, manda un mensaje formateado a la
salida normal, permitiendo mostrar cadena y nmeros con
una longitud determinada.
Como ejercicio se propone explicar paso a paso el funcionamiento del bucle anterior y los
valores que se van asignando a las distintas variables en cada iteracin.
Las rdenes para el control de trabajos permiten manipular los procesos ejecutados por el
usuario o por un guin BASH. El usuario puede manejar varios procesos y subprocesos
simultneamente, ya que el sistema asocia un nmero identificador nico a cada uno de ellos.
Los procesos asociados a una tubera tienen identificadores (PID) propios, pero forman parte
del mismo trabajo independiente.
La siguiente tabla describe las instrucciones asociadas con el tratamiento de trabajos.
Mandato Descripcin
Mandato & Ejecucin en 2 plano: lanza el proceso de forma
desatendida, con menor prioridad y con la posibilidad de
continuar su ejecucin tras la desconexin del usuario.
bg %NTrabajo Retorna a ejecutar en 2 plano: contina la ejecucin
desatendida de un procesos suspendido.
fg %NTrabajo Retorna a ejecutar en 1er plano: vuelve a ejecutar el proceso
asociado al trabajo indicado de forma interactiva.
jobs Muestro los trabajos en ejecucin, indicando el n de trabajo
y los PID de sus procesos.
44
kill Seal PID1|%Trab1 ... Manda una seal a procesos o trabajos, para indicar una
excepcin o un error. Puede especificarse tanto el n de seal
como su nombre.
suspend Para la ejecucin del proceso, hasta que se recibe una seal
de continuacin.
trap [Comando] [Seal1 ...] Captura de seal: cuando se produce una determinada seal
(interrupcin) en el proceso, se ejecuta el mandato asociado.
Las seales especiales EXIT y ERR se capturan
respectivamente al finalizar el script y cuando se produce un
error en una orden simple.
wait [PID1|%Trab1] Espera hasta que termine un proceso o trabajo: detiene la
ejecucin del proceso hasta que el proceso hijo indicado hay
finalizado su ejecucin.
Cuando el administrador del sistema asigna al usuario un intrprete de uso restringido, ste
ltimo utiliza un entorno de operacin ms controlado y con algunas caractersticas limitadas
o eliminadas.
Existen 3 formas de ejecutar BASH en modo restringido:
rbash
bash r
bash --restricted
45
No se pueden ejecutar ma ndatos indicando su camino, slo se ejecutarn aquellos que
se encuentren en los directorios especificados por el administrador..
No se pueden especificar caminos de ficheros como argumento del mandato . .
No se pueden aadir funciones nuevas en los ficheros de inicio.
No se admiten redirecciones de salida.
No se puede reemplazar el intrprete RBASH (no se puede ejecutar la orden exec).
No se pueden aadir o quitar mandatos internos.
No se puede modificar el modo de operacin restringido.
46
10. Referencias.
47
APNDICE A. Cuestionario del curso.
48
7. Cul de las siguientes rdenes muestra un mensaje de error si el
programa no recibe ningn parmetro?
a) if [ $$ -le 1 ]; then echo "Error "; fi
b) if [ $* < 1 ]; then echo "Error " &2; fi
c) if ($ars<1); then echo "Error" >&2; fi
d) if [ $# -lt 1 ]; then echo "Error " >&2; fi
10. Qu es un bucle?
a) Una variable especial.
b) Un fichero de dispositivo.
c) Una estructura de programacin.
d) Un tipo de sustitucin de parmetro.
49
13. Dnde pueden colocarse los comentarios en un guin?
a) Slo al principio del programa.
b) Slo en las lneas que empiezan por el carcter #.
c) En las lneas que contengan el carcter # fuera de entrecomillado o sustitucin.
d) A la derecha de cualquier carcter #.
50
APNDICE B. Respuestas al cuestionario.
1. c)
2. c)
3. a)
4. a)
5. b)
6. b)
7. d)
8. d)
9. b)
10. c)
11. a)
12. c)
13. c)
14. b)
15. c)
51