dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/programacionshellp...  · web...

27
Laboratorio de Herramientas Computacionales Programación en Shell 1 Introducción. El intérprete de comandos o shell es la interfaz principal entre el usuario y el sistema, y le permite al usuario interactuar con los recursos de éste. El usuario introduce sus órdenes, el intérprete las procesa y genera la salida correspondiente. Por lo tanto, un intérprete de comandos de GNU/Linux es tanto una interfaz de ejecución de órdenes y utilidades, como un lenguaje de programación, que admite crear nuevas órdenes (denominadas guiones, scripts de shell o shellscripts), utilizando combinaciones de comandos y estructuras de control. En Unix existen 2 familias principales de intérpretes de mandatos: los basados en el intérprete de Bourne (bsh, ksh o bash) y los basados en el intérprete de C (csh o tcsh). En este curso emplearemos bash. Configuración del entorno de operación. El intérprete de comandos de cada cuenta de usuario tiene un entorno de operación propio, en el que se incluyen una serie de variables de configuración. El administrador del sistema asignará unas variables para el entorno de ejecución comunes a cada grupo de usuarios –o a todos ellos–; mientras que cada usuario puede personalizar algunas de estas características en su perfil de entrada, añadiendo o modificando dichas variables. Para crear el entorno global, el administrador crea un perfil de entrada común para todos los usuarios, editando el archivo /etc/bashrc (en el caso de bash), donde se definen las variables del sistema y se ejecutan los archivos de configuración propios para cada aplicación. Estos archivos son pequeños programas o scripts (archivos propios de los intérpretes de comandos basados en el de Bourne –bsh, bash, etc.–, con extensión .sh; y otros para los basados en el intérprete de C (csh, tcsh, etc.), con extensión .csh) que se sitúan en el directorio /etc/profile.d. El proceso de interacción del usuario se completa con la ejecución de su perfil de entrada personal (archivo ~/.bash_profile para bash). Aunque el 1 La autora original de este documento es la M. en I. Rosalía Mora Juárez, las actualizaciones al mismo fueron hechas por el M. en C. Sergio Rogelio Tinoco Martínez. R. M. J. y S. R. T. M. FIE 2013 [1]

Upload: lynhu

Post on 09-Jul-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Programación en Shell1

Introducción.El intérprete de comandos o shell es la interfaz principal entre el usuario y el sistema, y le permite al usuario

interactuar con los recursos de éste. El usuario introduce sus órdenes, el intérprete las procesa y genera la salida correspondiente. Por lo tanto, un intérprete de comandos de GNU/Linux es tanto una interfaz de ejecución de órdenes y utilidades, como un lenguaje de programación, que admite crear nuevas órdenes (denominadas guiones, scripts de shell o shellscripts), utilizando combinaciones de comandos y estructuras de control.

En Unix existen 2 familias principales de intérpretes de mandatos: los basados en el intérprete de Bourne (bsh, ksh o bash) y los basados en el intérprete de C (csh o tcsh). En este curso emplearemos bash.

Configuración del entorno de operación.El intérprete de comandos de cada cuenta de usuario tiene un entorno de operación propio, en el que se

incluyen una serie de variables de configuración.El administrador del sistema asignará unas variables para el entorno de ejecución comunes a cada grupo de

usuarios –o a todos ellos–; mientras que cada usuario puede personalizar algunas de estas características en su perfil de entrada, añadiendo o modificando dichas variables.

• Para crear el entorno global, el administrador crea un perfil de entrada común para todos los usuarios, editando el archivo /etc/bashrc (en el caso de bash), donde se definen las variables del sistema y se ejecutan los archivos de configuración propios para cada aplicación. Estos archivos son pequeños programas o scripts (archivos propios de los intérpretes de comandos basados en el de Bourne –bsh, bash, etc.–, con extensión .sh; y otros para los basados en el intérprete de C (csh, tcsh, etc.), con extensión .csh) que se sitúan en el directorio /etc/profile.d.

• El proceso de interacción del usuario se completa con la ejecución de su perfil de entrada personal (archivo ~/.bash_profile para bash). Aunque el administrador debe suministrar un perfil válido, el usuario puede editar dicho archivo a su conveniencia.

Recomendaciones de programación.Como cualquier otro programa, un script de shell puede requerir un cierto mantenimiento que incluya

modificaciones, actualizaciones o mejoras del código. Por lo tanto, al escribir nuestros scripts, debemos tomar en cuenta las recomendaciones de desarrollo típicas para cualquier programa. A continuación se presentan algunas recomendaciones:

• El código debe ser fácil de leer, incluyendo espacios y sangrías que separen claramente los bloques de código.

1 La autora original de este documento es la M. en I. Rosalía Mora Juárez, las actualizaciones al mismo fueron hechas por el M. en C. Sergio Rogelio Tinoco Martínez.

R. M. J. y S. R. T. M. FIE 2013 [1]

Page 2: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

• Deben añadirse comentarios claros sobre el funcionamiento general del programa principal y de las funciones. El contenido recomendado debe incluir: autor, descripción o propósito del script o función, modo de uso del programa, versión y fechas de modificaciones.

• También se deben incluir comentarios para los bloques o instrucciones importantes, que requieran cierta aclaración.

