Man Shell

119
SISTEMA OPERATIVO PROGRAMACIÓN SHELL

Transcript of Man Shell

Page 1: Man Shell

SISTEMA OPERATIVO

PROGRAMACIÓN

SHELL

Ing. Juan Gabriel Franco DelgadoFebrero 2002

Page 2: Man Shell

Sistema Operativo Unix Programación Shell 2

Prefacio

Una de las características sobre las que radica el poderío del sistema operativo UNIX, es la interface con el usuario, la cual actúa 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 programación. Todo usuario mantiene una constante interacción con el shell, un conocimiento amplio del mismo mejoraran significativamente la productividad.

Este curso dará las herramientas necesarias y prácticas, para utilizar efectivamente la programación 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 [email protected] (4)2-20-53-21

Page 3: Man Shell

Sistema Operativo Unix Programación Shell 3

INDICE

1 - Introducción 8

1.1 Características de shell 81.2 Usos de la programación shell 91.3 Ventajas de la programación shell 91.4 Ejecución en shell 10

2 - Procesos UNIX 11

2.1 Conceptos de parent, child, fork, exec, wait, spawn. 112.2 Inmunidad a interrupción. 122.3 Medio ambiente original. 122.4 Archivos estandar 13

3 - Mecanismos de encomillado. 14

3.1 Caracteres especiales 143.2 Comillas simples. 143.3 Comillas dobles. 153.4 Diagonal invertida 15

4 - Comandos 16

4.1 Comando simple 164.2 Entubamiento (pipeline) 164.3 Lista de comandos 174.4 Agrupación de listas de comandos 18

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 4: Man Shell

Sistema Operativo Unix Programación Shell 4

INDICE (cont)

5 - Ejecución 19

5.1 Secuencia de interpretación 195.2 Secuencia de búsqueda 205.3 Tabla de hash hash 21

6 - Comandos Interconstruidos 22

6.1 Comentario # 226.2 Cambio de directorio cd 226.3 Desplegar mensaje echo 236.4 Opción de despliegue tput 246.5 Terminación del shell exit 246.6 Directorio de trabajo pwd 256.7 Cambio de grupo newgrp 256.8 Tipo de comando type 256.9 Limite de archivo ulimit 26

7 - Redirección de Archivos 27

7.1 Redirección 277.2 File Descriptors (descripción de archivos) 287.3 Archivo nulo 297.4 Apertura y cierre implícito de archivos 297.5 Apertura y cierre explícito de archivos 29

8 - Lista de Argumentos 30

8.1 Metacaracteres 30

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 5: Man Shell

Sistema Operativo Unix Programación Shell 5

INDICE (cont)

9 - Variables 32

9.1 Creación de variables 329.2 Asignación 339.3 Asignación con sustitución de comando 349.4 Lectura de valores read 349.5 Eliminación de variables unset 359.6 Parámetros posicionales 359.7 Asignación a parámetros posicionales set 379.8 Desplazamiento de parámetros posicionales shift 399.9 Variables predefinidas 409.10 Variables de ambiente 419.11 Evaluación forzada eval 42

10 - In-line documents (Here documents) 43

11 - Funciones 45

11.1 Definición 4511.2 Manejo 4511.3 Salida de función 4611.4 Restricciones 46

12 - Medio Ambiente 47

12.1 Ambiente local set 4712.2 Ambiente global env 4712.3 Exportación de variables export 4712.4 Consideraciones de exportación 4712.5 Variables solo de lectura readonly 4812.6 Parámetros keyword keyword 4812.7 Inhibición de ambientes env 48

13 - Comando test 49

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 6: Man Shell

Sistema Operativo Unix Programación Shell 6

INDICE (cont.)

14 - Condicionales 51

14.1 Condicional if 5114.2 Condicional multiple case 53

15 - Ciclos 54

15.1 Ciclo positivo while 5415.2 Condición verdadera true : 5415.3 Ciclo negativo until 5515.4 Iteración for 5515.5 Rompimiento parcial de un ciclo continue 5615.6 Rompimiento total de un ciclo break 5615.7 Lectura de archivos line read 57

16 - Sustitución condicionada 58

17 - Manejo de señales 60

17.1 Señales 6017.2 Captura de señales trap 61

18 - Aritmetica 63

18.1 Calculo aritmético y extracción de cadenas expr 6318.2 Calculo aritmetico let 6818.3 Calculadora binaria bc 6918.4 Definición de variables typeset 7018.5 Arreglo de variables 70

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 7: Man Shell

Sistema Operativo Unix Programación Shell 7

INDICE (cont.)

19 - Control de trabajos 72

19.1 Suspensión de trabajo ^Z 7219.2 Consulta de trabajos en background jobs 7219.3 Reactivación de un proceso en background bg 7319.4 Reactivación de un proceso en foreground fg 7319.5 Coprocesos |& 74

20 - Banderas de Ejecución 75

20.1 Banderas de ejecución 7520.2 Banderas de invocación 77

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 8: Man Shell

Sistema Operativo Unix Programación Shell 8

1 - Introducción

El shell es un programa que recibe las ordenes del usuario y las traduce en instrucciones internas para el sistema. Su nombre shell (caparazón) describe realmente su función: es un material duro que cubre al núcleo 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 más potentes y elegantes del Sistema Operativo UNIX.

1.1 - Características de shell.

Las principales son:

- Manipulación de cadenas variables.

- Estructuras de control de flujo tales como: if, for, while y until.

- Comunicación entre procesos por medio de: señales, argumentos y status de salida.

- Manejo de archivos.

- Generación de lista de argumentos.

- Manejo de funciones.

El shell standard fue creado por Steve Bourne, es relativamente pequeño y de propósito general. Sobre las carencias de éste, se desarrollo el C Shell, y posteriormente David Korn desarrollo su propia versión, la cual mejora a las dos anteriores.

Shell tiene sus propias herramientas de programación, y estas se enriquecen con todos los comandos de unix, de aquí el poderío de la programación shell.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 9: Man Shell

Sistema Operativo Unix Programación Shell 9

1.2 - Usos de la programación shell.

Los mas comunes son:

1.- Simplificar la ejecución de comandos muy complejos y evitar así la posibilidad de error en la ejecución.

2.- Ejecutar una serie de tareas dependientes entre si.

3.- Personalizar el nombre de los comandos más usados por usuario.

4.- Crear menús para las aplicaciones de usuario, operación, etc.

1.3 - Ventajas de la programación shell.

Los programas en shell no requieren ser compilados por lo que su creación, manejo y depuración es una gran ventaja para los usuarios.

Las ventajas de la programación shell las podemos resumir en:

1.- Poderoso lenguaje de programación.

2.- Fácil de escribir y depurar.

3.- Fácil de entender y modificar.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 10: Man Shell

Sistema Operativo Unix Programación Shell 10

1.4 - Ejecución 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 ejecución; por lo tanto se genera un subshell: sh programa

ksh programa

2.- Por medio de la orden ".", la ejecución 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 ejecución el proceso que queda vigente (si existe) es el padre actual

