Sie sind auf Seite 1von 77

SISTEMA OPERATIVO

PROGRAMACIN SHELL

Ing. Juan Gabriel Franco Delgado


Febrero 2002

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

INDICE (cont)

5 - Ejecucin
5.1 5.2 5.3 Secuencia de interpretacin Secuencia de bsqueda Tabla de hash

19 19 20 21 22 # cd echo tput exit pwd newgrp type ulimit 22 22 23 24 24 25 25 25 26 27 27 28 29 29 29 30 30

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

read unset set shift eval

10 - In-line documents (Here documents) 11 - Funciones


11.1 11.2 11.3 11.4 Definicin Manejo Salida de funcin Restricciones

43

45 45 45 46 46 47 set env export readonly keyword env 47 47 47 47 48 48 48 49

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

16 - Sustitucin condicionada 17 - Manejo de seales


17.1 17.2 Seales Captura de seales trap

60 60 61 63 expr let bc typeset 63 68 69 70 70

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

1.1 - Caractersticas de shell.


Las principales son: - Manipulacin de cadenas variables. - Estructuras de control de flujo tales como: if, for, while y until. - Comunicacin entre procesos por medio de: seales, argumentos y status de salida. - Manejo de archivos. - Generacin de lista de argumentos. - Manejo de funciones. El shell standard fue creado por Steve Bourne, es relativamente pequeo y de propsito general. Sobre las carencias de ste, se desarrollo el C Shell, y posteriormente David Korn desarrollo su propia versin, la cual mejora a las dos anteriores. Shell tiene sus propias herramientas de programacin, y estas se enriquecen con todos los comandos de unix, de aqu el podero de la programacin shell.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

1.2 - Usos de la programacin shell.


Los mas comunes son: 1.- Simplificar la ejecucin de comandos muy complejos y evitar as la posibilidad de error en la ejecucin. 2.- Ejecutar una serie de tareas dependientes entre si. 3.- Personalizar el nombre de los comandos ms usados por usuario. 4.- Crear mens para las aplicaciones de usuario, operacin, etc.

1.3 - Ventajas de la programacin shell.


Los programas en shell no requieren ser compilados por lo que su creacin, manejo y depuracin es una gran ventaja para los usuarios. Las ventajas de la programacin shell las podemos resumir en: 1.- Poderoso lenguaje de programacin. 2.- Fcil de escribir y depurar. 3.- Fcil de entender y modificar.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

10

1.4 - Ejecucin en shell


Existen varias maneras de ejecutar un programa shell: 1.- Si el usuario solo tiene permiso de lectura se entrega al shell para su lectura y ejecucin; por lo tanto se genera un subshell : sh programa ksh programa 2.- Por medio de la orden ".", la ejecucin se realiza dentro del mismo ambiente, es decir no se genera un subshell, por lo que si el proceso realiza cambios temporales en el medio ambiente, variables o archivos abiertos, estos permanecen hasta terminar el proceso p sesion de trabajo . .profile . programa 3.- Por medio de la orden "exec", el proceso hijo sustituye al proceso padre, es decir desaparece todo lo relacionado con el proceso padre, al terminar la ejecucin el proceso que queda vigente (si existe) es el padre actual exec programa 4.- Otorgando el permiso correspondiente de ejecucin: chmod +x programa programa 5.- Utilizando la sustitucin de comando, que es la ejecucin de un comando dentro de otro comando : echo `cat lista`

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

2.1 - Conceptos de parent, child, fork, exec, wait, spawn.


Los procesos de UNIX se crean por medio de las siguientes llamadas al sistema: fork, exec y wait. Un proceso padre (parent), es aquel que replica su ambiente global (spawn) y por lo tanto genera otro proceso (child) dependiente de l. El fork regresa al proceso padre la identificacin ( id) del proceso hijo, y al hijo le enva un cero, esto indica que se esta ejecutando como proceso hijo. La ejecucin por medio de exec causa la sustitucin del ambiente y codigo del proceso padre por el ambiente y codigo del proceso hijo. Dicho de otra manera el proceso padre se sustituye por el proceso hijo, por lo tanto al terminar la ejecucin del proceso hijo, el control no regresa al proceso padre, pues este ya no existe. Al momento de terminar un proceso hijo, enva al padre un cdigo de retorno, el cual tiene un valor numrico, a este se le llama "status de salida". Una terminacin exitosa regresa siempre un cero, y una terminacin fallida regresa cualquier otro valor. Normalmente despues de la instruccin fork el proceso padre ejecuta la instruccin wait, con esto se suspende la ejecucin del proceso padre hasta que termine la ejecucin del proceso hijo. La continuacin del proceso padre se puede condicionar al cdigo de retorno del proceso hijo.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