• Agregar comentarios y ayudas sobre la ejecución del programa.• Depurar el código para evitar errores, procesando correctamente los parámetros de ejecución.• No desarrollar código complicado de leer, aunque esto nos haga ahorrar líneas de código.• Utilizar funciones y las estructuras de programación más adecuadas para evitar repetir código.• Todos los nombres de funciones y de scripts deben escribirse en letras minúsculas, mientras que para las

variables se acostumbra emplear mayúsculas (especialmente para las predefinidas por el shell).• Los nombres de variables, funciones y scripts deben ser descriptivos, cuidando de no confundirse con otros

nombres ya en uso, ni con los mandatos internos o externos del shell. Los nombres no deben ser ni muy largos ni muy cortos.

Edición y ejecución de un script de shell.Un script de shell, interpretado por bash, es un archivo de texto normal que consta de una serie de bloques de

código, formados por líneas de mandatos que se ejecutan en secuencia.El usuario debe tener permiso de creación (escritura) en el directorio donde se quiere crear un script nuevo, o

sobre el propio archivo del script, para modificarlo.Si el programa se encuentra en un directorio incluido en la variable de entorno PATH, sólo se necesita teclear el

nombre, sin necesidad de especificar el camino (ver PATH, en la sección Variables de ambiente).

Proceso de edición y ejecución de un script.El proceso completo de edición y ejecución de un script es muy simple. Básicamente consta de 3 pasos:

1. Utilizar un editor de textos para escribir el script. Por convención, la extensión para los scripts de shell es .sh, así que guardaremos nuestro script con dicha extensión. En el ejemplo siguiente se utiliza vi, pero se puede usar cualquier otro editor de textos (nano, pico, gedit, kedit, etc.).

vi prueba.sh

2. Activar el permiso de ejecución para el script creado:

chmod u+x prueba.sh

3. Ejecutar el script: ./prueba.sh # Si el script está en el directorio actual, o bien:sh prueba.sh # Si el script está en un directorio contenido en la variable PATH

R. M. J. y S. R. T. M. FIE 2013 [2]

Page 3: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Ahora vamos a crear nuestro primer script, y lo llamaremos primero.sh. Escribiremos como contenido lo siguiente:

#!/bin/shecho ¡Este es mi primer script!

Nótese que el script de shell inicia con dos líneas, básicamente:

• Un comentario que inicia con el carácter # (los comentarios son ignorados por el intérprete de comandos). Todo lo que se escriba después, hasta el final de esa línea, será tomado como un comentario. Por lo general se escribe la secuencia #!/bin/sh, misma que indica al shell que /bin/sh es el programa que se debe usar para ejecutar este archivo (en el lenguaje de la programación en shell –en inglés –, la secuencia “#!” es conocida como she–bang).

• La primera línea ejecutable. Aquí ya se incluyen uno o varios comandos que interactúan con el intérprete, el flujo de datos, la entrada y la salida estándar (stdin, stdout) y los descriptores de error (stderr).

Una vez que ya hemos escrito nuestro script de shell, guardamos el archivo. Recuerda que si intentamos ejecutarlo no funcionará (a menos que el directorio de trabajo este contenido en la variable de ambiente PATH). Esto es porque la extensión .sh no lo hace un archivo ejecutable. Para que se pueda ejecutar tenemos que activarle el permiso de ejecución:

chmod u+x script.sh

Nota: Otra forma de otorgar el permiso es chmod 500 script.sh o chmod +x script.sh.

Ahora sí, el script es ejecutable, y se puede ejecutar de dos formas diferentes:• Con: ./primero.sh• O con: sh primero.sh

Variables.Las variables son palabras que contienen un valor. El shell nos permite crear, asignar y eliminar variables.El nombre de una variable puede contener solamente letras (de la a a la z o de la A a la Z), números (del 0 al 9) o

el carácter de guión bajo o subrayado (“_”). Adicionalmente, el nombre de una variable sólo puede comenzar con una letra o con un guión bajo. Algunos ejemplos de nombres de variables válidos son:

_TOTALNUMERO_TOTALarchivo1_datosnombre_de_archivo

Sin embargo, el nombre siguiente no es válido:

R. M. J. y S. R. T. M. FIE 2013 [3]

Page 4: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

2resultado

Para corregir el error anterior, se puede agregar un guión bajo al principio:

_2resultado

Los nombres de variables, tales como 1, 2 u 11, tampoco son válidos, porque comienzan con un número y los números están reservados para ser utilizados por el shell en los descriptores de archivo. Como usuarios podemos utilizar el valor almacenado en esas variables, pero generalmente no podremos asignarles un valor.

En los nombres de variables tampoco se pueden utilizar caracteres como “!”, “*” o “-”. Recuerda que estos caracteres tienen un significado especial para el shell.

Tipos de variables.Las variables del intérprete de comandos bash, por convención, se clasifican como a continuación se describe:

Variables locales.Las variables locales son definidas por el usuario y se utilizan únicamente dentro de un bloque de código, de una

función determinada o de un guión. Un ejemplo es:

VAR1=Hola echo $VAR1Hola