exec programa

4.- Otorgando el permiso correspondiente de ejecución:

chmod +x programa programa

5.- Utilizando la “sustitución de comando”, que es la ejecución de un comando dentro de otro comando :

echo `cat lista`

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 11: Man Shell

Sistema Operativo Unix Programación Shell 11

2 - Procesos UNIX

Un proceso es la ejecución de un programa UNIX, e incluye todo el código del programa y los datos requeridos para la ejecución 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 identificación (id) del proceso hijo, y al hijo le envía un cero, esto indica que se esta ejecutando como proceso hijo.

La ejecución por medio de exec causa la sustitución 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 ejecución del proceso hijo, el control no regresa al proceso padre, pues este ya no existe.

Al momento de terminar un proceso hijo, envía al padre un código de retorno, el cual tiene un valor numérico, a este se le llama "status de salida". Una terminación exitosa regresa siempre un cero, y una terminación fallida regresa cualquier otro valor.

Normalmente despues de la instrucción fork el proceso padre ejecuta la instrucción wait, con esto se suspende la ejecución del proceso padre hasta que termine la ejecución del proceso hijo. La continuación del proceso padre se puede condicionar al código de retorno del proceso hijo.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 12: Man Shell

Sistema Operativo Unix Programación Shell 12

Un proceso padre que espera por la terminación del proceso hijo se le conoce como proceso síncrono (ejecución en foreground), al proceso que no espera la terminación del proceso hijo se le conoce como proceso asíncrono (ejecución en background).

Al terminar o cancelar la ejecución de un proceso padre, automáticamente termina la ejecución de todos los procesos hijos.

El shell utiliza las llamadas al sistema fork y exec para la ejecución 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 ejecución de otro shell, a este nuevo proceso se le llama subshell.

La ejecución de un programa simple de shell puede involucrar la ejecución de varias llamadas fork y exec.

2.2 - Inmunidad a interrupción.

Por medio del comando nohup es posible generar un proceso hijo inmune a la cancelación del proceso padre, es decir el proceso continua, aún cuando el usuario de por terminada la sesión 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 ejecución y terminación 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 ejecución del proceso hijo.

- Environment

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

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 13: Man Shell

Sistema Operativo Unix Programación 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 estándar

El sistema operativo unix maneja solo archivos, es decir que una pantalla, una cinta, un disco, una terminal, etc., se consideran archivos.

Esta característica 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 [email protected] (4)2-20-53-21

Page 14: Man Shell

Sistema Operativo Unix Programación 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 carácter y debe existir.

[ ] Sustituye un juego caracteres o rango, deben existir.

$ Sustitución de variable. Se ve en lección posterior.

` ` Sustitución de comando. Se ve en lección 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 sustitución de comando , ni de variable

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 15: Man Shell

Sistema Operativo Unix Programación 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 carácter.

echo " Esta es \una sola\línea"

Esta es una sola línea

La solución a un problema puede ser de varias formas, lo recomendable es escoger la solución mas simple.

echo "Caracteres Especiales: \( \;\), \(\>\), \(\<\), y \(\&\)

Caracteres Especiales: ( ; ), (>), (<), y (&)

echo 'Caracteres Especiales: (;), (>), (<), y &'

Caracteres Especiales: ( ; ), (>), (<), y &

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 16: Man Shell

Sistema Operativo Unix Programación 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 redirección de archivos.

ls -l > lista

4.2 - Entubamiento (pipeline)

Un pipeline permite la conexión 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 ejecución de un comando, si la entrada del receptor se encuentra saturada o bien si la salida de un comando ya se encuentra vacía.

El status de salida es el del ultimo comando ejecutado.

sort arch | pr 3 –h ”Diccionario” | lp

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 17: Man Shell

Sistema Operativo Unix Programación 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 símbolos anteriores es:

; Permite la ejecución de varios comandos sincronos en una misma línea.

ls -l > reporte ; ps -ef >> reporte

Lo usual es utilizar newlines como separador en lugar de ;.

ls -l > reporteps -ef >> reporte

& Genera un proceso asíncrono (background) con el comando o programa que le precede.

find . -print > archivo & ls -l

|| Es un OR lógico que maneja el status de salida de cada proceso. Si la ejecución de un proceso regresa un código de retorno diferente de cero, seejecuta el siguiente proceso y así sucesivamente.

ls -l xx || ls -l yy || ls -l arch || ls -l arch1

&& Es un AND lógico que maneja el status de salida de cada proceso. Si la ejecución de un proceso regresa un código 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 evalúa la lista de comandos de izquierda a derecha, los símbolos || 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 [email protected] (4)2-20-53-21

Page 18: Man Shell

Sistema Operativo Unix Programación Shell 18

4.4 - Agrupación de listas de comandos.

La ejecución de varios comandos, se puede manejar como una cadena y delimitarse con paréntesis 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 paréntesis y llaves se interpretan como agrupación solo si aparecen al inicio de la línea, esto es decir que no haya otro carácter diferente a espacio antes de ellos

En la agrupación el símbolo ; puede sustituirse por nueva-linea, esto le da mayor claridad a una agrupación compleja.

(ls who date) > reporte

{ ls who date; } > reporte

NOTA: Las llaves deben separarse con espacios

Los paréntesis obligan la generación (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 [email protected] (4)2-20-53-21

Page 19: Man Shell

Sistema Operativo Unix Programación Shell 19

5 - Ejecución

5.1 - Secuencia de interpretación.

Todo comando esta formado por una serie de palabras y símbolos, los cuales se evalúan 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 redirección ( <, >, >>, | ) 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 generación de nombres, mediante la interpretación de los metacaracteres ( *, ?, [ ] ).

ls -l arch*

7- Ejecuta el comando.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 20: Man Shell

Sistema Operativo Unix Programación Shell 20

5.2 - Secuencia de búsqueda.

Cuando un usuario teclea un comando, lo recibe el interprete de shell, y realiza una búsqueda 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 función, 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 ejecución:

Path absoluto: /u/contabilidad/progs/mxacc10

Path relativo ../../progs/mxacc10

4- Busca el comando en la tabla de hash.

5- Busca el comando utilizando los directorios que contiene la variablePATH.

6- Envía mensaje de error

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 21: Man Shell

Sistema Operativo Unix Programación Shell 21

5.3 - Tabla de hash.

Todo comando que se ejecuta implica una búsqueda previa del mismo, esta tabla registra los comandos encontrados y sus rutas con el fin de agilizar su ejecución la próxima vez.

Esta tabla se inicializa al momento de iniciar la sesión 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 continuación:

---------Bourne--------- -------Korn------- hits cost command cost command 3 2 /usr/bin/df 2 /usr/bin/df 1 3 /usr/bin/date 3 /usr/bin/date 3 4 /usr/bin/pwd 4 /usr/bin/pwd

hits - Registra el numero de veces que se ha ejecutado el comando durante la sesión de trabajo del usuario.

cost - El numero de directorios de la variable PATH en los que se realizo la búsqueda .

command - El nombre del comando incluyendo la ruta completa de localización.

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 [email protected] (4)2-20-53-21

Page 22: Man Shell

Sistema Operativo Unix Programación Shell 22

6 - Comandos Interconstruidos

La programación de shell incluye el manejo de todos los comandos de UNIX, sin embargo existen algunos que se recomienda utilizar debido a que son mas rápidos y más eficientes, ya que pueden no generar un nuevo proceso para su ejecución.

6.1 - Comentario #

Permite la inclusión de comentarios dentro de programación, puede ir en cualquier lugar del texto y se considera comentario todo lo que se encuentre a su derecha en la misma línea.

who I wc -l # Determina el número 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 [email protected] (4)2-20-53-21

Page 23: Man Shell

Sistema Operativo Unix Programación Shell 23

6.3 - Desplegar mensaje echo

Permite copiar el argumento dado a la sálida estandar, esta salida al igual que la de cualquier comando se puede redireccionar a otro archivo.

Los usos más frecuentes son:

- Solicitar entrada de datos.

echo "Teclee su nombre: \c" unix

echo "Teclee su nombre: \c" linux

- Envío de mensajes de error o preventivos dentro de un programa.

echo "Respuesta invalida. Reintente" unix

- Envío de información hacia un archivo, simulando la grabación de unregistro.

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

- Verificar la expansión 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 opciòn –e o –n ) :