2.2 - Inmunidad a interrupcin.


Por medio del comando nohup es posible generar un proceso hijo inmune a la cancelacin del proceso padre, es decir el proceso continua, an cuando el usuario de por terminada la sesin de trabajo. nohup /home/nomina/proceso1 & Al terminar el proceso, se graba un mensaje ( nohup.out) en el directorio home del usuario que lo creo, el cual contiene detalles sobre la ejecucin y terminacin del proceso.

2.3 - Medio ambiente original


Un proceso padre hereda a los procesos hijos los siguientes atributos, los cuales se deben de tomar en cuenta para la correcta ejecucin del proceso hijo.

- Environment Todas las variables contenidas en el ambiente global del proceso padre.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

2.4 - Archivos estndar


El sistema operativo unix maneja solo archivos, es decir que una pantalla, una cinta, un disco, una terminal, etc., se consideran archivos. Esta caracterstica es un factor importante para la flexibilidad del sistema operativo, ya que casi la totalidad de los comandos utilizan archivos estandar de entrada y salida, los cuales se pueden manipular por el usuario,

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

3.1 - Caracteres Especiales


* Sustituye una cadena de caracteres de longitud variable, la cual puede ser nula. ? [ $ ` Sustituye a un solo carcter y debe existir. ] Sustituye un juego caracteres o rango, deben existir. Sustitucin de variable. Se ve en leccin posterior. ` Sustitucin de comando. Se ve en leccin posterior.

3.2 - Comillas simples : ' '


Eliminan el significado de todos los caracteres especiales excepto el de si mismas. echo ' Fecha : `date` Usuario : $LOGNAME' Fecha : `date` Usuario : $LOGNAME en este ejemplo vemos que no se hace la sustitucin de comando , ni de variable

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

15

3.3 - Comillas dobles : " "


Eliminan el significado de todos los caracteres especiales excepto : $, ` `, " ". echo "Fecha : `date` Usuario : $LOGNAME" Fecha: Tue Apr 24 18:39:22 EDT 1995 echo "Mi directorio de casa es : $HOME" Mi directorio de casa es : /home/curso1 echo "Mi directorio actual es: `pwd`" Mi directorio actual es: /home/curso1/shell

3.4 - Diagonal invertida : \


Elimina el significado especial del siguiente carcter. echo " Esta es \ una sola\ lnea" Esta es una sola lnea La solucin a un problema puede ser de varias formas, lo recomendable es escoger la solucin mas simple. echo "Caracteres Especiales: \( \;\), \(\>\), \(\<\), y \(\&\) Caracteres Especiales: ( ; ), (>), (<), y (&) echo 'Caracteres Especiales: (;), (>), (<), y &' Caracteres Especiales: ( ; ), (>), (<), y &

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

16

4 - Comandos

El termino comando es muy utilizado en UNIX, y este se puede referir a:

4.1 - Comando Simple


Es una secuencia de palabras separadas por blancos o tabuladores. La primer palabra normalmente es el nombre del comando a ejecutar, las siguientes son sus argumentos y la redireccin de archivos. ls -l > lista

4.2 - Entubamiento (pipeline)


Un pipeline permite la conexin seriada de varios comandos, esto significa que la salida de un comando es la entrada del siguiente. El sistema operativo sincroniza las operaciones de entrada/salida suspendiendo la ejecucin de un comando, si la entrada del receptor se encuentra saturada o bien si la salida de un comando ya se encuentra vaca. El status de salida es el del ultimo comando ejecutado. sort arch | pr 3 h Diccionario | lp

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

17

4.3 - Lista de Comandos


Es una cadena de comandos los cuales pueden estar separados por ;, &, &&, o || y terminados por ; o &. El significado cada uno de los smbolos anteriores es: ; Permite la ejecucin de varios comandos sincronos en una misma lnea. ls -l > reporte ; ps -ef >> reporte Lo usual es utilizar newlines como separador en lugar de ;. ls -l > reporte ps -ef >> reporte & Genera un proceso asncrono (background) con el comando o programa que le precede. find . -print > archivo & ls -l || Es un OR lgico que maneja el status de salida de cada proceso. Si la ejecucin de un proceso regresa un cdigo de retorno diferente de cero, se ejecuta el siguiente proceso y as sucesivamente. ls -l xx || ls -l yy || ls -l arch || ls -l arch1 && Es un AND lgico que maneja el status de salida de cada proceso. Si la ejecucin de un proceso regresa un cdigo de retorno igual a cero, se ejecuta el siguiente proceso y as sucesivamente. ls -l arch && ls -l xx && ls -l yy && ls -l arch1 El shell evala la lista de comandos de izquierda a derecha, los smbolos || y && tienen igual precedencia, pero menor a ; y &, en el siguiente ejemplo toda la lista de comandos se ejecuta en background. ls -l > lista && date >> lista &

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

18

4.4 - Agrupacin de listas de comandos.


La ejecucin de varios comandos, se puede manejar como una cadena y delimitarse con parntesis o llaves, esto hace que shell los interprete como un solo comando, por lo tanto, la salida de ellos se redirecciona solo una vez al archivo correspondiente. (cat arch1 || cat arch2 || cat arch3) 2>/dev/null (ls; who; date) > reporte { ls; who; date; } > reporte NOTA: Las llaves deben separarse con espacios, y el ultimo comando tambien debe llevar ; al final Los parntesis y llaves se interpretan como agrupacin solo si aparecen al inicio de la lnea, esto es decir que no haya otro carcter diferente a espacio antes de ellos En la agrupacin el smbolo ; puede sustituirse por nueva-linea, esto le da mayor claridad a una agrupacin compleja. (ls who date) > reporte { ls who date; } > reporte NOTA: Las llaves deben separarse con espacios Los parntesis obligan la generacin (spawn) de un subshell donde se ejecutan los comandos definidos, las llaves ejecutan los comandos definidos dentro del mismo shell. El status de salida siempre es el del ultimo comando ejecutado.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

20

5.2 - Secuencia de bsqueda.


Cuando un usuario teclea un comando, lo recibe el interprete de shell, y realiza una bsqueda en el orden siguiente y finalmente lo ejecuta, s es que lo encuentra. 1- Busca si es un comando built-in, o sea que este interconstruido en el sistema operativo, es decir que reside en memoria. (Ver comando type) 2- Busca si es una funcin, estas se encuentran en el medio ambiente del usuario, .y se comportan como un comando interconstruido. 3- Busca el comando utilizando el path absoluto o relativo dado en la linea de ejecucin: Path absoluto: Path relativo /u/contabilidad/progs/mxacc10 ../../progs/mxacc10

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

21

5.3 - Tabla de hash.


Todo comando que se ejecuta implica una bsqueda previa del mismo, esta tabla registra los comandos encontrados y sus rutas con el fin de agilizar su ejecucin la prxima vez. Esta tabla se inicializa al momento de iniciar la sesin de trabajo y no se puede guardar para futuras sesiones. El contenido de la tabla varia entre Bourne Shell y Korn Shell ambos se muestran a continuacin: ---------Bourne--------hits cost command 3 2 /usr/bin/df 1 3 /usr/bin/date 3 4 /usr/bin/pwd hits cost -------Korn------cost command 2 /usr/bin/df 3 /usr/bin/date 4 /usr/bin/pwd

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

6.2 - Cambio de directorio

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

23

6.3 - Desplegar mensaje

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

- Envo de informacin hacia un archivo, simulando la grabacin de un registro.


echo "'Ricardo Torres' 'Hidalgo 15' 'Col. Vistahermosa'" >> arch

- 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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

6.4 - Opcin de despliege

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

sgr0 Vdeo normal bell Sonido

NOTA: La disponibilidad de estas opciones depende el emulador e terminal, y/o versin el sistema operativo que se esta usando.

6.5 - Terminacin del shell

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

25

6.6 - Directorio de trabajo

pwd

Despliega la rut absoluta (path absoluto) del directorio actual.

6.7 - Cambio de grupo

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

6.8 - Tipo de comando

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

26

6.9 - Limite de archivo

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

28

7.2 - File Descriptors (Descripcin de archivos)


En Unix los nombres de los archivos se asocian a un numero, el cual se conoce como file descriptor, y es mediante este nmero que los comandos y programas hacen referencia a los archivos. Los smbolos de redireccionamiento son: < > Entrada, indica al comando de donde debe tomar el archivo de entrada. Salida, indica al comando en que archivo debe dejar la salida, si el archivo existe borra su contenido actual antes de dejar la nueva informacin, si el archivo no existe lo crea. Adicin, indica al comando en que archivo debe agregar la informacin, mantiene la informacin original del archivo, si el archivo no existe, lo crea.

>>

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

NOTA: No debe haber espacios en la definicin de la redireccin. 3<&0

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

29

7.3 - Archivo nulo.


En ocasiones no interesa guardar la informacin enviada por un comando, lo normal es recibirla en un archivo y despus borrarlo, sin embargo existe en UNIX un archivo especial para estos casos: /dev/null este es un archivo especial cuya caracterstica es que todo lo que recibe no se graba en archivo alguno, sino que se pierde. find / -name arch -print 2>/dev/null

7.4 - Apertura y cierre implcito de archivos.


Cuando en la lnea de ejecucin de un comando o programa se liga un file descriptor a un archivo fsico, se dice que la apertura es implcita y el archivo se cierra tambin implcitamente al terminar la ejecucin. Lo anterior no permite abrir y cerrar el archivo varias veces durante el proceso. ls -l arch1 xyz 1>bueno 2>malo vi programa cat 0<&3 1>&5 cat 0<&4 1>&5 ZZ programa 3<bueno 4<malo 5>todo

7.5 - Apertura y cierre explcito de archivos.


La liga de un file descriptor a un archivo fsico se puede hacer dentro del programa, a esto se le llama apertura explcita, de igual manera de puede programar el cierre explcito del archivo. Esto nos permite abrir y cerrar los archivos varias veces dentro de un mismo programa, y lo que es mas, cambiar el archivo fsico de un file descriptor en la misma ejecucin. exec 3<arch1 exec 4>arch2 ......................... ......................... 3<&4>&# Apertura explcita del archivo de entrada # Apertura explcita del archivo de salida # Cierre explcito # Cierre explcito

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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 .*

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

34

9.3 - Asignacin con sustitucin de comando


La asignacin de valor a una variable, puede incluir el resultado de la ejecucin de un comando, a esto se le conoce como sustitucin de comando(s),los comandos a ejecutarse deben encerrarse entre acentos graves ` `. a=`date` echo $a Mon Jan 23 10:36:15 EDT 1997 los comandos pueden incluir metacaracteres. a=`echo *` echo $a ... ... ... ... ... ....... ... lista de nombres contenidos en el directorio El valor a asignar a una variable puede contener ademas de sustitucion de comando, variables y/o cadenas de caracteres, en este caso se requiere el uso del encomillado. a="Usuarios firmados: `who | wc -l` "

9.4 - Lectura de valores.


El comando read lee de la entrada estandar, y asigna lo ledo a las variables proporcionadas como argumento en la lnea de ejecucin del read. read variable1 variable2 .......... variablen

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

Ing. Juan Gabriel Franco Delgado

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

9.5 - Eliminacin de variables.


Una variable se puede eliminar del medio ambiente por medio del comando: unset a b c

9.6 - Parmetros Posicionales.


A un programa de shell se le puede proporcionar argumentos en la misma lnea en que se invoca su ejecucin. El nombre del comando y sus argumentos se colocan en unas variables llamadas parmetros posicionales, esto facilita el manejo dentro del programa de cada uno de los argumentos o parametros, pues se manejan como variables independientes. Aun cuando el numero de parmetros posicionales puede ser mayor a 256, solo se tiene acceso en un momento dado a diez valores, el primer valor siempre contiene el nombre del comando. 0 comando 1 arg1 2 arg2 3 arg3 4 arg4 5 arg5 6 arg6 7 arg7 8 arg8 9 arg9

el acceso a estos se valores se hace mediante el formato de sustitucin de variable.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix echo $1 $2 $3 .........$9

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:

Ing. Juan Gabriel Franco Delgado

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:

9.7 - Asignacin a parmetros posicionales.


A los parmetros posicionales se les puede dar un valor especifico: que puede ser el resultado de ejecutar un comando. set arg1 arg2 arg3 ...................argn o bien el resultado de ejecutar una sustitucin de comando: set `comando`

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

39

9.8 - Desplazamiento de parmetros posicionales

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

40

9.9 - Variables predefinidas.


Existen otras variables dentro del medio ambiente del usuario, stas no se pueden alterar directamente, para hacer referencia a su valor se usa la misma notacin de las otras variables. $# Indica el numero de parmetros posicionales que tienen valor, no se incluye a $0, al inicio de un programa contiene el nmero de parmetros recibidos, sin embargo ya dentro de este, el usuario puede alterar el nmero de parmetros posicionales con valor, por lo tanto se altera el valor de la variable. prog uno dos tres echo $# 3 $? Contiene el status de salida del ultimo comando o programa ejecutado. ls -l echo $? 0 $$ Contiene el nmero de identificacin del proceso padre, ste es nico y no se repite, por lo tanto es una excelente identificacin para crear archivos de trabajo (temporales) para cada usuario, aun cuando ejecuten el mismo programa. who | wc -l > /tmp/tmp$$ $! Contiene el numero de identificacin del ultimo proceso enviado a background (asncrono). Muestra los nombres de las banderas activas.

$-

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

41

9.10 - Variables de ambiente.


Cada sesin de shell tiene su medio ambiente, dentro de ste existen variables, las cuales influyen de manera importante en la ejecucin de los procesos. CDPATH ERRNO FCEDIT HOME IFS LANG LINENO LOGNAME MAIL MAILCHECK MAILMSG NLSPATH ODMDIR PATH PPID PS1 PS2 PS3 PS4 PWD Contiene los directorios que utiliza el comando cd. Cdigo de error de la ultima llamada al sistema. Editor default /bin/ed Directorio de casa (default). Separadores (espacio, tabulador, newline) Lenguaje actual. Numero de lnea actual dentro de un programa shell. Nombre del usuario Archivo receptor del correo. Intervalo de segundos para checar la existencia de correo nuevo. Mensaje para el usuario, cuando se detecta correo nuevo. Directorio para manejo del lenguaje nacional. Directorio que contiene la base de datos objrepos. Ruta para la bsqueda de comandos y programas. Numero del proceso padre del actual. Prompt primario. Prompt secundario. Prompt del select, utilizado en la creacin de mens. Prompt para el debug (set -x). Directorio actual de trabajo.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix RANDOM SECONDS SHELL TERM TZ

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.

9.11 - Evaluacin forzada

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

43

10 - In-line Documents (Here Documents)


Permite la generacin de documentos a partir de un "documento muestra", este puede contener variables, sustitucin de comandos, etc., la programacin de esta generacin puede formar parte de un programa de shell. comando <<delimitador ................... comandos o texto a ser incluido ................... delimitador El comando utilizado fuera de los delimitadores debe tener como entrada de default el standard input, por lo tanto todo el texto y comandos contenidos dentro de los delimitadores se toman como la entrada al comando principal. cat <<LIMITE Este es un ejemplo de texto manejado por: In-line documents en este texto se puede incluir manejo de metacaracteres, variables y sustitucin de comandos, estos ltimos dos conceptos se vern en leccin posterior. LIMITE S el delimitador va precedido por el signo -, en la salida se eliminan los espacios a la izquierda, as como los tabuladores. cat <<-LIMITE Esta lnea contiene espacios a la izquierda y esta otra tabuladores. LIMITE en este ejemplo la salida es: Esta lnea contiene espacios a la izquierda y esta otra tabuladores.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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).

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