Como se puede observar en el ejemplo anterior, para asignar valores a una variable se utiliza simplemente su nombre, pero para hacer referencia a su valor, hay que utilizar el símbolo $. El ejemplo siguiente muestra los modos de referirse a una variable:

ERR=2 # Se le asigna 2 a la variable ERR.

echo ERRERR # Muestra como resultado la cadena "ERR"

echo $ERR2

# Muestra como resultado el valor, por referencia,# de la variable ERR (el valor 2)

Para quitarle el valor a una variable, podemos utilizar el comando unset.

$ X=1$ echo $X1$ unset X$ echo XX

R. M. J. y S. R. T. M. FIE 2013 [4]

Page 5: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Variables de ambiente o entorno.Las variables de ambiente o entorno son las que afectan tanto al comportamiento del intérprete como al

comportamiento de la interfaz del usuario. Son variables que están disponibles para cualquier proceso invocado por el shell. Algunos programas requieren variables de ambiente para funcionar correctamente.

La tabla siguiente presenta las variables de ambiente principales:

Variable Definición

PPID Número de identificación del proceso padre del shell actual.

PWD Directorio de trabajo actual, establecido por el comando cd.

OLDPWD Anterior directorio de trabajo, establecido por el comando cd.

REPLYCuando se usa el comando read de bash, sin argumentos, esta variable recoge el contenido de la línea leída.

UID Número de identificación (ID) del usuario, establecida en el arranque del shell.

EUID ID efectivo del usuario, inicializado en el arranque del shell.

BASH Nombre completo, incluida la ruta, del archivo que se ejecutó para lanzar el shell.

BASH_VERSION Versión de bash.

SHLVLNivel del shell. Incrementa su valor en una unidad cada vez que se lanza una nueva interfaz de comandos.

RANDOMCada vez que se invoca a esta variable se obtiene un número entero aleatorio. La secuencia de números aleatorios, proporcionada por RANDOM, se puede inicializar simplemente asignándole un valor nuevo a esta variable.

SECONDSMantiene el número de segundos que han transcurrido desde que se ejecutó el shell. Si asignamos un valor a esta variable, la cuenta indicará los segundos transcurridos desde dicha asignación más el valor asignado.

LINENO

Cuando se hace referencia a esta variable desde un script, indica la línea (dentro del script) en la que se le referencia, considerando que la primera línea se numera como 1. Si se invoca desde la propia interfaz de comandos, el valor que devuelve es el número de línea de la orden ejecutada, desde que se inició la interfaz de comandos.

HISTCMDContiene la posición, dentro del archivo de historia de comandos, que ocupa el comando actual.

HOSTTYPESe trata de una cadena de texto describiendo el tipo de máquina en la que se está ejecutando bash.

HOSTNAME Nombre de la máquina.

OSTYPESe trata de una cadena de texto describiendo el sistema operativo en el que sé está ejecutando bash.

PATH

La ruta de búsqueda de comandos. Se trata de una secuencia de directorios en los que se pueden localizar programas, separados entre sí por un signo de dos puntos (“:”). La interfaz de comandos recorrerá esta lista en el orden dado, buscando los comandos que queramos ejecutar.

HOMEDirectorio personal del usuario actual. Es el argumento usado por defecto cuando ejecutamos el comando cd, sin especificar directorio alguno.

CDPATH Se trata de la ruta de búsqueda para cd. Tiene una estructura similar a la variable

R. M. J. y S. R. T. M. FIE 2013 [5]

Page 6: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Variable DefiniciónPATH. Indica dónde buscar los directorios especificados como argumentos al comando. Como ejemplo habitual, podría contener :~:/usr.

MAILCuando contiene el nombre de un archivo, bash comprueba en él la llegada de correo electrónico nuevo y avisa en caso de que se produzca.

MAILCHECKDetermina el intervalo de tiempo, en segundos, en que bash revisará si hay correos electrónicos nuevos.

MAILPATH

Al igual que PATH y CDPATH, esta variable contiene una lista, en este caso de archivos, que deberá ser comprobada para la posible llegada de correo electrónico. Se puede indicar un mensaje especifico para la llegada de correo electrónico en diferentes buzones, usando el carácter “?” como separador entre el archivo y el mensaje. En ese caso, la variable “$_” recibirá el nombre del buzón. Un ejemplo: MAILPATH='/var/spool/mail/nlucas?"Tienes correo":~/mail/buzon?"Ha llegado algo al $_"'

PS1 Valor del prompt principal.

PS2Valor del prompt secundario. Este prompt es el que aparece cuando dividimos una línea en la interfaz de comandos, para continuar introduciendo órdenes en la línea siguiente de la pantalla.

PS3 Valor del tercer prompt. Este prompt es usado solamente por el comando select.

PS4

Valor del cuarto y último prompt. Sólo se usa cuando se está realizando un seguimiento de los comandos, mostrándose para indicar los pasos que se van ejecutando. Para entrar en el modo de seguimiento basta con ejecutar set -x, entonces veremos cómo se expande cada comando que ejecutemos, mostrando las sustituciones que se hacen con los alias, las variables, metacaracteres, etc.

HISTSIZE Contiene el número de comandos a guardar, en el historial de comandos.

HISTFILEContiene el nombre del archivo en el que se almacena el historial de comandos. Por defecto se trata del archivo ~/.bash_history.