\b backspace, regresa el cursor un espacio.

\c No enviar new-line al final de la copia.

\n New-line

\t Tabulador Horizontal

\a Alarma

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 24: Man Shell

Sistema Operativo Unix Programación 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 - Opción de despliege tput

Este comando en combinación con echo nos permite dar más presentación a las pantallas, mediante las opciones:

blink Parpadeo

bold Remarcado

rev Vídeo inverso

sgr0 Vídeo normal

bell Sonido

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

6.5 - Terminación del shell exit

Termina la ejecución de un programa, comando o shell y permite regresar al shell padre un código de retorno especifico.

exit [n]

La ejecución directa en el prompt de shell obliga la terminación del shell.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 25: Man Shell

Sistema Operativo Unix Programación 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 envían 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 algún directorio del sistema.

type pwd cd ls df

pwd is a shell builtincd is a shell builtinls is /usr/bin/lsdf is /usr/bin/df

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 26: Man Shell

Sistema Operativo Unix Programación Shell 26

6.9 - Limite de archivo ulimit

Permite fijar un limite máximo 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 administración del espacio en disco.

ulimit [n]

El tamaño del bloque lógico 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 tamaño, 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 [email protected] (4)2-20-53-21

Page 27: Man Shell

Sistema Operativo Unix Programación Shell 27

7 - Redirección de Archivos

7.1 - Redirección.

Todos los comandos de UNIX por estándar manejan los siguientes tres archivos:

0 = Entrada Estandar Teclado

1 = Salida Estandar Pantalla

2 = Salida Error Estandar Pantalla

estos archivos se pueden redireccionar a otros archivos:

tr -d abc <entrada >salida

el comando anterior asume la entrada estandar y la sálida estandar, el comando siguiente muestra explícitamente los archivos de entrada y salida:

tr -d abc 0<entrada 1>salida

otra característica de la redirección 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 [email protected] (4)2-20-53-21

Page 28: Man Shell

Sistema Operativo Unix Programación Shell 28