46

11.3 - Salida de Funcin.


Una funcin termina al ejecutarse todo el cdigo o bien mediante la instruccin return [n] que es similar al estatus de salida, y sigue las mismas reglas del comando exit. La ejecucin de una funcin no genera un subshell, por lo tanto cualquier cambio al medio ambiente permanece aun despus de terminada la funcin, por ejemplo: - Cambio de directorio. - Cambio a la mascara de creacin. umask. - Cambio al tamao mximo de un archivo. ulimit. - Creacin, activacin, desactivacin o exportacin de variables. - Cambio de valor a los parmetros posicionales por medio de set o shift. - Cambio en el valor de las variables. Si se usa el comando exit dentro de una funcin, el resultado es la cancelacin de la funcin y del shell que la contiene,

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

12.1 - Ambiente local.


Esta formado por las variables que solo le interesan al shell (proceso) actual, y por default se incluyen todas las variables creadas. En caso de generar un subshell estas variables no se conocen en el nuevo shell. Para ver el contenido del medio ambiente local, se ejecuta el siguiente comando sin argumentos: set

12.2 - Ambiente Global.


Esta formado por las variables que interesan a este shell y a los siguientes subshells, para ver el contenido del ambiente global se ejecuta el siguiente comando sin argumentos: env

12.3 - Exportacin de Variables.