HISTFILESIZENúmero máximo de líneas que puede contener el archivo de historial. Tengamos en cuenta que un comando puede ocupar varias líneas.

PROMPT_COMMAND Si está definido, contiene el comando a ejecutar antes de presentar el prompt.

IGNOREEOFIndica cuántas veces se ha de recibir el carácter EOF (End Of File – Fin de archivo, o la pulsación de las teclas Crtl-D) antes de salir de bash. Si el valor indicado no es numérico, se toma por defecto 10. Si la variable no existe, basta una sola pulsación.

TMOUTSi contiene un valor superior a cero, indica el número de segundos que se puede estar sin introducir un comando en el shell. Pasado este tiempo, la interfaz de comandos se cerrará.

FCEDITRuta y nombre del editor usado por defecto para el comando fc. Por defecto se usa vi.

FIGNORELista de sufijos de archivos que se ignorarán al intentar completar un nombre de archivo desde bash. La lista estará formada por los sufijos ignorados, separados por un signo de dos puntos (“:”). Por ejemplo .0:.tmp

EDITOREn esta variable muchos programas buscarán la ruta y el nombre del editor a usar. Por defecto el editor usado es vi. Algunos de los programas que hacen uso de esta variable son crontab (con la opción -e), edquota y otros muchos.

TERMContiene el tipo de terminal. Esta variable es importante, pues algunos tipos de terminales no son compatibles con algunos programas.

R. M. J. y S. R. T. M. FIE 2013 [6]

Page 7: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Para mostrar todas las variables del shell (y sus valores), se utiliza el comando set. La sintaxis es:

set

Como resultado, el intérprete regresará un listado muy largo de variables de ambiente y locales. También es posible asignar valores a las variables mediante el comando set (consulta las páginas del manual para más información).

Importante: Debe hacerse una mención especial a la variable de entorno PATH, que se encarga de guardar la lista de directorios donde se buscarán los archivos ejecutables. Si no se especifica el camino exacto de un programa, el sistema busca en los directorios especificados en PATH, siguiendo el orden de izquierda a derecha. El carácter separador de directorios es dos puntos “:”.

Ejercicio:

1. Despliega en la consola el contenido de las siguientes variables de entorno:• $PATH• $TERM• $PS1• $HOME• $BASH

Parámetros de posición.Los parámetros de posición son variables especiales de bash que contienen los valores de los parámetros que

recibe un script o una función, desde la línea de órdenes. El número indica la posición de dicho parámetro en la llamada al código. La sintaxis es:

nombre_del_script parámetro1 parámetro2… parámetroN

El nombre del programa o script que se está ejecutando, se denota por la variable $0. Después, el primer parámetro se denota por la variable $1, el segundo por $2 y así sucesivamente hasta el noveno, que es $9; a partir del décimo parámetro se usa la notación ${número}. El comando shift desplaza la lista de parámetros hacia la izquierda, para procesar los parámetros más cómodamente.

Ejemplo: Uso de parámetros de posición y de variables locales:

grep "^$1:" /etc/passwdgrep ":$GID:" /etc/group | cut -f1 -d:

La primera línea muestra al usuario la información contenida en el primer parámetro recibido. La segunda línea presenta el nombre del grupo, cuyo identificador se encuentra en la variable GID.

R. M. J. y S. R. T. M. FIE 2013 [7]

Page 8: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Variables especiales.Las variables especiales son aquéllas que tienen una sintaxis especial y que hacen referencia a valores internos

del proceso. Son las que informan sobre el estado de éste y son tratadas y modificadas directamente por el intérprete, por lo tanto, son de sólo lectura. (Los parámetros de posición pueden incluirse en esta categoría).

La tabla siguiente describe brevemente estas variables.

Variable especial Descripción

$$ Identificador del proceso (PID). Se usa para asignar nombres de archivos temporales.

$* Cadena con el contenido completo de los parámetros recibidos por el programa o script.

$@Como en el caso anterior, pero trata cada parámetro como una palabra diferente.Nota: La expresión cat "$@" puede usarse tanto para procesar datos de archivos como de la entrada estándar.

$# Número de parámetros.

$? Código devuelto por el último mandato/comando ejecutado (el 0 indica terminación normal y, un valor diferente de 0, indica terminación con errores).

$! Identificador del último proceso ejecutado en segundo plano.

$_ Valor del último argumento del comando ejecutado previamente.

Ejemplo: La primera columna muestra el código de un script para convertir de minúsculas a mayúsculas. La segunda columna indica cómo puede utilizarse el script mayúsculas.sh. #!/bin/bash

# Convierte a mayúsculas el texto del# archivo especificado o de la entrada# estándar. Uso: mayúsculas [[<]archivo]

cat "$@" | tr 'a-zñáéíóúü' 'A-ZÑÁÉÍÓÚÜ'

$ mayúsculas datos.txt > datos.sal$ mayúsculas <datos.txt > datos.sal$ mayúsculasEsto es una prueba de ejecución.^D# La salida es:ESTO ES UNA PRUEBA DE EJECUCIÓN.

Asignando valores a las variables.El intérprete de comandos permite asignar prácticamente cualquier valor a las variables, especificando