7.2 - File Descriptors (Descripción 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 número que los comandos y programas hacen referencia a los archivos.

Los símbolos 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 información, si el archivo no existe lo crea.

>> Adición, indica al comando en que archivo debe agregar la información, mantiene la información 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 físico. El & es el símbolo de redireccion de file descriptors.

comando <arch1 >reporte 2>&1 La sálida de error estandar se liga a la entrada estandar

comando <arch1 3<&0 > reporte La entrada estandar se toma de arch1 y el file descriptor 3 se liga a la entrada estandar.

La evaluación del comando se hace de izquierda a derecha, esto se debe tener en cuenta al momento de hacer la redirección de los file descriptors, de no hacerlo se obtienen resultados diferentes a los deseados.

comando <arch1 2>&1 >reporte ERROR

comando 3<&0 <arch1 >reporte ERROR

NOTA: No debe haber espacios en la definición de la redirección. “3<&0”

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 29: Man Shell

Sistema Operativo Unix Programación Shell 29

7.3 - Archivo nulo.

En ocasiones no interesa guardar la información enviada por un comando, lo normal es recibirla en un archivo y después borrarlo, sin embargo existe en UNIX un archivo especial para estos casos:

/dev/null

este es un archivo especial cuya característica 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 implícito de archivos.

Cuando en la línea de ejecución de un comando o programa se liga un file descriptor a un archivo físico, se dice que la apertura es implícita y el archivo se cierra también implícitamente al terminar la ejecución. Lo anterior no permite abrir y cerrar el archivo varias veces durante el proceso.

ls -l arch1 xyz 1>bueno 2>malovi programa

cat 0<&3 1>&5cat 0<&4 1>&5

ZZprograma 3<bueno 4<malo 5>todo

7.5 - Apertura y cierre explícito de archivos.

La liga de un file descriptor a un archivo físico se puede hacer dentro del programa, a esto se le llama apertura explícita, de igual manera de puede programar el cierre explícito 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 físico de un file descriptor en la misma ejecución.

exec 3<arch1 # Apertura explícita del archivo de entradaexec 4>arch2 # Apertura explícita del archivo de salida..................................................3<&- # Cierre explícito4>&- # Cierre explícito

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 30: Man Shell

Sistema Operativo Unix Programación 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 creación 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 carácter, 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 alfabético, cada uno de estos caracteres se maneja en forma individual.

ls -l [aeiou]file # Juego de caracteres

ls -l [a-g]file # Rango alfabético

ls -l file[!1234567890] # Grupo alfabético

NOTA: En este ultimo ejemplo vemos la negación de una condición, mediante el uso del simbolo de admiración “!”.

Para prevenir el conflicto con los archivos . y .. que aparecen en cada directorio, la generación de listas por medio de los metacaracteres no los incluye, por lo que si se desea su inclusión, se utiliza explícitamente en el comando.

ls -l .*

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 31: Man Shell

Sistema Operativo Unix Programación Shell 31

En caso de que al generar una lista Ésta quede vacía, el patrón de generación se toma como argumento del comando.

echo file? # Se asume que el patrón no se encuentra

file? # El comando regresa el patrón como argumento

Un argumento de generación puede tener varias combinaciones de metacaracteres.

echo *[!a-z]

PRECAUCION.

Cuando se van a usar metacaracteres con el comando rm, se recomienda hacer la generación de nombres con otro comando (echo) cuya ejecución no tenga repercusión en caso de error.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 32: Man Shell

Sistema Operativo Unix Programación Shell 32

9 - Variables

9.1 - Creación de variables.

El lenguaje de programación 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 ejecución, 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 símbolo $ al nombre de la variable.

Hay cuatro métodos para manejar variables, ya sea para crearlas o asignarles un valor.

- Asignación directa (=).

- Lectura de valores (read).

- Parámetros posicionales ($0, $1, $2, ...........$n).

- Asignación a parámetros posicionales (set).

El nombre de una variable se forma con la combinación de los caracteres alfabéticos, numéricos y el _, y no debe comenzar con un número.

Todas las variables que se crean quedan en el medio ambiente actual.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 33: Man Shell

Sistema Operativo Unix Programación Shell 33

9.2 - Asignación

Mediante la asignación creamos una variable o bien alteramos el valor de una ya existente, esto se hace mediante el símbolo =, el cual hace la liga lógica entre el nombre de la variable y el valor, no debe haber espacios ni antes ni después del signo =.

a=autoecho $aauto

en una línea de pueden hacerse varias asignaciones separadas por espacios.

a=auto b=movil

el valor de una variable puede ser la concatenación del valor de otras variables.

a=auto b=movil c=$a$becho $cautomóvil

Una variable que se forma con los valores de otras, se puede crear en la misma línea de la asignación, y debe ir del lado derecho.

a=auto b=movil c=$a$becho $cautomóvil

La concatenación puede incluir también una cadena de caracteres, en este caso el nombre de la variable debe ir encerrado entre { },

a=autoc=${a}movilecho $cautomóvil

En la asignación de variables los metacaracteres pierden su valor, y se toman como un carácter individual

a=* NOTA: Valido solo en algunas versiones de Unixb=$aecho $b*

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 34: Man Shell

Sistema Operativo Unix Programación Shell 34

9.3 - Asignación con sustitución de comando

La asignación de valor a una variable, puede incluir el resultado de la ejecución de un comando, a esto se le conoce como sustitución de comando(s),los comandos a ejecutarse deben encerrarse entre acentos graves ` `.

a=`date`echo $aMon 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 leído a las variables proporcionadas como argumento en la línea de ejecución del read.

read variable1 variable2 .......... variablen

La asignación se realiza dependiendo del numero de variables receptoras y el numero de palabras leídas.

Igual número de variables y palabras:

read a bbuenos díasecho $abuenosecho $bdías

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 35: Man Shell

Sistema Operativo Unix Programación Shell 35

Mas variables que palabras:

read a b c buenos díasecho $abuenosecho $bdíasecho $c

<===== la variable c tiene valor nulo

Mas palabras que variables:

read abuenos díasecho $abuenos días

9.5 - Eliminación de variables.

Una variable se puede eliminar del medio ambiente por medio del comando:

unset a b c

9.6 - Parámetros Posicionales.

A un programa de shell se le puede proporcionar argumentos en la misma línea en que se invoca su ejecución. El nombre del comando y sus argumentos se colocan en unas variables llamadas parámetros 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 parámetros 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 1 2 3 4 5 6 7 8 9

comando arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9

el acceso a estos se valores se hace mediante el formato de sustitución de variable.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 36: Man Shell

Sistema Operativo Unix Programación Shell 36

echo $1 $2 $3 .........$9

Para traer el valor de un parámetro posicional cuyo nombre tiene mas de un dígito, es necesario el uso de llaves {..}.

echo ${24} ${45}

Los parámetros posicionales pueden concatenarse con otra variable o bien con una cadena de caracteres, sí el nombre de los parámetros posicionales se limita a un dígito, no es necesario el uso de { } .

echo $1$2$3

En los parámetros posicionales no se permite la asignación directa de valor.

$1=valor <======== ERROR

Para hacer referencia a todos los valores de los parámetros posicionales excepto el cero , usamos los símbolos $* y $@ los cuales permiten manipular en una sola operación todos los valores de los parámetros posicionales.

$@ Se refiere a todos los valores contenidos en los parámetros posicionales, a cada uno lo considera como un valor individual.

"$@" Se refiere a todos los valores contenidos en los parámetros posicionales, a cada uno lo considera como un valor individual.

$* Se refiere a todos los valores contenidos en los parámetros posicionales, a cada uno lo considera como un valor individual.

Ejemplo: Aplica a las tres notaciones anteriores

programa jorge mario martinez

en este caso dentro del programa podemos desplegar la información así:

echo $!echo $2echo $3echo $*

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 37: Man Shell

Sistema Operativo Unix Programación Shell 37

jorgemariomartinezjorge mario martinez

"$*" Esta notación es un caso muy particular, pues todos los valores de los parámetros posicionales se concatenan y se manejan como una sola cadena de caracteres.

Ejemplo: Solo para la notación anterior

programa jorge mario martinez

en este caso dentro del programa podemos desplegar la información así:

echo $1echo $2echo $3echo “$*”

jorge mario martinez Concatena valores en $1$2 esta vacio$3 esta vacio

jorge mario martinez Despliega todos los parámetros posicionales, aunque solo tiene valor $1

9.7 - Asignación a parámetros posicionales.

A los parámetros 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 sustitución de comando:

set `comando`

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 38: Man Shell

Sistema Operativo Unix Programación Shell 38

El comando set permite la asignación de valores a los parámetros posicionales en orden secuencial, comenzando por $1.

set a b c d e f g hecho $4d

set `date`echo $1Mon

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 númerico y negativo, pues el signo - se interpreta como opción del comando. Para evitar este problema se utiliza la notación --, que permite la asignación de valores nulos o que comienzen con el signo -,

set -- -1 -2 -3echo $3 $2 $1-3 -2 -1

El comando set permite el manejo de banderas, por ahora solo mencionamos dos, en lección posterior se ven más 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 depuración de programas, y deben ir al inicio del mismo.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 39: Man Shell

Sistema Operativo Unix Programación Shell 39

9.8 - Desplazamiento de parámetros posicionales shift

Para manejar los parámetros posicionales que siguen del noveno, se utiliza el comando shift, el cual realiza un corrimiento de n parámetros hacia la izquierda, en este corrimiento se pierden los valores anteriores. El valor del parámetro cero no cambia a pesar del corrimiento.

read a b c d e f g h i j k l m n o1 2 3 4 5 6 7 8 9 10 11 12 13 14 15set $a $b $c $d $e $f $g $h $i $j $k $l $m $n $oecho $1 $2 $31 2 3shift 3echo $1 $2 $34 5 6echo $*4 5 6 7 8 9 10 11 12 13 14 15

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 40: Man Shell

Sistema Operativo Unix Programación 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 notación de las otras variables.

$# Indica el numero de parámetros posicionales que tienen valor, no se incluye a $0, al inicio de un programa contiene el número de parámetros recibidos, sin embargo ya dentro de este, el usuario puede alterar el número de parámetros 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 -lecho $?0

$$ Contiene el número de identificación del proceso padre, éste es único y no se repite, por lo tanto es una excelente identificación para crear archivos de trabajo (temporales) para cada usuario, aun cuando ejecuten el mismo programa.

who | wc -l > /tmp/tmp$$

$! Contiene el numero de identificación del ultimo proceso enviado a background (asíncrono).

$- Muestra los nombres de las banderas activas.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 41: Man Shell

Sistema Operativo Unix Programación Shell 41

9.10 - Variables de ambiente.

Cada sesión de shell tiene su medio ambiente, dentro de ‚éste existen variables, las cuales influyen de manera importante en la ejecución de los procesos.

CDPATH Contiene los directorios que utiliza el comando cd.

ERRNO Código de error de la ultima llamada al sistema.

FCEDIT Editor default /bin/ed

HOME Directorio de casa (default).

IFS Separadores (espacio, tabulador, newline)

LANG Lenguaje actual.

LINENO Numero de línea actual dentro de un programa shell.

LOGNAME Nombre del usuario

MAIL Archivo receptor del correo.

MAILCHECK Intervalo de segundos para checar la existencia de correo nuevo.

MAILMSG Mensaje para el usuario, cuando se detecta correo nuevo.

NLSPATH Directorio para manejo del lenguaje nacional.

ODMDIR Directorio que contiene la base de datos objrepos.

PATH Ruta para la búsqueda de comandos y programas.

PPID Numero del proceso padre del actual.

PS1 Prompt primario.

PS2 Prompt secundario.

PS3 Prompt del select, utilizado en la creación de menús.

PS4 Prompt para el debug (set -x).

PWD Directorio actual de trabajo.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 42: Man Shell

Sistema Operativo Unix Programación Shell 42

RANDOM Numero aleatorio entre 0 y 32767.

SECONDS Segundos en la sesión actual de trabajo.

SHELL Shell a usar para los sub-shells.

TERM Tipo de terminal actual.

TZ Zona de tiempo del equipo actual.

La ejecución del comando set sin argumentos, despliega las variables anteriores y sus valores.

9.11 - Evaluación forzada eval

Lee los argumentos de un comando como si fueran de entrada para el shell actual, y esto causa que se obligue la revaluación de una línea dentro de un programa, dicho de otra manera obliga la sustitución de variables y comandos antes de interpretar la redirecci¢n ( <, >, >>, | ).

pipe=”|”who $pipe wc -l

| not foundwc not found-l 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 [email protected] (4)2-20-53-21

Page 43: Man Shell

Sistema Operativo Unix Programación Shell 43

10 - In-line Documents (Here Documents)

Permite la generación de documentos a partir de un "documento muestra", este puede contener variables, sustitución de comandos, etc., la programación de esta generación 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 sustitución de comandos, estos últimos dosconceptos se verán en lección 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 línea contiene espacios a la izquierday esta otra tabuladores.

LIMITE

en este ejemplo la salida es:

Esta línea contiene espacios a la izquierday esta otra tabuladores.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 44: Man Shell

Sistema Operativo Unix Programación Shell 44

Sí el delimitador se encierra entre comillas dobles " ", se inhibe la sustitución de variables, la sustitución de comandos y el significado de los metacaracteres.

cat <<"LIMITE"........................................................................LIMITE

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 45: Man Shell

Sistema Operativo Unix Programación Shell 45

11 - Funciones

11.1 - Definición.

Una función es una colección de comandos definidos dentro de un programa, el formato de una función 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 función.

función () { lista de comandos; }

------------------------------------------------

función (){

comando.................comando

}

La definición de una función se puede hacer en :

- El archivo .profile.

- Al inicio de un programa.

- Directamente en la línea de comando.

11.2 - Manejo.

Los parámetros posicionales se utilizan para pasar argumentos a la función, de la misma manera que en un programa de shell.

función $a $b $c

Cuando el shell se ejecuta coloca en memoria a la función, y la maneja como un comando interconstruido (buit-in).

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 46: Man Shell

Sistema Operativo Unix Programación Shell 46

11.3 - Salida de Función.

Una función termina al ejecutarse todo el código o bien mediante la instrucción

return [n]

que es similar al estatus de salida, y sigue las mismas reglas del comando exit.

La ejecución de una función no genera un subshell, por lo tanto cualquier cambio al medio ambiente permanece aun después de terminada la función, por ejemplo:

- Cambio de directorio.

- Cambio a la mascara de creación. umask.

- Cambio al tamaño máximo de un archivo. ulimit.

- Creación, activación, desactivación o exportación de variables.

- Cambio de valor a los parámetros posicionales por medio de set o shift.

- Cambio en el valor de las variables.

Si se usa el comando exit dentro de una función, el resultado es la cancelación de la función 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 instrucción 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 envía algún mensaje de error.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 47: Man Shell

Sistema Operativo Unix Programación Shell 47

12 - Medio Ambiente

Cada versión 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 - Exportación 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 exportación.

- 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 [email protected] (4)2-20-53-21

Page 48: Man Shell

Sistema Operativo Unix Programación Shell 48

12.5 - Variables solo de lectura.

Una variable se puede definir solo de lectura, esto previene la alteración 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 modificación 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 - Parámetros keyword

Se puede crear un medio ambiente especifico solo para la ejecución de un programa, este se define en la misma línea de ejecución del programa. A esta estructura especial se la llama parámetros 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 restricción es que no sean readonly.

12.7 - Inhibición de ambientes.

Las variables contenidas en los ambientes local y global, se pueden alterar o inhibir momentáneamente solo para ejecución de un comando o programa. El siguiente comando crea el medio ambiente deseado en la misma línea de ejecución.

env - var1=valor1 var=valor2 programa arg1 arg2 .... argn

Este formato es muy parecido al de keyword, solo que el este caso existe la opción de inhibir completamente el ambiente global y local, esta inhibición dura solo durante la ejecución del comando y se hace mediante el símbolo del guión “-” después del comando env.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 49: Man Shell

Sistema Operativo Unix Programación Shell 49

13 - Comando test

Dentro de la programación de shell, para tomar una decisión es necesario evaluar una expresión, esto se hace mediante el comando test, el cual tiene dos formatos:

test expresión

[ expresión ]

Esta evaluación da por resultado uno de dos estatus:

0 Evaluación verdadera

¡0 Evaluación no verdadera

El comando test permite hacer diferentes evaluaciones, a continuación las más 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 grabación para el usuario.

-x file Verdadero si el archivo existe y hay permiso de ejecución para el usuario.

-s file Verdadero si el archivo existe y no esta vacío.

-d file Verdadero si el archivo existe y es directorio.

-f file Verdadero si el archivo existe y es archivo ordinario.

-c file Verdadero si el archivo existe y es tipo carácter.

-b file Verdadero si el archivo existe y es tipo bloque

-p file Verdadero si el archivo existe y es tipo pipe (fifo).

-z s1 Verdadero si la longitud de la cadena s1 es cero.

-n s1 Verdadero si la longitud de la cadena s1 no es cero.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 50: Man Shell

Sistema Operativo Unix Programación Shell 50

s1 = s2 Verdadero si ambas cadenas son iguales

s1 != s2 Verdadero si ambas cadenas son diferentes.

s1 Verdadero si la cadena s1 tiene longitud (no nula)

n1 -eq n2 Verdadero si los enteros n1 y n2 son algebraicamente iguales. Otros operadores que se usan en esta expresión son:

-ne diferente-gt mayor que-ge mayor o igual-It menor que-le menor o igual

Los siguientes operadores se utilizan en combinación con los anteriores:

! Negación, colocado antes de la expresión, invierte el sentido de la pregunta.

[ ! -r file ] Verdadero si el archivo no existe.

-a AND lógico. Permite evaluar más de una expresión 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 lógico. Permite evaluar más de una expresión y el resultado esverdadero 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 paréntesis ( ), 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 expresión test, se deben encerrar entre comillas para prevenir unresultado erróneo.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 51: Man Shell

Sistema Operativo Unix Programación Shell 51

14 - Condicionales

El lenguaje de programación shell provee de comandos de control que permiten condicionar la ejecución de comandos, al resultado de evaluar una expresión.

14.1 – Condicional

Pregunta por la evaluación de una expresión, si es verdadera ejecuta una lista de comandos, si no ejecuta otra.

if expresión a evaluarthen

lista de comandoselse

lista de comandosfi

Nótese que para delimitar el ámbito de if, se usa fi.

echo “Teclee respuesta s/n \c”read respif [ “$resp” = “S” -o “$resp” = “s” -o “$resp” = ”N” -o “$resp” = “n” ]then ................... ...................else echo “Respuesta invalida. Reintente” ................... ....................fi

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 52: Man Shell

Sistema Operativo Unix Programación Shell 52

El comando if permite anidar o encadenar más if´s, 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 expresión a evaluarthen

lista de comandoselif expresión a evaluar

thenlista de comandos

elselista de comandos

fi

------------------------------------------

hora=`date | cut -c12-13`if [ “$hora” -le 11 ]then

echo “Buenos dias”elif [ “$hora” -le 17 ]

thenecho “Buenas tardes”

elseecho “Buenas noches”

fi

No es necesario que el comando if tenga el else y su lista de comandos.

if expresión a evaluarthen

lista de comandosfi

En caso de que la lista de comandos correspondientes al then sea nula, se utiliza el símbolo de dos puntos : en su sustitución .

if expresión a evaluarthen :else

lista de comandosfi

El status de salida es el del ultimo comando ejecutado.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 53: Man Shell

Sistema Operativo Unix Programación 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;;

patron-2) comando comando comando;;