Una variable local se convierte en variable global por medio del comando: export varible-1 variable-2 variable-3 ......... variable-n

12.4 - Consideraciones de exportacin .


- Todas las variables no exportadas, se consideran variables locales y no se conocen en los subshells. - Las variables exportadas, sus caracteristicas y sus valores se copian a los subshells, donde se pueden modificar. Estos cambios no afectan el valor de las variables en el shell padre. - Una variable se puede exportar aun antes de existir.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

48

12.5 - Variables solo de lectura.


Una variable se puede definir solo de lectura, esto previene la alteracin accidental, en este caso la variable existe mientras exista el shell donde se defini. readonly var-1 var-2 var-3 .......... var-n todo intento de modificacin da como resultado el mensaje: var3: is read only Este atributo no se exporta, por lo tanto las variables se pueden alterar en los subshells. La consulta de variables readonly en el medio ambiente local, se hace as: readonly

12.6 - Parmetros keyword


Se puede crear un medio ambiente especifico solo para la ejecucin de un programa, este se define en la misma lnea de ejecucin del programa. A esta estructura especial se la llama parmetros keyword. var1=valor1 var2=valor2 programa [ argumentos] Los nombres de las variables pueden ya existir en el ambiente local o global, sin embargo bajo este formato no sufren modificaciones en su valor, la nica restriccin es que no sean readonly.