simplemente el nombre de la variable y el valor que queremos almacenar en ella.

$ FRUTA=kiwi$ Total=358

Notas: No se debe separar con espacios en blanco el nombre de la variable del signo “=”, ni éste del valor a asignar a la variable; de lo contrario, el shell mostrará un mensaje de error. Tampoco es necesario declarar el tipo de la variable (carácter o numérica), pero hay que tener cuidado al utilizar valores que contienen espacios, por ejemplo:

R. M. J. y S. R. T. M. FIE 2013 [8]

Page 9: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

$ FRUTA=manzana naranja pera

Generará el error siguiente:

$ FRUTA=manzana naranja pera-bash: naranja: no se encontró la orden

Para poder utilizar espacios en los valores de las variables, el valor se debe encerrar entre comillas ( “”), así le decimos al shell que la variable va a contener una cadena, esto es:

$ FRUTA="manzana naranja pera"

Hay que tomar en cuenta, además, que si no se utiliza el signo “$” antes del nombre de la variable, únicamente se presenta el nombre de la variable, más no su contenido.

$ FRUTA=plátano$ echo FRUTAFRUTA

Si queremos ver el contenido de la variable FRUTA del ejemplo anterior, lo correcto es:

$ FRUTA=plátano$ echo $FRUTAplátano

También se puede asignar el valor de otras variables a una variable.

$ X=Hola$ Y="$X, ¿cómo estás?"$ echo $YHola, ¿cómo estás?

Nota: Se puede escapar el carácter “$” con la diagonal invertida (“\”), como en las expresiones regulares.

Ejercicio: Escribe un script en donde se despliegue el valor de la variable VAR=prueba. Incluye los comandos echo, clear y sleep (toma como base el texto siguiente).

#!/bin/sh# Variables prueba 1VAR1=prueba

Entrada y salida de datos en scripts de shell.Hasta este momento hemos realizado scripts de shell sencillos, pero en ninguno pedimos datos por parte del

usuario.

R. M. J. y S. R. T. M. FIE 2013 [9]

Page 10: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Para solicitar datos a un usuario (introducir datos) existe el comando read. La sintaxis general del comando read es:

read lista_de_variables

En donde lista_de_variables es una o más variables en las cuales almacenar información. Estas variables deberán estar separadas por espacios en blanco.

El comando read espera la introducción de datos desde la entrada estándar (stdin), y almacena los valores introducidos en las variables o la variable especificadas.

read a10# Escribimos el número 10 y presionamos la tecla Enter.

Cuando ejecutamos el comando read, el interprete de comandos queda en espera de que por la entrada estandar se introduzcan datos. En este caso el dato es el número 10, y éste se almacenará en la variable a.

También se pueden pedir valores múltiples para variables múltiples.

$ read a b c5 3 2# Escribimos los números 5, 3 y 2 y presionamos la tecla Enter.$ echo $a5$ echo $b3$ echo $c2

Pero si sólo introducimos un valor:

$ read a b c10# Escribimos el número 10 y presionamos la tecla Enter.$ echo $a10$ echo $b$ echo $c$

No se almacenan valores en las variables b y c debido a que no hay datos para introducir.Ahora, tomemos todo lo anterior y hagamos un script:

#!/bin/shecho –n "Introduzca un valor numérico: "read valorecho "El valor que se introdujo fue: $valor."

R. M. J. y S. R. T. M. FIE 2013 [10]

Page 11: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

y al ejecutarlo:

Introduzca un valor numérico: 10# Escribimos el número 10 y presionamos la tecla Enter.El valor que se introdujo fue: 10.

Como se puede observar en todos los ejemplos anteriores, la escritura en la salida estándar (stdout) la hacemos con el comando echo. Cabe mencionar ahora, algunas de las opciones para echo que podemos incluir en los scripts de shell para la salida estándar:– n: No se escribe el carácter de fin de línea.– e: Habilita la interpretación de caracteres especiales. Importante: para que funcione esta opción, la cadena a

visualizar debe estar entre comillas dobles (“”).– \a: Alerta sonora (campana de la terminal).– \b: Retroceso de espacio.– \c: Finaliza el eco, es decir, deja de reproducir el texto de entrada en la salida estándar.– \f: Alimentación de hoja (útil cuando se envía texto a la impresora).– \n: Retorno de carro y avance de línea.– \r: Retorno de carro.– \t: Tabulador horizontal.– \v: Tabulador vertical.

En resumen.La lectura de la entrada estándar se puede hacer de dos formas:• Mediante la línea de comandos, empleando parámetros de posición.• Interactivamente con el comando read.

La salida estándar la trabajamos con el comando echo.

Variables en arreglos.Un arreglo es un conjunto de valores asignados a un solo nombre de variable. Para acceder a alguno de los

valores, se utiliza un número que sirve como índice para los datos.Digamos que deseamos almacenar todos los nombres de frutas en una sola variable, a la que llamaremos

FRUTA. Si ejecutamos:

$ FRUTA=manzana$ FRUTA=pera$ FRUTA=higo$ FRUTA=naranja

El problema es que la variable FRUTA contendrá únicamente el último valor asignado (naranja en este caso) y no todos los valores.

R. M. J. y S. R. T. M. FIE 2013 [11]