p.............) ................;;

patron-n) lista de comandos;;

esac

El ultimo comando dentro de cada patrón 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 paréntesis. Si el valor de la variable coincide con el patrón, se ejecuta la lista de comandos correspondientes, el ultimo comando de la lista debe terminar con doble punto y coma.

El OR lógico ( | )permite manejar mas de un valor dentro de una condición:

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 instrucción case es el del ultimo comando ejecutado.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 54: Man Shell

Sistema Operativo Unix Programación Shell 54

15 - Ciclos

15.1 – Ciclo positivo.

Permite la ejecución repetida de una serie de comandos mientras permanece una condición especifica, al inicio del ciclo primero se evalúa la expresión y luego se hace la ejecución.

La expresión puede contener referencias de variables, sustituciones de comando y metacaracteres.

while expresión a evaluardo

lista de comandosdone

La lista de comandos se ejecuta solo si la expresión a evaluar es verdadera, o sea que regresa un status de salida cero.

while [ “$#” -gt 0 ]do

lp $1shift

done

15.2 – Condicion Verdadera Sustituye a una expresión a evaluar, siempre regresa un valor de verdadero. Se usa para hacer ciclos infinitos.

while true # true genera un subshelldo

lista de comandosdone

En el siguiente ejemplo se sustituye la expresión “true” por “:” que es mas eficiente por ser Interconstruido (built-in), por esta razón se recomienda su uso.

while : # : no genera un subshelldo

lista de comandosdone

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 55: Man Shell

Sistema Operativo Unix Programación 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 evaluación sea diferente de cero.

until [ expresión a evaluar ]do

lista de comandosdone

Al inicio del ciclo primero se hace la ejecución y luego la evaluación de la expresión.

15.4 - Iteración

Permite la ejecución repetida de una serie de comandos, el número de repeticiones depende de una lista de palabras

for variable in lista de palabrasdo

lista de comandosdone

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 país in mexico alemania brasildo

banner $paisdone

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 56: Man Shell

Sistema Operativo Unix Programación Shell 56

Sí se omite la lista de palabras se omite el in, en este caso la variable toma los valores contenidos en los parámetros posicionales

for i do

lp $idone

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

15.5 – Rompimiento parcial de un ciclo

La instrucción 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 instrucción break cancela la ejecución de ciclos (while, until, for ) y continua con los comandos que siguen fuera del ciclo.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 57: Man Shell

Sistema Operativo Unix Programación 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 información recibida, ya que el comando line la envía a la sálida estandar, mientras que el comando read la asigna a la(s) variable(s) contenida(s) en la línea de ejecución.

Ejemplos

Usando read Usando line___________________________________________________

exec 3<archivo1 exec 3<archivo1exec 4>archivo2 exec 4>archivo2while read variable <&3 while variable=`line <&3`do do eval set -- $variable eval set -- $variable echo $*>&4 echo $*>&4done done

Es importante notar en los ejemplos anteriores, que la apertura se hace explícita con la instrucción exec, esto permite el manejo secuencial de los archivos.

Si la dirección 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 [email protected] (4)2-20-53-21

Page 58: Man Shell

Sistema Operativo Unix Programación Shell 58

16 - Sustitución Condicionada

Provee de una notación compacta para checar si una variable existe, y si es o no nula.

${variable:operadorpalabra}

donde:

$ Indica sustitución de variable.

{.........} Notación para delimitar la sustitución condicionada.

variable Nombre de la variable cuyo contenido se evalúa.

operador Carácter simple que indica el tipo de acción a realizar.

palabra Valor que se usa para la sustitución 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 expresión, en caso contrario utiliza el valor contenido en la palabra.

name=bozo name=””echo ${name:-”$1”} echo ${name:-”$1”}echo ${name} echo ${name}

bozo dukie

El operador = checa si la variable existe y no es nula, si la evaluación es falsa se toma el segundo valor y además se asigna a la variable nula.

name=”bozo” name=”bozo”echo ${name:=”$1”} echo ${name:=”$1”}echo ${name} echo ${name}

bozo dukiebozo dukie

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 59: Man Shell

Sistema Operativo Unix Programación Shell 59

El operador ? checa si la variable existe y no es nula, si la evaluación es falsa el mensaje definido se envía por el estandar error. En este caso el estandar error no se puede redireccionar.

name=”bozo” name=””echo ${name:?”Error”} echo${name:?”Error”}echo ${name} echo ${name}

bozo prog: name: Errorbozo

Si no se define el mensaje de error, el sistema envía 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” name=””echo ${name:+”!”} echo ${name:+”$!”}echo ${name} echo ${name}

dukiebozo

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 60: Man Shell

Sistema Operativo Unix Programación Shell 60

17 - Manejo de señales

17.1 - Señales

Se usan para indicar la ocurrencia de un evento, y se envían por:

- El superusuario, o usuario.

- El sistema operativo Unix.

- Un proceso.

Estas señales se manejan dentro de un programa, por medio de la instrucción trap, la cual se incluye al inicio del programa.

La siguiente es una lista de las señales más usadas en la programación shell:

0 Esta señal la envía un proceso al terminar normalmente. Usada con el comando kill, cancela todos los procesos asincronos (background) iniciados en la sesión actual.

1 Hangup, esta señal se genera al apagar la terminal, desconectar el cable de comunicación, etc., la accion de default es la terminación forzada de la sesión de trabajo.

2 Interrupción, se genera al oprimir algunas de las teclas que obligan la cancelación del proceso (delete, break, control-c).

3 Quit, se oprimió la tecla de quit, esta señal se ignora por los procesos asincronos.

9 Kill, esta señal no se puede atrapar, por lo que usada con el comando kill, es una muerte segura.

10 Error de bus.

11 Error de memoria, violación en la segmentación, generalmente ocasionada por la programación.

15 Terminación ordenada de un proceso, esta señal se usa con el comando kill, para cancelar un proceso en forma ordenada, es decir realizando toda la tarea de limpieza necesaria.

16-17 El significado de estas señales lo define el usuario.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 61: Man Shell

Sistema Operativo Unix Programación Shell 61

17.2 - trap

Un proceso o programa maneja las señales anteriores mediante el comando:

trap lista_de__comandos señales

Cuando el comando trap recibe una señal, se toma una de las acciones siguientes:

- Aceptar la acción de default.

En este caso se omite la lista de comandos.

trap 1 2 3

- Ignorar la señal.

En este caso la lista de comandos se encuentra vacía.

trap “ ” 1 2 3

- Atrapar la señal.

Se toma una acción determinada, como borrar los archivos temporales, o preveer interrupciones en procesos críticos.

En este caso la lista de comandos contiene toda la programación necesaria para la acción determinada.

trap “echo Proceso terminadorm /tmp/$$tmp; “ 0

La instrucción trap y su programación se lee dos veces, la primera al iniciar la ejecución del programa, y la otra al momento de activarse.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 62: Man Shell

Sistema Operativo Unix Programación Shell 62

La lista de comandos contiene uno o varios comandos, dependiendo de la complejidad de la programación, 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 ejecución del programa.

Si la acción de un trap incluye la terminación de la ejecución, se debe incluir el comando exit en la programación.

trap ‘rm -f /tmp/$$tmp; exit’ 1 2 3

Si se atrapa la señal 0, se debe programar el comando exit, esto hace que cuando se active el trap, se ejecute el comando exit, el cual envía la señal 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 señales, se atienden en orden ascendente.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 63: Man Shell

Sistema Operativo Unix Programación Shell 63

18 - Aritmética

18.1 - -expr

Este comando toma como argumentos una expresión y efectúa una comparación o evaluación 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 comúnmente :

- 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 continuación 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.

expresión1 \| expresión2

Regresa el valor de la expresión1 siempre y cuando no sea nula o cero, de lo contrario regresa la expresión2.

-----

a=100 b=200

expr “$a” \| “$b”100

-----

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 64: Man Shell

Sistema Operativo Unix Programación Shell 64

a=”” b=200

expr “$a” \|“$b”200

-----

expresión1 \& expresión2

Regresa el valor de la expresión1 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

-----

expresión1 { =, \>, \>=, \<, \<=, != } expresión2

Regresa el resultado de una comparación entera, solo si ambas expresiones son enteras, en caso contrario el resultado será la comparación 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 0 = expresión falsa

expr “$a” = “$c”1 1 = expresión verdadera

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 65: Man Shell

Sistema Operativo Unix Programación Shell 65

expresión1 { +, - } expresión2

Suma o resta el valor entero de las expresiones.-----

a=100 b=200

expr “$a” - “$b”-100

-----

expresion1 {\*, /, % } expresión2

Multiplica, divide o regresa el residuo de la división, lo anterior se realiza con los valores enteros de ambas expresiones.

-----

a=10 b=20

expr “$a” \* “$b”200

-----

expresión1 : expresión2

Compara expresión1 con expresión2, esta debe ser un patrón, el cual se busca dentro de la expresión1. Normalmente la respuesta es el numero de caracteres que coincidieron.

-----

expr catch : cat3

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 66: Man Shell

Sistema Operativo Unix Programación Shell 66

-----

expr catch : “c.*c”4

-----

expr catch : ”.*”5

-----

expr catch : cats0

-----

str=”Buenos dias”longitud=`expr “$str” : “.*”`echo $longitud11

Otra alternativa es utilizar en la expresión2 los símbolos \(...\), esto regresa una porción de la expresión1. En este formato comúnmente se usa el patrón “.*”, el cual obliga la coincidencia de un patrón desde el inicio de la cadena hasta el final. Este patrón se usa entre comillas “.*”.

-----

expr petróleos : “\(p.*l\)”petrol

Se extrae la cadena que comienza con p y termina con l.

-----

expr petróleos : “.*\(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 [email protected] (4)2-20-53-21

Page 67: Man Shell

Sistema Operativo Unix Programación Shell 67

-----

expr petróleos : “.*\(...s\)”leos

En este caso la cadena debe terminar con “s” y se extrae además contres caracteres anteriores.

-----

expr petróleos : “.\(.*\)”etroleos

En este caso se elimina el primer carácter y se despliega el resto de lacadena.

-----

if expr “$respuesta” : “[yY]” >/dev/nullthen

echo “Respuesta afirmativa”fi

Ejemplo del comando expr dentro de un comando de condición, en estecaso no interesa la salida del standard output, por lo que se redireccióna a /dev/null.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 68: Man Shell

Sistema Operativo Unix Programación Shell 68

18.2 - let

Este comando pertenece a Korn Shell y bash y permite la ejecución de múltiples operaciones en una misma línea.

let operaci¢n1 operaci¢n2

let x=x+1 y=y*3

En el ejemplo anterior las expresiones de cada operación 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 notación no tienediferencia si se incluyen espacios o tabuladores, pero tiene las limitación de no permitir múltiples operaciones en una misma línea de comando.

((operaci¢n1))

((x=x+1)) o ((x = x + 1))

Korn Shell soporta los siguientes operadores aritméticos:

+ - * / % & ^ << >> == != > >= < <=

y adicionalmente los operadores de asignación:

+= -= *= /= %= &= |= ^= <<= >>=

Algunos operadores tienen para shell un significado de redirección, en este caso la operación se debe encerrar entre acentos graves ` `, con el propósito de eliminar el significado de redirección.

El comando let ejecuta las operaciones de izquierda a derecha, por lo tanto una operación puede contener las variables de su izquierda.

let x=10 y=20 z=x*yecho $x $y $z10 20 200

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 69: Man Shell

Sistema Operativo Unix Programación Shell 69

18.3 - bc

Es un comando interactivo que permite cálculos con números de punto flotante, la entrada la lee de un archivo especifico, si no lo hay se lee del standard input, el resultado de la operación se envía siempre al standard output.

bc -[lc] archivo (de entrada)

Se soportan los siguientes operadores:

+ - * / % ^(exponenciaci¢n) ++ -- == <= >= != < > = += -= *= /= %= ^=

bc 2*3

6

Se soportan los siguientes operandos:

sqrt (expresión) Raíz cuadrada

sqrt (16)4

length (expresión) Número de dígitos significativos

length (100/2)2

scale (expresión) Número de dígitos a la derecha del punto decimal

scale=10100/333.3333333333

quit Salir de bc

Los parámetros ibase y obase permiten combinar sistemas de diferente base, lo cual nos permite hacer conversiones fácilmente.

ibase=16obase=16A+111

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 70: Man Shell

Sistema Operativo Unix Programación 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 aritméticas.

typeset -i numnum=20*3echo $num60

El comando typeset tiene el alias integer, el cual realiza la misma función de definir una variable de tipo entero.

integer numnum=33*3echo $num99

Una variable no definida como entera, la considera Korn Shell como tipo carácter (string).

18.5 - Arreglo de variables.

Otra característica 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 límite máximo de elementos es de 512, aún cuando algunas versiones de Unix soportan más.

elemento[0]=unoelemento[1]=doselemento[2]=treselemento[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 [email protected] (4)2-20-53-21

Page 71: Man Shell

Sistema Operativo Unix Programación 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 símbolos * y @y siguen las mismas consideraciones de los parámetros 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 [email protected] (4)2-20-53-21

Page 72: Man Shell

Sistema Operativo Unix Programación Shell 72

19 - Control de trabajos

Esta es una característica avanzada de Korn Shell, la cual facilita el manejo de trabajos (jobs) en background. Un trabajo (job) es uno o más programas en ejecución, los cuales se consideran como una sola unidad.

19.1 - Suspensión de trabajo ( ^z)

Un trabajo (job) en ejecución en foreground se suspende mediante la combinación de las teclas control-z, y lo envía 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 número consecutivo además de su propio PID, para referirnos a un trabajo (job) en background se utiliza cualquiera de las dos identificaciones.

Las teclas de suspensión 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 función susp = .........

El usuario puede modificar el valor de la función susp mediante el comando stty.

stty susp "^x"

19.2 – Consulta de trabajos en background jobs

Muestra los trabajos (jobs) en background, aún cuando estén suspendidos, la lista la muestra en orden ascendente de número de trabajo (job).

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 73: Man Shell

Sistema Operativo Unix Programación Shell 73

19.3 – Reactivación de un proceso en background bg [%n]

Reinicia la ejecución de un trabajo en background suspendido anteriormente.

Para referirse a un trabajo especifico se utiliza su numero consecutivo o el PID precedido del símbolo de porcentaje (%). Si se omite el número de referencia se asume el último trabajo suspendido.

sleep 60^z[1] + 5562 Stopped sleep 60

bg %1 ¢bg 5562

Es importante mencionar que la ejecución continúa en background.

19.4 – Reactivación de un proceso en foreground fg [%n]

Trae a foreground un trabajo enviado previamente a background, y si estaba suspendido además reinicia su ejecución.

Para referirse a un trabajo especifico se utiliza su numero consecutivo o el PID precedido del símbolo de porcentaje (%). Si se omite el número de referencia se asume el último trabajo enviado a background.

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 74: Man Shell

Sistema Operativo Unix Programación Shell 74

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

Hasta ahora el pipe "|" nos ha permitido encadenar comandos, haciendo que la salida de uno (sálida estandar) sea la entrada de otro (entrada estandar), por lo tanto el envío de información es en una sola dirección.

Ahora mediante el manejo de coprocesos podemos enviar información a la entrada estandar de un comando y leer su sálida estandar, ésta ultima información la recibe de regreso el comando original.

El operador |& inicia la ejecución de un coproceso, el cuál siempre se realiza en background.

El coprocesamiento implica la redirección de la entrada y salida estandar, por lo que no se deben usar los símbolos tradicionales de redireccionamiento, sin embargo si se puede redireccionar la sálida de error estandar.

El envío de información al coproceso se hace mediante la instrucción:

print -p "variable1 variable2 ..... variablen"

y el regreso de información desde el coproceso se hace mediante la instrucción:

read -p " var1 var2 ..........varn"

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 75: Man Shell

Sistema Operativo Unix Programación Shell 75

20 - Banderas

Otra característica 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 categorías de banderas dependiendo de como se activan y donde.

20.1 - Banderas de ejecución

Se activan o desactivan en la línea de comandos del shell, o bien dentro de un programa, mediante las instrucciones:

set -flag Activa la bandera indicada

set +flag Desactiva la bandera indicada

Algunas banderas son:

-a (exporta todo)

Todas las variables creadas o modificadas, a partir de la activación de labandera, se exportan a los subshells que se abran.

-e (salir en caso de error)

A partir de la activación de la bandera, si un comando o programa termina anormalmente, es decir que el código de salida es diferente a cero, ocasiona la terminación 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 [email protected] (4)2-20-53-21

Page 76: Man Shell

Sistema Operativo Unix Programación Shell 76

-n (no ejecución) No en Linux

A partir de la activación, no hay ejecución de comandos, esta bandera se usa comúnmente con la bandera -v, para checar sintaxis de un programa sin ejecutarlo

-v (Verbose)

Despliega las líneas 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 sálida de error estandar.

-x (detalle de ejecución)

Despliega cada línea de comando inmediatamente antes de ejecutarse, e incluye sustitución de comandos y variables, cada línea va precedida por el signo +. El desplegado lo hace a la sálida de error estandar.

-u (variable indefinida)

A partir de la activación, se considera error hacer referencia a unavariable indefinida, esto provoca la terminación del programa o shell.

-o [opción]

Esta bandera tiene varias opciones, entre ellas:

ignoreeof (ignora control-D)

Ignora la interrupción Control-D con el fin de evitar su entrada accidental, lo que provocaría la terminación del shell. En este caso para terminar la ejecución de shell, se debe usar la instrucción exit.

noclobber (no sobreescritura)

No permite la redirección de la salida (>) sobre archivos existentes, para escribir sobre un archivo existente se debe usar el operador ">|".

Ing. Juan Gabriel Franco Delgado [email protected] (4)2-20-53-21

Page 77: Man Shell

Sistema Operativo Unix Programación Shell 77

20.2 - Banderas de invocación.

Estas banderas se activan al momento de invocar un nuevo shell y no se modifican mediante la instrucción set.

-c comando

Esta bandera abre un nuevo shell para ejecutar el comando indicado, al terminar la ejecución 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 sesión. Esta bandera esta implícita 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 [email protected] (4)2-20-53-21