Beruflich Dokumente
Kultur Dokumente
PROGRAMACIN SHELL
Programacin Shell
Prefacio Una de las caractersticas sobre las que radica el podero del sistema operativo UNIX, es la interface con el usuario, la cual acta a manera de coraza sobre el kernel, a esta interface se le conoce como shell. El shell contiene un interprete de comandos con capacidades sofisticadas de programacin. Todo usuario mantiene una constante interaccin con el shell, un conocimiento amplio del mismo mejoraran significativamente la productividad. Este curso dar las herramientas necesarias y prcticas, para utilizar efectivamente la programacin shell. Existen varias versiones de shell, este curso se enfoca hacia Bourne Shell y Korn Shell. El primero por ser el original y el segundo por ser el de mayor demanda actualmente.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
INDICE
1 - Introduccin
1.1 1.2 1.3 1.4 Caractersticas de shell Usos de la programacin shell Ventajas de la programacin shell Ejecucin en shell 8 8 9 9 10
2 - Procesos UNIX
2.1 2.2 2.3 2.4 Conceptos de parent, child, fork, exec, wait, spawn. Inmunidad a interrupcin. Medio ambiente original. Archivos estandar
11 11 12 12 13 14 14 14 15 15 16 16 16 17 18
3 - Mecanismos de encomillado.
3.1 3.2 3.3 3.4 Caracteres especiales Comillas simples. Comillas dobles. Diagonal invertida
4 - Comandos
4.1 4.2 4.3 4.4 Comando simple Entubamiento (pipeline) Lista de comandos Agrupacin de listas de comandos
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
INDICE (cont)
5 - Ejecucin
5.1 5.2 5.3 Secuencia de interpretacin Secuencia de bsqueda Tabla de hash
hash
6 - Comandos Interconstruidos
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 Comentario Cambio de directorio Desplegar mensaje Opcin de despliegue Terminacin del shell Directorio de trabajo Cambio de grupo Tipo de comando Limite de archivo
7 - Redireccin de Archivos
7.1 7.2 7.3 7.4 7.5 Redireccin File Descriptors (descripcin de archivos) Archivo nulo Apertura y cierre implcito de archivos Apertura y cierre explcito de archivos
8 - Lista de Argumentos
8.1 Metacaracteres
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
INDICE (cont)
9 - Variables
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 Creacin de variables Asignacin Asignacin con sustitucin de comando Lectura de valores Eliminacin de variables Parmetros posicionales Asignacin a parmetros posicionales Desplazamiento de parmetros posicionales Variables predefinidas Variables de ambiente Evaluacin forzada 32 32 33 34 34 35 35 37 39 40 41 42
43
12 - Medio Ambiente
12.1 12.2 12.3 12.4 12.5 12.6 12.7 Ambiente local Ambiente global Exportacin de variables Consideraciones de exportacin Variables solo de lectura Parmetros keyword Inhibicin de ambientes
13 - Comando test
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
INDICE (cont.)
14 - Condicionales
14.1 14.2 Condicional Condicional multiple if case 51 51 53 54 Ciclo positivo Condicin verdadera Ciclo negativo Iteracin Rompimiento parcial de un ciclo Rompimiento total de un ciclo Lectura de archivos while true : until for continue break line read 54 54 55 55 56 56 57 58
15 - Ciclos
15.1 15.2 15.3 15.4 15.5 15.6 15.7
18 - Aritmetica
18.1 18.2 18.3 18.4 18.5 Calculo aritmtico y extraccin de cadenas Calculo aritmetico Calculadora binaria Definicin de variables Arreglo de variables
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
INDICE (cont.)
19 - Control de trabajos
19.1 19.2 19.3 19.4 19.5 Suspensin de trabajo Consulta de trabajos en background Reactivacin de un proceso en background Reactivacin de un proceso en foreground Coprocesos ^Z jobs bg fg |& 72 72 72 73 73 74 75 75 77
20 - Banderas de Ejecucin
20.1 20.2 Banderas de ejecucin Banderas de invocacin
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
1 - Introduccin
El shell es un programa que recibe las ordenes del usuario y las traduce en instrucciones internas para el sistema. Su nombre shell (caparazn) describe realmente su funcin: es un material duro que cubre al ncleo del mundo exterior , proporcionando as una robusta interfaz entre el usuario y el sistema operativo. El shell incluye un gran numero de funciones, e implementa algunos de los conceptos ms potentes y elegantes del Sistema Operativo UNIX.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
10
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
11
2 - Procesos UNIX
Un proceso es la ejecucin de un programa UNIX, e incluye todo el cdigo del programa y los datos requeridos para la ejecucin del mismo, el manejo de estos datos involucra el manejo de los archivos correspondientes. Todo usuario para iniciar su trabajo ejecuta uno de los shells existentes, este a su vez espera las ordenes a ejecutar.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
12
Un proceso padre que espera por la terminacin del proceso hijo se le conoce como proceso sncrono (ejecucin en foreground), al proceso que no espera la terminacin del proceso hijo se le conoce como proceso asncrono (ejecucin en background). Al terminar o cancelar la ejecucin de un proceso padre, automticamente termina la ejecucin de todos los procesos hijos. El shell utiliza las llamadas al sistema fork y exec para la ejecucin de otros comandos unix, otros shells y otros programas. Un shell por medio de fork genera (spawn) un proceso hijo y este puede ser la ejecucin de otro shell, a este nuevo proceso se le llama subshell. La ejecucin de un programa simple de shell puede involucrar la ejecucin de varias llamadas fork y exec.
- Environment Todas las variables contenidas en el ambiente global del proceso padre.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
13
- Directorio de trabajo El directorio de trabajo utilizado al momento de crear al proceso hijo. - Archivos abiertos Todos los archivos que se encuentran abiertos por el proceso padre al momento de crear al proceso hijo.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
14
3 - Mecanismos de encomillado
Shell provee de varios mecanismos de encomillado que permiten al usuario el manejo de caracteres especiales, las cuales dentro de un contexto normal tienen un significado diferente.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
15
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
16
4 - Comandos
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
17
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
18
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
19
5 - Ejecucin
5.1 - Secuencia de interpretacin.
Todo comando esta formado por una serie de palabras y smbolos, los cuales se evalan en la secuencia siguiente: 1- Lee la entrada hasta encontrar un newline (\n), punto y coma(;) o un ampersand (&). sleep 600 & 2- Identifica los argumentos de redireccin ( <, >, >>, | ) para el manejo adecuado de los archivos. tr 0<entrada 1>salida 3- Sustituye las variables ($) por su valor . echo $LOGNAME 4- Sustituye los comandos, es decir se ejecutan los comandos internos y sus resultados se sustutuyen en el comando externo. echo Hay `who || wc -l` usuarios firmados 5- Identifica los separadores de campo dentro del comando resultante, con el fin de identificar los argumentos del comando. Los separadores de campo se especifican en la variable IFS 6- Realiza la generacin de nombres, mediante la interpretacin de los metacaracteres ( *, ?, [ ] ). ls -l arch* 7- Ejecuta el comando.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
20
4- Busca el comando en la tabla de hash. 5- Busca el comando utilizando los directorios que contiene la variable PATH. 6- Enva mensaje de error
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
21
- Registra el numero de veces que se ha ejecutado el comando durante la sesin de trabajo del usuario. - El numero de directorios de la variable PATH en los que se realizo la bsqueda .
command - El nombre del comando incluyendo la ruta completa de localizacin. En caso de que un usuario genere un shell con el nombre de un comando que ya se encuentra registrado en la tabla de hash, no podr ejecutarlo pues esta tabla se consulta en segundo lugar. En este caso lo conveniente es ejecutarlo usando la ruta absoluta o relativa. En el caso de Bourne Shell la tabla de hash se borra as: hash -r La tabla de hash se puede alimentar de direcciones sin ejecutar los comandos, esto hace de la siguiente forma: hash comando comando . . . .
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
22
6 - Comandos Interconstruidos
La programacin de shell incluye el manejo de todos los comandos de UNIX, sin embargo existen algunos que se recomienda utilizar debido a que son mas rpidos y ms eficientes, ya que pueden no generar un nuevo proceso para su ejecucin.
6.1 - Comentario
Permite la inclusin de comentarios dentro de programacin, puede ir en cualquier lugar del texto y se considera comentario todo lo que se encuentre a su derecha en la misma lnea. who I wc -l # Determina el nmero de usuarios
cd
Ejecuta el cambio de directorio, solo si el usuario tiene el permiso correspondiente. Para hacer el cambio de directorio se debe teclear el path completo, de no hacerlo se toma el directorio de la variable CDPATH. - cd /u/contab/fuentes - CDPATH=/u/contab cd fuentes Si al comando cd no se le especifica el directorio destino, se toma el valor de la variable HOME y el nuevo directorio afecta a los siguientes subshells.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
23
echo
Permite copiar el argumento dado a la slida estandar, esta salida al igual que la de cualquier comando se puede redireccionar a otro archivo. Los usos ms frecuentes son: - Solicitar entrada de datos. echo "Teclee su nombre: \c" echo "Teclee su nombre: \c" unix linux
- Envo de mensajes de error o preventivos dentro de un programa. echo "Respuesta invalida. Reintente" unix
- Verificar la expansin de un argumento que contenga metacaracteres, esto es muy til sobre todo cuando la tarea a realizar es muy delicada. echo *prg.?? El comando echo * puede sustituir al comando ls *, el desplegado lo hace en forma horizontal, y omite los archivos que inician con "." (archivos ocultos). El comando echo reconoce las siguientes secuencias de escape ( en linux se debe usar la opcin e o n ) : \b \c \n \t \a backspace, regresa el cursor un espacio. No enviar new-line al final de la copia. New-line Tabulador Horizontal Alarma
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
24
Posicionamiento Linea/Columna.- Se hace utilizando el siguiente formato: echo "^[[4;7HTeclee su nombre:" echo "^[[4;25H" Donde ^[ es un solo caracter, el cual se logra mediante la combinacion de CONTROL-v-ESC Normalmente solo es valido un posicionamiento por cada comando echo. Para insertar una secuencia de escape, se debe teclear control-v y la letra correspondiente, por ejemplo para insertar ^H se debe teclear control-v-H.
tput
Este comando en combinacin con echo nos permite dar ms presentacin a las pantallas, mediante las opciones: blink Parpadeo bold Remarcado rev Vdeo inverso
NOTA: La disponibilidad de estas opciones depende el emulador e terminal, y/o versin el sistema operativo que se esta usando.
exit
Termina la ejecucin de un programa, comando o shell y permite regresar al shell padre un cdigo de retorno especifico.
exit [n]
La ejecucin directa en el prompt de shell obliga la terminacin del shell.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
25
pwd
newgrp
Un usuario puede estar dado de alta en varios grupos (/etc/group), al firmarse un usuario se toma por default el grupo definido en el archivo /etc/group. Durante la sesion de trabajo el cambio de grupo se hace asi:. newgrp [-] nuevo-grupo Solo las variables globales se envan al nuevo ambiente, y se reciben como variables locales. newgrp system luis
type
Permite conocer el tipo de los comandos, o sea si es interconstruido ( builtin), o bien se encuentra en algn directorio del sistema. type pwd cd ls df pwd is a shell builtin cd is a shell builtin ls is /usr/bin/ls df is /usr/bin/df
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
26
ulimit
Permite fijar un limite mximo de n bloques de 512 bytes ( este valor puede cambiar en algunas versiones del sistema operativo ) para cada archivo creado por el usuario, esto facilita la administracin del espacio en disco. ulimit [n] El tamao del bloque lgico es importante, ya que en maquinas con bloques de: 1024 n se divide entre 2 2048 n se divide entre 4 4096 n se divide entre 8 en todos los caso anteriores las fracciones se truncan. Las modificaciones del limite siempre son para disminuir el tamao, nunca para aumentarlo. ulimit 500 Si se desea conocer el limite actual se ejecuta el comando sin argumentos: ulimit 524,288,000
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
27
7 - Redireccin de Archivos
7.1 - Redireccin.
Todos los comandos de UNIX por estndar manejan los siguientes tres archivos: 0 = Entrada Estandar 1 = Salida Estandar 2 = Salida Error Estandar Teclado Pantalla Pantalla
estos archivos se pueden redireccionar a otros archivos: tr -d abc <entrada >salida el comando anterior asume la entrada estandar y la slida estandar, el comando siguiente muestra explcitamente los archivos de entrada y salida: tr -d abc 0<entrada 1>salida otra caracterstica de la redireccin es que no tiene un orden definido en el formato del comando, los siguientes ejemplos son todos iguales: cat <arch1 >arch2 cat >arch2 <arch1 <arch1 cat >arch2 >arch2 cat <arch1 <arch1 >arch2 cat >arch2 <arch1 cat
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
28
>>
Los file descriptors se pueden redireccionar de tal forma que mas de uno se lige con un solo archivo fsico. El & es el smbolo de redireccion de file descriptors. comando <arch1 >reporte comando <arch1 3<&0 2>&1 La slida de error estandar se liga a la entrada estandar
> reporte La entrada estandar se toma de arch1 y el file descriptor 3 se liga a la entrada estandar.
La evaluacin del comando se hace de izquierda a derecha, esto se debe tener en cuenta al momento de hacer la redireccin de los file descriptors, de no hacerlo se obtienen resultados diferentes a los deseados. comando <arch1 2>&1 >reporte comando 3<&0 <arch1 >reporte ERROR ERROR
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
29
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
30
8 - Lista de Argumentos
8.1 - Metacaracteres
Bastantes comandos de UNIX permiten manejar en sus argumentos varios nombres de archivos, estos forman entonces una lista de argumentos. Para facilitar la creacin de estas listas existen unos caracteres especiales llamados metacaracteres, los cuales trabajan a base de patrones. * Sustituye a una cadena de caracteres de longitud variable e incluso puede ser nula. ls -l file* ls -l *pgr* ? Sustituye solo a un carcter, y debe existir, por lo tanto no puede ser nulo. ls -l file? ls -l ?file? [ ] Permite manejar un juego de caracteres, o bien un rango alfabtico, cada uno de estos caracteres se maneja en forma individual. ls -l [aeiou]file # Juego de caracteres # Rango alfabtico # Grupo alfabtico
ls -l [a-g]file ls -l file[!1234567890]
NOTA: En este ultimo ejemplo vemos la negacin de una condicin, mediante el uso del simbolo de admiracin !. Para prevenir el conflicto con los archivos . y .. que aparecen en cada directorio, la generacin de listas por medio de los metacaracteres no los incluye, por lo que si se desea su inclusin, se utiliza explcitamente en el comando. ls -l .*
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
31
En caso de que al generar una lista sta quede vaca, el patrn de generacin se toma como argumento del comando. echo file? file? # Se asume que el patrn no se encuentra # El comando regresa el patrn como argumento
Un argumento de generacin puede tener varias combinaciones de metacaracteres. echo *[!a-z] PRECAUCION. Cuando se van a usar metacaracteres con el comando rm, se recomienda hacer la generacin de nombres con otro comando ( echo) cuya ejecucin no tenga repercusin en caso de error.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
32
9 - Variables
9.1 - Creacin de variables.
El lenguaje de programacin shell tiene la capacidad de manejar variables, estas variables no tan solo se manejan dentro de un programa, sino que se pueden entregar a otro programa o comando al momento de invocar la ejecucin, en este caso se les llama argumentos. Existen varias maneras de crear variables o asignarles valor, para hacer referencia al valor de la variable se antepone el smbolo $ al nombre de la variable. Hay cuatro mtodos para manejar variables, ya sea para crearlas o asignarles un valor. - Asignacin directa (=). - Lectura de valores (read). - Parmetros posicionales ($0, $1, $2, ...........$n). - Asignacin a parmetros posicionales (set). El nombre de una variable se forma con la combinacin de los caracteres alfabticos, numricos y el _, y no debe comenzar con un nmero. Todas las variables que se crean quedan en el medio ambiente actual.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
33
9.2 - Asignacin
Mediante la asignacin creamos una variable o bien alteramos el valor de una ya existente, esto se hace mediante el smbolo =, el cual hace la liga lgica entre el nombre de la variable y el valor, no debe haber espacios ni antes ni despus del signo =. a=auto echo $a auto en una lnea de pueden hacerse varias asignaciones separadas por espacios. a=auto b=movil el valor de una variable puede ser la concatenacin del valor de otras variables. a=auto b=movil c=$a$b echo $c automvil Una variable que se forma con los valores de otras, se puede crear en la misma lnea de la asignacin, y debe ir del lado derecho. a=auto b=movil c=$a$b echo $c automvil La concatenacin puede incluir tambin una cadena de caracteres, en este caso el nombre de la variable debe ir encerrado entre { }, a=auto c=${a}movil echo $c automvil En la asignacin de variables los metacaracteres pierden su valor, y se toman como un carcter individual a=* b=$a echo $b * NOTA: Valido solo en algunas versiones de Unix
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
34
La asignacin se realiza dependiendo del numero de variables receptoras y el numero de palabras ledas. Igual nmero de variables y palabras: read a b buenos das echo $a buenos echo $b das
genesys@prodigy.net.mx
(4)2-20-53-21
Sistema Operativo Unix Mas variables que palabras: read a b c buenos das echo $a buenos echo $b das echo $c
Programacin Shell
35
<===== la variable c tiene valor nulo Mas palabras que variables: read a buenos das echo $a buenos das
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
36
Para traer el valor de un parmetro posicional cuyo nombre tiene mas de un dgito, es necesario el uso de llaves {..}. echo ${24} ${45} Los parmetros posicionales pueden concatenarse con otra variable o bien con una cadena de caracteres, s el nombre de los parmetros posicionales se limita a un dgito, no es necesario el uso de { } . echo $1$2$3 En los parmetros posicionales no se permite la asignacin directa de valor. $1=valor <======== ERROR
Para hacer referencia a todos los valores de los parmetros posicionales excepto el cero , usamos los smbolos $* y $@ los cuales permiten manipular en una sola operacin todos los valores de los parmetros posicionales. $@ Se refiere a todos los valores contenidos en los parmetros posicionales, a cada uno lo considera como un valor individual.
"$@" Se refiere a todos los valores contenidos en los parmetros posicionales, a cada uno lo considera como un valor individual. $* Se refiere a todos los valores contenidos en los parmetros posicionales, a cada uno lo considera como un valor individual. Aplica a las tres notaciones anteriores programa jorge mario martinez en este caso dentro del programa podemos desplegar la informacin as: echo echo echo echo $! $2 $3 $*
Ejemplo:
genesys@prodigy.net.mx
(4)2-20-53-21
Sistema Operativo Unix jorge mario martinez jorge mario martinez "$*"
Programacin Shell
37
Esta notacin es un caso muy particular, pues todos los valores de los parmetros posicionales se concatenan y se manejan como una sola cadena de caracteres. Solo para la notacin anterior programa jorge mario martinez en este caso dentro del programa podemos desplegar la informacin as: echo echo echo echo $1 $2 $3 $* jorge mario martinez jorge mario martinez Concatena valores en $1 $2 esta vacio $3 esta vacio Despliega todos los parmetros posicionales, aunque solo tiene valor $1
Ejemplo:
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
38
El comando set permite la asignacin de valores a los parmetros posicionales en orden secuencial, comenzando por $1. set a b c d e f g h echo $4 d set `date` echo $1 Mon El comando set maneja opciones al igual que cualquier otro comando, tambien van precedidas por el signo menos. Un caso especial es el manejo de un argumento nmerico y negativo, pues el signo - se interpreta como opcin del comando. Para evitar este problema se utiliza la notacin --, que permite la asignacin de valores nulos o que comienzen con el signo -, set -- -1 -2 -3 echo $3 $2 $1 -3 -2 -1 El comando set permite el manejo de banderas, por ahora solo mencionamos dos, en leccin posterior se ven ms a fondo. v - Despliega las instrucciones del un programa al momento de leerlas. x - Despliega las instrucciones con las sustituciones correspondientes, antes de ejecutarlas. set -xv Estas opciones son muy tiles para la depuracin de programas, y deben ir al inicio del mismo.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
39
shift
Para manejar los parmetros posicionales que siguen del noveno, se utiliza el comando shift, el cual realiza un corrimiento de n parmetros hacia la izquierda, en este corrimiento se pierden los valores anteriores. El valor del parmetro cero no cambia a pesar del corrimiento. read a b c d e f g h i j k l m n o 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 set $a $b $c $d $e $f $g $h $i $j $k $l $m $n $o echo $1 $2 $3 123 shift 3 echo $1 $2 $3 456 echo $* 4 5 6 7 8 9 10 11 12 13 14 15
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
40
$-
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
41
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
42
Numero aleatorio entre 0 y 32767. Segundos en la sesin actual de trabajo. Shell a usar para los sub-shells. Tipo de terminal actual. Zona de tiempo del equipo actual.
La ejecucin del comando set sin argumentos, despliega las variables anteriores y sus valores.
eval
Lee los argumentos de un comando como si fueran de entrada para el shell actual, y esto causa que se obligue la revaluacin de una lnea dentro de un programa, dicho de otra manera obliga la sustitucin de variables y comandos antes de interpretar la redireccin ( <, >, >>, | ). pipe=| who $pipe wc -l | wc -l not found not found not found
lo anterior muestra errores al ejecutarse, para corregirlos se utiliza el comando eval de la siguiente manera: pipe=| eval who $pipe wc -l
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
43
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
44
S el delimitador se encierra entre comillas dobles " ", se inhibe la sustitucin de variables, la sustitucin de comandos y el significado de los metacaracteres. cat <<"LIMITE" ........................ ........................ ........................ LIMITE
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
45
11 - Funciones
11.1 - Definicin.
Una funcin es una coleccin de comandos definidos dentro de un programa, el formato de una funcin consta de un nombre y una lista de comandos encerrados entre llaves. El nombre sigue las mismas reglas para nombres de variables. Los comandos constituyen el cuerpo de la funcin. funcin () { lista de comandos; } -----------------------------------------------funcin () { comando ................. comando } La definicin de una funcin se puede hacer en : - El archivo .profile. - Al inicio de un programa. - Directamente en la lnea de comando.
11.2 - Manejo.
Los parmetros posicionales se utilizan para pasar argumentos a la funcin, de la misma manera que en un programa de shell. funcin $a $b $c Cuando el shell se ejecuta coloca en memoria a la funcin, y la maneja como un comando interconstruido (buit-in).
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
46
11.4 - Restricciones.
Las funciones tienen las siguientes restricciones; - No pueden ser exportadas a otros subshells. - No deben definirse dentro de la instruccin case. - El nombre no debe tener el formato f.name. Es muy importante tener en cuenta estas restricciones, ya que de violarlas el sistema operativo no enva algn mensaje de error.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
47
12 - Medio Ambiente
Cada versin de shell tiene dos medios ambientes, en los que se encuentran todas las variables y se ejecutan los procesos.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
48
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
49
13 - Comando test
Dentro de la programacin de shell, para tomar una decisin es necesario evaluar una expresin, esto se hace mediante el comando test, el cual tiene dos formatos: test expresin [ expresin ]
Esta evaluacin da por resultado uno de dos estatus: 0 0 Evaluacin verdadera Evaluacin no verdadera
El comando test permite hacer diferentes evaluaciones, a continuacin las ms usuales y sus operadores: -r file Verdadero si el archivo existe y hay permiso de lectura para el usuario.
-w file Verdadero si el archivo existe y hay permiso de grabacin para el usuario. -x file -s file -d file -f file -c file -b file -p file -z s1 -n s1 Verdadero si el archivo existe y hay permiso de ejecucin para el usuario. Verdadero si el archivo existe y no esta vaco. Verdadero si el archivo existe y es directorio. Verdadero si el archivo existe y es archivo ordinario. Verdadero si el archivo existe y es tipo carcter. Verdadero si el archivo existe y es tipo bloque Verdadero si el archivo existe y es tipo pipe (fifo). Verdadero si la longitud de la cadena s1 es cero. Verdadero si la longitud de la cadena s1 no es cero.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell Verdadero si ambas cadenas son iguales Verdadero si ambas cadenas son diferentes.
50
Verdadero si la cadena s1 tiene longitud (no nula) Verdadero si los enteros n1 y n2 son algebraicamente iguales. Otros operadores que se usan en esta expresin son: -ne -gt -ge -It -le diferente mayor que mayor o igual menor que menor o igual
Los siguientes operadores se utilizan en combinacin con los anteriores: ! Negacin, colocado antes de la expresin, invierte el sentido de la pregunta. [ ! -r file ] Verdadero si el archivo no existe. -a AND lgico. Permite evaluar ms de una expresin y el resultado final es verdadero solo si todas las expresiones unidas por el operador AND son verdaderas. [ -f arch1 -a -f arch2 -a -f arch3 ] -o OR lgico. Permite evaluar ms de una expresin y el resultado es verdadero si al menos una de todas las expresiones ligadas por el operador OR es verdadera. [ -f arch1 -o -f arch2 -o -f arch3 ] En expresiones muy complejas se deben usar parntesis ( ), solo que estos deben escaparse con \ para eliminar su significado especial. [ \( $a -eq 100 -o $b = N \) -a $resp = s ] IMPORTANTE: Todas las variables utilizadas dentro de la expresin test, se deben encerrar entre comillas para prevenir un resultado errneo.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
51
14 - Condicionales
El lenguaje de programacin shell provee de comandos de control que permiten condicionar la ejecucin de comandos, al resultado de evaluar una expresin.
14.1 Condicional
Pregunta por la evaluacin de una expresin, si es verdadera ejecuta una lista de comandos, si no ejecuta otra. if expresin a evaluar then lista de comandos else lista de comandos fi Ntese que para delimitar el mbito de if, se usa fi. echo Teclee respuesta s/n \c read resp if [ $resp = S -o $resp = s -o $resp = N -o $resp = n ] then ................... ................... else echo Respuesta invalida. Reintente ................... .................... fi
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
52
El comando if permite anidar o encadenar ms ifs, en el caso particular del else seguido del if, se puede manejar la palabra elif, en este caso no se considera abierto otro if. if expresin a evaluar then lista de comandos elif expresin a evaluar then lista de comandos else lista de comandos fi -----------------------------------------hora=`date | cut -c12-13` if [ $hora -le 11 ] then echo Buenos dias elif [ $hora -le 17 ] then echo Buenas tardes else echo Buenas noches fi No es necesario que el comando if tenga el else y su lista de comandos. if expresin a evaluar then lista de comandos fi En caso de que la lista de comandos correspondientes al then sea nula, se utiliza el smbolo de dos puntos : en su sustitucin . if expresin a evaluar then : else lista de comandos fi El status de salida es el del ultimo comando ejecutado.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
53
patron-2)
El ultimo comando dentro de cada patrn debe terminar con ;; En el formato anterior el comando case recibe la variable, la cual se compara con cada uno de los patrones definidos y delimitados por parntesis. Si el valor de la variable coincide con el patrn, se ejecuta la lista de comandos correspondientes, el ultimo comando de la lista debe terminar con doble punto y coma. El OR lgico ( | )permite manejar mas de un valor dentro de una condicin: echo Teclee respuesta s/n \c read resp case $resp in S | s ) echo Respuesta Afirmativa ;; N | n ) echo Respuesta Negativa * ) echo Respuesta invalida esac El status de salida de la instruccin case es el del ultimo comando ejecutado. ;; ;;
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
54
15 - Ciclos
15.1 Ciclo positivo.
Permite la ejecucin repetida de una serie de comandos mientras permanece una condicin especifica, al inicio del ciclo primero se evala la expresin y luego se hace la ejecucin. La expresin puede contener referencias de variables, sustituciones de comando y metacaracteres. while expresin a evaluar do lista de comandos done La lista de comandos se ejecuta solo si la expresin a evaluar es verdadera, o sea que regresa un status de salida cero. while [ $# do lp $1 shift done -gt 0 ]
En el siguiente ejemplo se sustituye la expresin true por : que es mas eficiente por ser Interconstruido (built-in), por esta razn se recomienda su uso. while : do lista de comandos done # : no genera un subshell
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
55
15.4 - Iteracin
Permite la ejecucin repetida de una serie de comandos, el nmero de repeticiones depende de una lista de palabras for do done Dentro del ciclo se maneja la variable de entrada, y va tomando los valores contenidos en la lista de palabras, al termino de ellos se termina el ciclo. for pas in mexico alemania brasil do banner $pais done variable in lista de palabras lista de comandos
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
56
S se omite la lista de palabras se omite el in, en este caso la variable toma los valores contenidos en los parmetros posicionales for i do lp $i done En el siguiente formato la lista de palabras toma el nombre de todos los archivos contenidos en el directorio actual. for i in * do echo $i done
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
57
Es importante notar en los ejemplos anteriores, que la apertura se hace explcita con la instruccin exec, esto permite el manejo secuencial de los archivos. Si la direccin se hace dentro del while, da como resultado la apertura y cierre de archivos en cada ciclo, o sea que tenemos un ciclo infinito que solo procesa el primer registro.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
58
16 - Sustitucin Condicionada
Provee de una notacin compacta para checar si una variable existe, y si es o no nula. ${variable:operadorpalabra} donde: $ {.........} variable operador palabra Indica sustitucin de variable. Notacin para delimitar la sustitucin condicionada. Nombre de la variable cuyo contenido se evala. Carcter simple que indica el tipo de accin a realizar. Valor que se usa para la sustitucin condicionada en una variable.
El operador - checa si la variable existe y no es nula, en cuyo caso el valor encontrado se utiliza en la expresin, en caso contrario utiliza el valor contenido en la palabra. name=bozo echo ${name:-$1} echo ${name} bozo name= echo ${name:-$1} echo ${name} dukie
El operador = checa si la variable existe y no es nula, si la evaluacin es falsa se toma el segundo valor y adems se asigna a la variable nula. name=bozo echo ${name:=$1} echo ${name} bozo bozo name=bozo echo ${name:=$1} echo ${name} dukie dukie
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
59
El operador ? checa si la variable existe y no es nula, si la evaluacin es falsa el mensaje definido se enva por el estandar error. En este caso el estandar error no se puede redireccionar. name=bozo echo ${name:?Error} echo ${name} bozo bozo name= echo${name:?Error} echo ${name} prog: name: Error
Si no se define el mensaje de error, el sistema enva el siguiente mensaje: parameter null or not set
El operador + checa si la variable existe y no es nula, en este caso no usa su valor sino que lo substituye por el de la palabra. name=bozo echo ${name:+!} echo ${name} dukie bozo name= echo ${name:+$!} echo ${name}
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
60
17 - Manejo de seales
17.1 - Seales
Se usan para indicar la ocurrencia de un evento, y se envan por: - El superusuario, o usuario. - El sistema operativo Unix. - Un proceso. Estas seales se manejan dentro de un programa, por medio de la instruccin trap, la cual se incluye al inicio del programa. La siguiente es una lista de las seales ms usadas en la programacin shell: 0 Esta seal la enva un proceso al terminar normalmente. Usada con el comando kill, cancela todos los procesos asincronos (background) iniciados en la sesin actual. Hangup, esta seal se genera al apagar la terminal, desconectar el cable de comunicacin, etc., la accion de default es la terminacin forzada de la sesin de trabajo. Interrupcin, se genera al oprimir algunas de las teclas que obligan la cancelacin del proceso (delete, break, control-c). Quit, se oprimi la tecla de quit, esta seal se ignora por los procesos asincronos. Kill, esta seal no se puede atrapar, por lo que usada con el comando kill, es una muerte segura. Error de bus. Error de memoria, violacin en la segmentacin, generalmente ocasionada por la programacin. Terminacin ordenada de un proceso, esta seal se usa con el comando kill, para cancelar un proceso en forma ordenada, es decir realizando toda la tarea de limpieza necesaria.
2 3 9 10 11 15
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
61
17.2 - trap
Un proceso o programa maneja las seales anteriores mediante el comando: trap lista_de__comandos seales Cuando el comando trap recibe una seal, se toma una de las acciones siguientes: - Aceptar la accin de default. En este caso se omite la lista de comandos. trap 1 2 3 - Ignorar la seal. En este caso la lista de comandos se encuentra vaca. trap 1 2 3 - Atrapar la seal. Se toma una accin determinada, como borrar los archivos temporales, o preveer interrupciones en procesos crticos. En este caso la lista de comandos contiene toda la programacin necesaria para la accin determinada. trap echo Proceso terminado rm /tmp/$$tmp; 0 La instruccin trap y su programacin se lee dos veces, la primera al iniciar la ejecucin del programa, y la otra al momento de activarse.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
62
La lista de comandos contiene uno o varios comandos, dependiendo de la complejidad de la programacin, la lista se encierra entre comillas, por lo tanto hay dos opciones: - Comillas simples. Sustituyen las variables al momento en que se activa el trap. - Comillas dobles. Sustituyen las variables al inicio del programa, por lo tanto los valores permanecen sin cambio durante toda la ejecucin del programa. Si la accin de un trap incluye la terminacin de la ejecucin, se debe incluir el comando exit en la programacin. trap rm -f /tmp/$$tmp; exit 1 2 3 Si se atrapa la seal 0, se debe programar el comando exit, esto hace que cuando se active el trap, se ejecute el comando exit, el cual enva la seal 0, que activa nuevamente el trap, para evitar lo anterior se anidan dos traps: trap trap 0; rm f- /tmp/$$tmp; exit 0 1 2 3 En caso de recibir varias seales, se atienden en orden ascendente.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
63
18 - Aritmtica
18.1 - -expr
Este comando toma como argumentos una expresin y efecta una comparacin o evaluacin de ambas, el resultado lo envia a la salida estandar. Los caracteres especiales para shell se deben escapar y las cadenas (strings) que contengan espacios o caracteres especiales se deben encerrar entre comillas. El comando expr se usa comnmente : - Para asignar valor a una variable. - Para contador de iteraciones dentro de un ciclo. - Para extraer parte de un string. - Para determinar la longitud de una cadena de caracteres. Los operadores se listan a continuacin en orden de precedencia, en caso de que tengan la misma se encierran entre llaves. Algunos caracteres ya tienen un significado especial para shell (|, &, <, >, >> ), por lo tanto al utilizarse en este comando se les antepone la diagonal invertida, y asi se elimina dicho significado. expresin1 \| expresin2 Regresa el valor de la expresin1 siempre y cuando no sea nula o cero, de lo contrario regresa la expresin2. ----a=100 b=200 expr $a \| $b 100 -----
genesys@prodigy.net.mx
(4)2-20-53-21
Sistema Operativo Unix a= b=200 expr $a \|$b 200 ----expresin1 \& expresin2
Programacin Shell
64
Regresa el valor de la expresin1 siempre y cuando ambas expresiones no sean nulas o cero, de lo contrario regresa un valor de 0. ----a=100 b=200 expr $a \& $b 100 ----a= b=200
expr $a \& $b 0 ----expresin1 { =, \>, \>=, \<, \<=, != } expresin2 Regresa el resultado de una comparacin entera, solo si ambas expresiones son enteras, en caso contrario el resultado ser la comparacin de cadenas. Un resultado verdadero se indica con un 1, y uno falso con un 0. ----a=100 b=200c=100 expr $a = $b 0 expr $a = $c 1 0 = expresin falsa 1 = expresin verdadera
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
65
Suma o resta el valor entero de las expresiones. ----a=100 b=200 expr $a - $b -100 ----expresion1 {\*, /, % } expresin2 Multiplica, divide o regresa el residuo de la divisin, lo anterior se realiza con los valores enteros de ambas expresiones. ----a=10 b=20 expr $a \* $b 200 ----expresin1 : expresin2 Compara expresin1 con expresin2, esta debe ser un patrn, el cual se busca dentro de la expresin1. Normalmente la respuesta es el numero de caracteres que coincidieron. ----expr catch : cat 3
genesys@prodigy.net.mx
(4)2-20-53-21
Sistema Operativo Unix ----expr catch : c.*c 4 ----expr catch : .* 5 ----expr catch : cats 0 -----
Programacin Shell
66
str=Buenos dias longitud=`expr $str : .*` echo $longitud 11 Otra alternativa es utilizar en la expresin2 los smbolos \(...\), esto regresa una porcin de la expresin1. En este formato comnmente se usa el patrn .*, el cual obliga la coincidencia de un patrn desde el inicio de la cadena hasta el final. Este patrn se usa entre comillas .*. ----expr petrleos : \(p.*l\) petrol Se extrae la cadena que comienza con p y termina con l. ----expr petrleos : .*\(o.*s\) os En este caso la cadena debe terminar con s y se agregan los caracteres anteriores hasta encontrar una o.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
67
En este caso la cadena debe terminar con s y se extrae adems con tres caracteres anteriores. ----expr petrleos : .\(.*\) etroleos En este caso se elimina el primer carcter y se despliega el resto de la cadena. ----if expr $respuesta : [yY] >/dev/null then echo Respuesta afirmativa fi Ejemplo del comando expr dentro de un comando de condicin, en este caso no interesa la salida del standard output, por lo que se redireccina a /dev/null.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
68
18.2 - let
Este comando pertenece a Korn Shell y bash y permite la ejecucin de mltiples operaciones en una misma lnea. let operacin1 operacin2 let x=x+1 y=y*3 En el ejemplo anterior las expresiones de cada operacin no contienen espacios o tabuladores, en caso de incluirlos las expresiones deben ir entre comillas dobles " ". let "x = x + 1" "y = y * 3"
La palabra let se puede sustituir por ((......)), en este caso la notacin no tiene diferencia si se incluyen espacios o tabuladores, pero tiene las limitacin de no permitir mltiples operaciones en una misma lnea de comando. ((operacin1)) ((x=x+1)) o ((x = x + 1))
Korn Shell soporta los siguientes operadores aritmticos: + - * / % & ^ << >> == != > >= < <= y adicionalmente los operadores de asignacin: += -= *= /= %= &= |= ^= <<= >>= Algunos operadores tienen para shell un significado de redireccin, en este caso la operacin se debe encerrar entre acentos graves ` `, con el propsito de eliminar el significado de redireccin. El comando let ejecuta las operaciones de izquierda a derecha, por lo tanto una operacin puede contener las variables de su izquierda. let x=10 y=20 z=x*y echo $x $y $z 10 20 200
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
69
18.3 - bc
Es un comando interactivo que permite clculos con nmeros de punto flotante, la entrada la lee de un archivo especifico, si no lo hay se lee del standard input, el resultado de la operacin se enva siempre al standard output. bc -[lc] archivo (de entrada) Se soportan los siguientes operadores: + - * / % ^(exponenciacin) ++ -- == <= >= != < > = += -= *= /= %= ^= bc 2*3 6 Se soportan los siguientes operandos: sqrt (expresin) sqrt (16) 4 length (expresin) Nmero de dgitos significativos length (100/2) 2 scale (expresin) Nmero de dgitos a la derecha del punto decimal Raz cuadrada
Los parmetros ibase y obase permiten combinar sistemas de diferente base, lo cual nos permite hacer conversiones fcilmente. ibase=16 obase=16 A+1 11
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
70
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
71
Los elementos de un arreglo se pueden inicializar al mismo tiempo: set -A elemento uno dos tres "cuatro cinco" (no en Linux) Para hacer referencia a un elemento se debe indicar el ndice, de no hacerlo se asume el elemento 0. La referencia a un elemento especifico del arreglo, se hace con el siguiente formato: ${elemento[ndice]} echo ${elemento[1]} dos
De no utilizarse las llaves { }, los corchetes y el ndice [x] se considera una cadena de caracteres que se concatena al elemento 0 del arreglo. echo $elemento[1] uno[1] Para referirnos a todos los valores de un arreglo, se utilizan los smbolos * y @ y siguen las mismas consideraciones de los parmetros posicionales. echo ${elemento[*]} uno dos tres cuatro cinco en el ejemplo anterior cada palabra se considera independiente, y en el siguiente ejemplo las palabras cuatro cinco se consideran un solo valor. echo ${elemento[@]} uno dos tres cuatro cinco
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
72
19 - Control de trabajos
Esta es una caracterstica avanzada de Korn Shell, la cual facilita el manejo de trabajos (jobs) en background. Un trabajo (job) es uno o ms programas en ejecucin, los cuales se consideran como una sola unidad.
Stopped
sleep 60
A cada trabajo en background se le asigna un nmero consecutivo adems de su propio PID, para referirnos a un trabajo (job) en background se utiliza cualquiera de las dos identificaciones. Las teclas de suspensin pueden variar de un sistema a otro. Para conocer el valor asignado se puede utilizar el comando stty -a, y buscar el valor asignado a la funcin susp = ......... El usuario puede modificar el valor de la funcin susp mediante el comando stty. stty susp "^x"
jobs
Muestra los trabajos (jobs) en background, an cuando estn suspendidos, la lista la muestra en orden ascendente de nmero de trabajo ( job).
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
73
bg [%n]
Reinicia la ejecucin de un trabajo en background suspendido anteriormente. Para referirse a un trabajo especifico se utiliza su numero consecutivo o el PID precedido del smbolo de porcentaje (%). Si se omite el nmero de referencia se asume el ltimo trabajo suspendido. sleep 60 ^z [1] + 5562 bg %1 bg 5562 Es importante mencionar que la ejecucin contina en background.
Stopped
sleep 60
fg [%n]
Trae a foreground un trabajo enviado previamente a background, y si estaba suspendido adems reinicia su ejecucin. Para referirse a un trabajo especifico se utiliza su numero consecutivo o el PID precedido del smbolo de porcentaje (%). Si se omite el nmero de referencia se asume el ltimo trabajo enviado a background.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
74
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
75
20 - Banderas
Otra caracterstica de la interface shell, es la flexibilidad en su comportamiento, el cual se ajusta a las necesidades del usuario mediante el uso de banderas. Hay dos categoras de banderas dependiendo de como se activan y donde.
Algunas banderas son: -a (exporta todo) Todas las variables creadas o modificadas, a partir de la activacin de la bandera, se exportan a los subshells que se abran. -e (salir en caso de error) A partir de la activacin de la bandera, si un comando o programa termina anormalmente, es decir que el cdigo de salida es diferente a cero, ocasiona la terminacin del shell. Lo anterior no aplica para los comandos ejecutados como operandos de if, while o until, -f (desactiva metacaracteres) De este modo los metacaracteres o comodines ( * ? [ ] ) pierden su significado especial, y se tratan como caracteres de datos.
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
76
A partir de la activacin, no hay ejecucin de comandos, esta bandera se usa comnmente con la bandera -v, para checar sintaxis de un programa sin ejecutarlo -v (Verbose) Despliega las lneas de entrada al momento de leerse, es decir antes de hacer las sustituciones correspondientes, sin importar si se van a ejecutar o no. El desplegado lo hace a la slida de error estandar. -x (detalle de ejecucin) Despliega cada lnea de comando inmediatamente antes de ejecutarse, e incluye sustitucin de comandos y variables, cada lnea va precedida por el signo +. El desplegado lo hace a la slida de error estandar. -u (variable indefinida) A partir de la activacin, se considera error hacer referencia a una variable indefinida, esto provoca la terminacin del programa o shell. -o [opcin] Esta bandera tiene varias opciones, entre ellas: ignoreeof (ignora control-D) Ignora la interrupcin Control-D con el fin de evitar su entrada accidental, lo que provocara la terminacin del shell. En este caso para terminar la ejecucin de shell, se debe usar la instruccin exit. noclobber (no sobreescritura) No permite la redireccin de la salida (>) sobre archivos existentes, para escribir sobre un archivo existente se debe usar el operador ">|".
genesys@prodigy.net.mx
(4)2-20-53-21
Programacin Shell
77
genesys@prodigy.net.mx
(4)2-20-53-21