Page 12: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Una variable de tipo arreglo formaliza este tipo de agrupación de valores, empleando un nombre de variable en conjunto con un número para acceder a los valores, este número se denomina índice. El método más simple para crear un arreglo es asignar un valor a uno de sus índices, esto es expresado de la manera siguiente:

nombre_de_variable[índice]=valor

En donde nombre_de_variable es el nombre del arreglo, índice es el índice al elemento que se desea asignar y, valor, es el valor a asignar.

$ FRUTA[0]=manzana$ FRUTA[1]=pera$ FRUTA[2]=higo$ FRUTA[3]=naranja

Importante: En bash, el valor de índice comienza en 0, cuando se utilizan valores numéricos.El valor de índice no necesariamente tiene que ser un valor numérico, también se pueden asignar valores de

índice que representen datos alfanuméricos, por ejemplo:

$ FRUTA[primera]=manzana$ FRUTA[segunda]=pera$ FRUTA[tercera]=higo$ FRUTA[cuarta]=naranja

También es permitido asignar valores a un arreglo especificando dichos valores entre paréntesis, por ejemplo:

$ FRUTA=(manzana pera naranja)

Y es equivalente a escribir:

$ FRUTA[0]=manzana$ FRUTA[1]=pera$ FRUTA[2]=naranja

Si deseamos asignar algún valor que contenga espacios en un elemento del arreglo, tenemos que encerrarlo entre comillas, de igual manera que si fuera una variable común y corriente:

$ FRUTA[100]=uvas verdes-bash: verdes: no se encontró la orden

Lo correcto es:

$ FRUTA[100]="uvas verdes"

O bien, podríamos escribir:

$ FRUTA=(manzana pera naranja "uvas verdes" "uvas rojas")

R. M. J. y S. R. T. M. FIE 2013 [12]

Page 13: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Accediendo a valores de variables de tipo arreglo.Después de asignar valores a una variable de tipo arreglo, se pueden acceder individualmente utilizando:

${nombre_de_variable[índice]}

En donde nombre_de_variable indica el nombre del arreglo e índice, es el del elemento que deseamos accesar.Por ejemplo:

$ FRUTA[0]=manzana$ FRUTA[1]=plátano$ echo ${FRUTA[0]}manzana$ echo ${FRUTA[1]}plátano$ FRUTA[rara]=kiwi$ echo ${FRUTA[rara]}kiwi

Si deseamos imprimir el valor de todos los elementos del arreglo, utilizaremos la sintaxis siguiente:

${nombre_de_variable[*]}

O también:

${nombre_de_variable[@]}

Por ejemplo:

$ FRUTA=(manzana pera naranja "uvas verdes" "uvas rojas")$ echo ${FRUTA[*]}manzana pera naranja uvas verdes uvas rojas$ echo ${FRUTA[@]}manzana pera naranja uvas verdes uvas rojas

Por último, si lo que queremos conocer es el número de elementos que contiene el arreglo, utilizaremos:

${#nombre_de_variable[*]}

O también:

${#nombre_de_variable[@]}

Por ejemplo:

$ FRUTA=(manzana pera naranja "uvas verdes" "uvas rojas")$ echo ${#FRUTA[*]}5

R. M. J. y S. R. T. M. FIE 2013 [13]

Page 14: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

$ echo ${#FRUTA[@]}5

Variables no modificables (variables de sólo lectura).Para asegurarnos que el valor de una variable no sea modificado, podemos señalarla como variable de sólo

lectura, mediante el comando readonly:

$ readonly variable

Por ejemplo:

$ X=1$ readonly X$ X=2-bash: X: variable de sólo lectura$ echo $X1

ExpresionesEl intérprete bash permite utilizar una gran variedad de expresiones en el desarrollo de programas y en la línea

de mandatos. Las distintas expresiones soportadas por el intérprete pueden englobarse en las categorías siguientes:• Expresiones aritméticas: Las que dan como resultado un número entero o binario.• Expresiones condicionales: Utilizadas por mandatos internos de bash, para evaluar si éstas son ciertas o

falsas.• Expresiones de cadenas: Aquéllas que tratan cadenas de caracteres.Las expresiones complejas cuentan con varios parámetros y operadores y se evalúan de izquierda a derecha. Sin

embargo, si una operación se encuentra entre paréntesis, se considera de mayor prioridad y se evalúa antes.A modo de resumen, la tabla siguiente presenta los operadores que bash usa en los distintos tipos de

expresiones.

Operadores aritméticos: + - * / % ++ --

Operadores de comparación:== != < <= > >=-eq –nt –lt -le –gt –ge

Operadores lógicos: ! && ||

Operadores binarios: & | ^ << >>

Operadores de asignación: = *= /= %= += -= <<= >>= &= ^= |=

Operadores de tipos de archivos: -e –b –c –d –f -h -L -p -S –t

Operadores de permisos de archivos: -r -w -x -g -u -k -O -G –N

Operadores de fechas: -nt –ot –et

R. M. J. y S. R. T. M. FIE 2013 [14]

Page 15: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

Operadores de cadenas: -z –n

Expansión aritmética.El shell provee un mecanismo para realizar aritmética de enteros básica, llamado expansión aritmética. La

expansión aritmética está basada en el estándar POSIX1, así que es posible encontrar esta característica en la mayoría de los shell modernos. El formato para la expansión aritmética es:

(( expresión ))

En donde expresión es cualquier expresión matemática construida con base en las variables del shell (que contengan valores numéricos), los operadores mostrados anteriormente y/o valores numéricos específicos.

La expansión aritmética proporciona una herramienta potente para realizar operaciones aritméticas y expresiones sobre cadenas. Para traducir una cadena en una expresión numérica se utilizan los acentos, los paréntesis dobles y el comando let.

Ejemplos: La expansión aritmética se puede comprobar con comandos, directamente en la terminal:

1. Expansión aritmética usando el acento simple en unión con el comando expr.

$ z=1$ z=`expr $z + 3` # El comando expr permite la expansión, para sumar 3 a la variable z$ echo $z4

2. Expansión aritmética con paréntesis dobles: ((…)) y $((…)). $ z=1$ z=$(($z+3)) # Evalúa la expresión dentro de ((…))$ echo $z4

Otra manera de realizar una expresión aritmética:

$ z=1$ z=$((z+3))$ echo $z4

También se pueden realizar expresiones aritméticas (operaciones) con paréntesis dobles y sin $.

$ z=0$ (( z += 1 )) # Incrementar z en 1 pero ¡Cuidado! escribir (( $z += 1 )) es incorrecto.

1 POSIX es el acrónimo de Portable Operating System Interface – Interfaz Portable de Sistema Operativo. Tomado de http://es.wikipedia.org/wiki/POSIX

R. M. J. y S. R. T. M. FIE 2013 [15]

Page 16: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

$ echo "El resultado es: $z"El resultado es: 1

3. Expansión aritmética con paréntesis dobles y el uso de let.

Los acentos permiten usar espacios en la asignación de variables. El operador let permite la evaluación aritmética más allá de la expansión.

$ z=0$ let z=z+3$ echo $z3

O, también, se puede escribir entre comillas dobles:

$ z=0$ let "z = z + 3"$ echo $z3

Con relación a los operadores <, >, <= y >=, se expresan generalmente entre paréntesis dobles. Por ejemplo:

(("$a" < "$b"))

(("$a" <= "$b"))

(("$a" > "$b"))

(("$a" >= "$b"))

Comando expr.El comando expr recibe números y operadores aritméticos como argumentos, efectúa los cálculos indicados y

devuelve el resultado. El comando expr usa la convención del lenguaje de programación C para cierto y falso: 0 es falso y distinto de 0 es cierto. La sintaxis para el comando expr es:

expr argumento1 operación argumento2

donde:argumento1: Es el primer argumento para realizar una operación.operación: Es un operador de suma (+), resta (-), multiplicación (*), división entera (/) o resto/módulo de la división entera (%).argumento2: Es el segundo argumento para realizar una operación.

Importante:• Los argumentos y los operadores deben estar separados por espacios en blanco.• expr se ejecuta sólo con números enteros.

R. M. J. y S. R. T. M. FIE 2013 [16]

Page 17: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

• Los símbolos “*” y “/”deben ser escapados escribiendo “\*” y “\/”; al igual que los paréntesis, que deben escribirse como “\(” y “\)”. Si no se antepone la diagonal invertida “\”, bash no interpreta el “*” como operador para la multiplicación, sino como un metacaracter (para intentar expandir una expresión regular).

Ejemplos:

$ expr 4 + 59

$ expr 3 \* 4 + 6 \/ 2 # 3*4+6/215

$ expr 3 \* \( 4 + 3 \) \/ 2 # 3*(4+3)/210

Nótese que en esta última expresión el resultado correcto sería 3*(4+3)/2 = 10.5, pero el comando expr sólo maneja aritmética entera, por lo tanto, truncará la parte fraccionaria de la operación. También, se debe recordar que la precedencia de la multiplicación y la división es superior a la de la suma y la resta, por lo tanto, 3*4+6/2 se evalúa como (3*4)+(6/2) = 15.

El comando expr también realiza operaciones lógicas de comparación, aceptando los operadores =, !=, >, <, >= y <=. El operador != significa no es igual a, ya que el ! se utiliza para negar. Importante: los caracteres =, !=, >, <, >= y <= también requieren ser escapados anteponiendo la diagonal invertida “\”.

Ejemplos:

$ expr 6 \< 10 # Devuelve 1, que significa cierto para expr1

$ expr 6 \> 10 # Devuelve 0, que significa falso para expr0

$ expr abc \< abd # Devuelve 1, cierto para expr1

$ y=0$ y=‘expr $y + 1’ # Incrementa y, igual que y=y+1, o bien, y=$(($y+1))1

Comando test.El comando test prueba condiciones y devuelve el valor cierto (0) o falso (distinto de 0) –esto lo hace apto para

usar en la estructura condicional if, que se estudiará más adelante –. test tiene dos formas equivalentes:

test expresión

R. M. J. y S. R. T. M. FIE 2013 [17]

Page 18: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

[ expresión ]

En donde expresión puede ser una evaluación de:

1. Cadenas de caracteres:

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

-n CADENA Verdadero si la longitud de la cadena es distinta de cero.

CADENA1 = CADENA2 Verdadero si las cadenas son iguales.

CADENA1 != CADENA2 Verdadero si las cadenas son distintas.

CADENA Verdadero si la cadena no es nula.

CADENA1 < CADENA2 Verdadero si CADENA1 es menor que CADENA2, en orden alfabético del código ASCII.

Importante: Se debe tener en cuenta que los símbolos como “<” deben ser escapados dentro de una construcción que utilice la forma “[ expresión ]” del comando test.

2. Enteros:

entero1 -eq entero2 Verdadero si entero1 = entero2

entero1 -ne entero2 Verdadero si entero1 != entero2

entero1 -gl entero2 Verdadero si entero1 > entero2

entero1 -lt entero2 Verdadero si entero1 < entero2

entero1 -ge entero2 Verdadero si entero1 >= entero2

entero1 -le entero2 Verdadero si entero1 <= entero2

3. Archivos: Suponiendo que archivo contiene la ruta y el nombre de un archivo:

-b archivo Verdadero si existe archivo y es un dispositivo de bloques.

-c archivo Verdadero si existe archivo y es un dispositivo de caracteres.

-d archivo Verdadero si existe archivo y es un directorio.

-e archivo Verdadero si existe archivo.

-r archivo Verdadero si existe archivo y tiene permiso de lectura.

-s archivo Verdadero si existe archivo y tiene tamaño mayor que 0.

-w archivo Verdadero si existe archivo y tiene permiso de escritura.

-x archivo Verdadero si existe archivo y tiene permiso de ejecución.

R. M. J. y S. R. T. M. FIE 2013 [18]

Page 19: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

4. Expresión lógica: Si exp, exp1 y exp2 contienen expresiones lógicas:

!exp Negación.

exp1 –a exp2 Y lógico o AND.

exp1 –o exp2 O lógico u OR.

Los operadores “-a” y “–o” son similares a los operadores de comparación de bash “&&” (AND) y “||” (OR), respectivamente; y, generalmente, se utilizan dentro de los corchetes dobles.

[[ exp1 && exp2 ]]

Ejemplos:

1. test devuelve cierto ante una cadena no vacía, y falso ante una cadena vacía:

$ if test "cadena" ; then echo Cierto ; else echo Falso; fiCierto

$ if test "" ; then echo Cierto ; else echo Falso ; fiFalso

$ if [ cadena ] ; then echo Cierto ; else echo Falso; fiCierto

$ if [ ] ; then echo Cierto ; else echo Falso ; fiFalso

2. test prueba una cantidad de condiciones y situaciones según la opción elegida:

$ if [ -f archivo_prueba ]; then echo "Existe archivo_prueba"; \else echo "No existe archivo_prueba" fi

La condición [ -f archivo_prueba ] es cierta si archivo_prueba existe y es un archivo normal.

3. Comparar cadenas de caracteres: “=” para igualdad y “!=” para desigualdad. Algunos ejemplos son:

[ $DIR = $HOME ][ $LOGNAME = "usuario1" ][ $RESULTADO != "error" ]

4. La condición siguiente devuelve falso si la variable VAR1 no está definida.

[ "$VAR1" ]

Las comillas dan la cadena nula cuando VAR1 no está definida, sin comillas no habría cadena y bash señalaría un error de sintaxis.

R. M. J. y S. R. T. M. FIE 2013 [19]

Page 20: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

5. Las condiciones como “–eq” comparan la igualdad de expresiones que resultan en un número entero.

[ expresión_numérica1 -eq expresión_numérica2 ]

6. El comando test se usa generalmente para determinar si un comando se completó con éxito, en cuyo caso el valor devuelto es 0. El script siguiente crea un archivo si no existe.

#!/bin/sh# archivo_nuevo.sh# Recibe un nombre de archivo y lo crea; si ya existe, indica tal hecho.

if [ -f $1 ]then echo El archivo $1 ya existeelse touch $1 echo Se creó el archivo $1fi

echols –l $1 # Mostrar la información relativa al archivoecho Fin

Nota: El comando touch crea archivos vacíos (si no existen).

7. Otros operadores aceptados por test son “-a” (AND) y “-o” (OR).

#!/bin/sh# permisos_archivo.sh# Indica si un archivo tiene permisos de lectura y escritura.

if [ -r $1 -a -w $1 ]then echo El archivo $1 se puede leer y escribir.else echo Al archivo $1 le falta algún permiso.fi

echols -l $1echo Fin

8. Cont test también se pueden utilizar los operadores para cadenas: #!/bin/sh# cadena_nula.sh# Indica si una cadena es de longitud cero, es decir, vacía.clearCADENA='' # Si ponemos un espacio, la cadena ya no será nulaif [ -z "$CADENA" ]then echo "\$CADENA esta vacía."else

R. M. J. y S. R. T. M. FIE 2013 [20]

Page 21: dep.fie.umich.mxdep.fie.umich.mx/~stinoco/archivos/ProgramacionShellP...  · Web view2013-11-02 · Programación en Shell. La autora original de este documento es la M. en I. Rosalía

Laboratorio de Herramientas Computacionales

echo "\$CADENA no esta vacía."fi

echoecho Fin

R. M. J. y S. R. T. M. FIE 2013 [21]