12.7 - Inhibicin de ambientes.


Las variables contenidas en los ambientes local y global, se pueden alterar o inhibir momentneamente solo para ejecucin de un comando o programa. El siguiente comando crea el medio ambiente deseado en la misma lnea de ejecucin. env - var1=valor1 var=valor2 programa arg1 arg2 .... argn Este formato es muy parecido al de keyword, solo que el este caso existe la opcin de inhibir completamente el ambiente global y local, esta inhibicin dura solo durante la ejecucin del comando y se hace mediante el smbolo del guin - despus del comando env.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix s1 = s2 s1 != s2 s1 n1 -eq n2

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

53

14.2 Condicional multiple


Los arreglos complejos de if, se simplifican utilizando el comando case. case $variable in patron-1) comando comando comando;; comando comando comando;; ................;; lista de comandos;;

patron-2)

p.............) patron-n) esac

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. ;; ;;

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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 ]

15.2 Condicion Verdadera


Sustituye a una expresin a evaluar, siempre regresa un valor de verdadero. Se usa para hacer ciclos infinitos. while true do lista de comandos done # true genera un subshell

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

55

15.3 Ciclo negativo


Es muy similar al comando while, solo que la lista de comandos se ejecuta solamente que el resultado de la evaluacin sea diferente de cero. until [ expresin a evaluar ] do lista de comandos done Al inicio del ciclo primero se hace la ejecucin y luego la evaluacin de la expresin.

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

15.5 Rompimiento parcial de un ciclo


La instruccin continue obliga que se inicie el siguiente ciclo (while, until, for), independientemente del avance del ciclo actual.

15.6 Rompimiento total de un ciclo


La instruccin break cancela la ejecucin de ciclos (while, until, for ) y continua con los comandos que siguen fuera del ciclo.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

57

15.7 - Lectura de archivos. ( No aplica en Linux )


El comando line opera de una manera similar al comando read (no en Linux), ambos leen de la entrada estandar, sin embargo difieren en el manejo de la informacin recibida, ya que el comando line la enva a la slida estandar, mientras que el comando read la asigna a la(s) variable(s) contenida(s) en la lnea de ejecucin. Ejemplos Usando read Usando line ___________________________________________________ exec 3<archivo1 exec 4>archivo2 while read variable <&3 do eval set -- $variable echo $*>&4 done exec 3<archivo1 exec 4>archivo2 while variable=`line <&3` do eval set -- $variable echo $*>&4 done

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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}

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

16-17 El significado de estas seales lo define el usuario.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix expresin1 { +, - } expresin2

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

Ing. Juan Gabriel Franco Delgado

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix ----expr petrleos : .*\(...s\) leos

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

scale=10 100/3 33.3333333333 quit Salir de bc

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

70

18.4 typeset ( No aplica en Linux )


Este comando pertenece a Korn Shell y permite definir una variable de tipo entero (no en Linux), lo cual facilita su manejo en las operaciones aritmticas. typeset -i num num=20*3 echo $num 60 El comando typeset tiene el alias integer, el cual realiza la misma funcin de definir una variable de tipo entero. integer num num=33*3 echo $num 99 Una variable no definida como entera, la considera Korn Shell como tipo carcter (string).

18.5 - Arreglo de variables.


Otra caracterstica de Korn Shell permite que un grupo de variables se agrupen dentro de una misma, sin perder su identidad, a esto se le conoce como arreglo de variables. A cada variable se le denomina elemento y mediante un ndice se hace referencia a cada uno de ellos. El primer ndice es el 0, y el lmite mximo de elementos es de 512, an cuando algunas versiones de Unix soportan ms. elemento[0]=uno elemento[1]=dos elemento[2]=tres elemento[3]="cuatro cinco" Todo un arreglo se puede definir de tipo entero, mediante el comando typeset. typeset -i elemento[20]

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

19.1 - Suspensin de trabajo ( ^z)


Un trabajo (job) en ejecucin en foreground se suspende mediante la combinacin de las teclas control-z, y lo enva a background, por lo tanto se libera el teclado y permite la entrada de otros comandos. sleep 60 ^z [1] + PID

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"

19.2 Consulta de trabajos en background

jobs

Muestra los trabajos (jobs) en background, an cuando estn suspendidos, la lista la muestra en orden ascendente de nmero de trabajo ( job).

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

73

19.3 Reactivacin de un proceso en background

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

19.4 Reactivacin de un proceso en foreground

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

74

19.5 - Coprocesos (|&) (No en Linux)


Hasta ahora el pipe "|" nos ha permitido encadenar comandos, haciendo que la salida de uno (slida estandar) sea la entrada de otro (entrada estandar), por lo tanto el envo de informacin es en una sola direccin. Ahora mediante el manejo de coprocesos podemos enviar informacin a la entrada estandar de un comando y leer su slida estandar, sta ultima informacin la recibe de regreso el comando original. El operador |& inicia la ejecucin de un coproceso, el cul siempre se realiza en background. El coprocesamiento implica la redireccin de la entrada y salida estandar, por lo que no se deben usar los smbolos tradicionales de redireccionamiento, sin embargo si se puede redireccionar la slida de error estandar. El envo de informacin al coproceso se hace mediante la instruccin: print -p "variable1 variable2 ..... variablen" y el regreso de informacin desde el coproceso se hace mediante la instruccin: read -p " var1 var2 ..........varn"

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

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.

20.1 - Banderas de ejecucin


Se activan o desactivan en la lnea de comandos del shell, o bien dentro de un programa, mediante las instrucciones: set -flag set +flag Activa la bandera indicada Desactiva la bandera indicada

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.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix -n (no ejecucin) No en Linux

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 ">|".

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Sistema Operativo Unix

Programacin Shell

77

20.2 - Banderas de invocacin.


Estas banderas se activan al momento de invocar un nuevo shell y no se modifican mediante la instruccin set. -c comando Esta bandera abre un nuevo shell para ejecutar el comando indicado, al terminar la ejecucin del comando tambien se termina el shell. su - usuario -c comando o programa ksh -c programa -t (temporal) Esta bandera le indica al shell, que solo tiene la capacidad de ejecutar un comando, e inmediatamente terminar la sesin. Esta bandera esta implcita en la bandera -c. -r (restringido) Se crea un ambiente con las siguientes restricciones: - No se pueden modificar las variables ENV y PATH - La referencia a un archivo no debe contener la diagonal /, esto limita el acceso del usuario solo a los archivos de su directorio. - No se puede usar el comando cd, esto evita al usuario el acceso a otros directorios. - No se permite el redireccionamiento de salida mediante los operadores >, <, >|, >>.

Ing. Juan Gabriel Franco Delgado

genesys@prodigy.net.mx

(4)2-20-53-21

Das könnte Ihnen auch gefallen