1 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc.
Conceptos Fundamentales sobre UNIX
Laboratorio 15.2.8 Escritura de Scripts de Shell (Tiempo estimado: 60 min.)
Objetivos:
Escribir y ejecutar un script de shell simple Escribir, ejecutar y hacer debug de un script de shell ms avanzado
Trasfondo: En este laboratorio, el alumno escribir, ejecutar y har debug de s cripts de shell simples y ms complejos. Los scripts de shell bsicos son pequeos archivos que consisten en varios comandos UNIX que muestran informacin bsica del s istema o manipulan archivos. Scripts de shell ms complejos consisten en var iables y comandos de pr ogramacin incorporados que incluyen al comando read para una entr ada interactiva, los comandos condicionales if, test y case y l os comandos de bucle for, while y until.
No es un requisito que el usuario escriba scripts de s hell para utilizar o administrar un s istema UNIX. No obstante, cuanto ms se utiliza UNIX, ms encontrar el usuario instancias en las cuales una tarea llevada a c abo reiteradamente no tiene un nic o comando UNIX. Escribir un script de shell es una forma de crear un comando personalizado que puede llevar a cabo una nica tarea o una serie de tareas y puede utilizarse reiteradamente.
Herramientas / Preparacin: a) Antes de inic iar este laboratorio, el alum no deber repasar el Captulo 15 Introduccin a los Scripts de Shell. b) El alumno necesitar lo siguiente: 1. Una ID de login de us uario, por ejemplo user2 y contrasea asignadas por el instructor. 2. Una computadora que funcione con el sistema operativo UNIX. 3. Computadoras en red en el aula con el sistema de archivos de la clase instalado.
2 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc.
Utilice el diagrama del rbol de directorios del sistema de Archivos de la Clase para que lo asista en este laboratorio.
Estructura del rbol de Archivos de la Clase
Paso 1. Hacer login al CDE. Haga login con el nombre de usuario y la contrasea que le f ueron asignados por su instructor en el recuadro de entradas del CDE.
Paso 2. Acceder a la Lnea de Comandos. Haga clic con el botn der echo en el f ondo del es pacio de tr abajo y haga clic en Tools (Herramientas). Seleccione Terminal desde el men para abrir una ventana de terminal.
Paso 3. Scripts de shell simples. Un alias se utiliza normalmente para ejecutar uno o ms comandos simples separados por punto y coma (;). Un script de shell es un archivo de texto que contiene una secuencia de comandos para que el shell ejecute una lnea a la vez. Tareas complejas que involucran variables y otras funciones de programacin se logran utilizando scripts de shell.
Los siguientes son los pasos generales para crear un script de shell:
Decidir qu har el script Hacer una lista de comandos Crear un nuevo archivo para el script Identificar el shell que utilizar el script Agregar comandos y comentarios Guardar el archivo script Hacer ejecutable el archivo script Tipear el nombre del script para ejecutarlo Hacer debug y modificar el script si tienen lugar errores
a. Al nombrar un ar chivo script el alum no deber evitar utilizar el nombre de un _______alias_________________ o un ______comando_______________. b. Normalmente, los archivos script terminan con _____.sh_______________________. c. Normalmente, en qu directorio se ubican los scripts de shell creados por el usuario? _________~/bin______________________
3 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc.
d. Qu carcter se utiliza antes de un c omentario en un archivo script? ____#_________ e. Qu se agrega al script que le dice al sistema qu shell utilizar al interpretar las lneas del script? __#!bin/ksh o #!bin/bash____ Dnde se ubica esta lnea en el archivo script? __en la primera lnea_____ f. Cul es el resultado de echo date? ___Aparece la palabra date__ g. Cul es el resultado de echo `date`?El resultado del comando date (fecha y hora actual) h. Cul es el resultado de echo $LOGNAME? _El texto $LOGNAME_ i. Cul es el resultado de echo $LOGNAME? _El nombre del usuario logueado_
Paso 4. Ejecutar el script. Los scripts de shell s iempre se ejecutan en un shell separ ado. Si un script de shell se ejecuta desde el shell de una ventana de terminal, se inicia un subshell para ejecutarlo.
Siempre hay dos formas de ejecutar un script de shell. Un usuario puede utilizar el comando ksh o bash seguido del nombre del archivo script. Un usuario tambin puede hacer del archivo de script de shell un archivo ejecutable tipeando el nombre del script para ejecutarlo.
a. Qu tipeara el alum no para ejecutar el s cript llamado whoison.sh? El ar chivo whoison.sh no tiene permiso de ejecucin. __bash whoison.sh________________ b. El archivo whoison.sh tiene los permisos r w -r - - r- -. Tipee el comando para otorgar los permisos r w x r - x r - - al archivo. __chmod 754 whoison.sh___________ c. El archivo script ejecutable whoison.sh se encuentra en el dir ectorio ~/bin. Cuando el alumno tipea el ar chivo whoison.sh para ejecutarlo, el s hell muestra el mensaje command not found (no se encontr el comando). Cul es el problema? _El directorio /bin no se encuentra en el PATH______
Paso 5. Hacer debug del script. Un problema comn al escribir scripts de shell es que el s hell no inter preta el comando como lo espera el usuario.
Un usuario puede utilizar el comando ksh o bash con las opciones x (echo) y v (verbose) para ayudar a identif icar en qu par te del s cript se encuentran los problemas. La opc in x muestra cada lnea despus de haber sido interpretada por el shell y coloca un signo ms (+) despus de haber ejecutado cada lnea. La opc in v es s imilar a la opcin x excepto en que muestra los comandos antes de efectuar la sustitucin de variables y comandos.
a. Qu lnea de comandos se introdujo para generar el s iguiente resultado desde el archivo script whoison.sh? _bash -xv whoison.sh____
echo Hello $LOGNAME! + echo Hello user10! Hello user10! echo The number of users logged on is: `who | wc l` who | wc l + echo The number of users logged on is: 3 The number of users logged on is: 3 echo Todays date is: `date` date + echo Todays date is: Fri Jun 21 2002 Todays date is: Fri Jun 21 2002
4 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc.
Paso 6. Crear, ejecutar y hacer debug de un script de shell simple.
a. Cree un script llamado firstscript.sh en el dir ectorio home del us uario que haga lo siguiente: 1. Especificar qu shell utiliza el script para interpretar los comandos de script. 2. Describir el propsito del script, que es mostrar los usuarios e imprimir la fecha y el calendario actual. 3. Mostrar en la pantalla The number of users logged on is : (La cantidad de usuarios loggeados es:) seguido del resultado correcto. 4. Mostrar en la pantalla Todays date is: (La fecha de hoy es:) seguido del resultado correcto. 5. Mostrar en la pantalla Below is the current months calendar (A continuacin se muestra el calendario del mes en curso) seguido del resultado correcto. b. Cree un directorio bin en el dir ectorio home del alumno, preparndose para el prximo archivo script del alumno. c. Modifique la var iable PATH en .pr ofile o .bas h_profile para que el dir ectorio bin que acaba de c rearse en el dir ectorio home del alum no se encuentre en la r uta de bsqueda. d. Cree otro script llamado info.sh en el dir ectorio ~/bin. El script deber contener comentarios y hacer lo siguiente cuando se lo ejecute: 1. Declarar que el script ha de ejecutarse en los shells Korn o Bash. 2. Despejar la pantalla. 3. Saludar a la persona que se logge. 4. Mostrar el nombre de host (uname n). 5. Mostrar la fecha actual. 6. Mostrar el calendario del mes en curso. 7. Mostrar el directorio de trabajo actual. 8. Mostrar el contenido del directorio actual. 9. Mostrar una lista de los procesos que se ejecutan en el shell actual. 10. Imprimir en grandes letras Have a Nice Day (Que tenga un buen da). e. Ejecute el script info.sh iniciando primero un shell Korn. Luego, hgalo ejecutable para el propietario del archivo y para cualquiera que se encuentre en el mismo grupo. f. Ejecute el script utilizando ksh x, ksh v y ksh xv para hacer debug del mismo.
Paso 7. Scripts complejos utilizando programacin del shell. Incorporado a c ada shell UNIX hay un lenguaj e de pr ogramacin completo que consiste en comandos y construcciones que pueden utiliz arse para crear scripts ms complejos ms all de simplemente hacer una lista de una serie de comandos.
Adems de contener comandos de programacin del shell tales como if, else, read, case, while y exit, los scripts complejos utilizan variables predefinidas y definidas por el usuario.
Variables Una variable es un plac eholder o m arcador de pos icin para la inf ormacin requerida por los procesos para que puedan funcionar de manera apropiada. Una variable tiene un nombre y retiene un valor. Cambiar el valor de una variable se denomina configurar la variable. Existen dos tipos de variables utilizadas en los scripts de shell, las variables del shell y las variables del entorno.
Las variables del shell son mantenidas por el shell y slo son conocidas por el shell actual. Estas variables son variables locales y pueden visualizarse por medio del comando set. Las variables del entorno son variables conocidas por el shell actual y todos los shells hijos o subshells.
Las variables del entorno pueden mostrarse por medio del comando env.
5 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc. Las variables locales se configuran utilizando el f ormato VARIABLE=valor. Por ejemplo, BACKUPDIR=/home/user2/myfiles configura la variable llamada BACKUPDIR (backup directory directorio de respaldo), que es igual al valor de /home/user2/myfiles. Los nombres de las variables van en maysculas por convencin pero pueden ir en minsculas. Utilice el comando echo para mostrar el valor de una variable.
Parmetros posicionales Los parmetros posicionales son variables del s hell especiales incorporadas que pueden proporcionar el nombre del ar chivo script o ar gumentos al s cript a medida que se ejecuta. Sus valores se toman de argumentos de la lnea de comandos.
Parmetro Propsito y ejemplo $0 Comando o nombre del script echo The name of the script file is $0 $1 - $9 Nmero de argumento de la lnea de comandos echo The first argument is: $1 $* Todos los argumentos introducidos en la lnea de comandos echo The args specified on the command line = $* $# Cantidad de argumentos introducidos en la lnea de comandos echo The number of args on the command line = $#
Entradas interactivas Para hacer ms flexible y amigable con el usuario a un script de shell, el alumno puede hacer que el script haga una pausa y pida una nic a lnea de entr ada. Esto se logra por medio del comando echo para pedir entradas al alumno y del comando read para hacer una pausa y recibir entradas del teclado. Lo que s ea que intr oduzca el alum no se almacena en el nombre de la variable especificada despus del c omando read. Las entradas interactivas son una funcionalidad muy potente de los scripts de shell.
echo Enter your name: \c #Prompt the user for name read name #Read from keyboard and save input in the name variable
(echo Introduzca su nombre: \c #Pedir el nombre del usuario read name #Leer desde el teclado y guardar la entrada en la variable name)
a. Cree un s cript llamado whoison.sh en el dir ectorio ~/bin que aceptar un nombre de usuario como argumento, y luego muestra todas las lneas del resultado del comando who que contiene informacin acerca del us uario especificado. Especficamente, el script har lo siguiente: 1. Especificar qu shell utiliza el script para interpretar los comandos del script. 2. Leer el primer argumento especificado cuando se ejecuta el script y asignarlo a la variable llamada user. 3. Mostrar todas las lneas del r esultado del comando who que c ontiene informacin acerca del usuario especificado. b. Cree y luego ej ecute el script grepfor.sh que se muestra a continuacin. Utilice root para el patrn y /etc/passwd como archivo a bus car la pr imera vez que el alum no ejecuta el script. #!/bin/ksh # grepfor.sh prompts for a pattern and a file then generates output echo Enter the pattern to search for: \c or echo -e Enter the pattern to search for: \c (bash) read pattern echo Enter the filename to search: \c or echo -e Enter the filename to search: \c (bash)
6 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc. read filename echo echo Results: grep $pattern $filename c. Modifique el script para que cuando el alumno lo ej ecute y especifique user para el patrn y /etc/passwd para el ar chivo el r esultado sea la c antidad de c uentas del usuario del ar chivo password que tengan user en el nombre. Qu ha cambiado? ______________________________
Paso 8. Scripts complejos que utilizan los comandos if, test y case. Para ser til, un pr ograma debe poder probar condiciones y tomar decisiones. El programa debe poder examinar el resultado de un comando y elegir entre dos o ms cursos de accin. La prueba ms simple es determinar si una c ondicin es verdadera o f alsa. Si la c ondicin es verdadera, ejecute cualquier cantidad de comandos subsecuentes. Si la c ondicin no es verdadera, contine con el script.
Los comandos que llevan a c abo algunas tareas basndose en si una condicin tiene xito o f alla se denominan comandos condicionales. Los tres comandos condicionales ms frecuentemente utilizados son if, test y case.
El Formato del Comando if-then: if (si) el comando tiene xito then (entonces) ejecutar comando o comandos fi El Formato del Comando if-then-elif (else if): if el comando tiene xito then ejecutar comando o comandos elif el comando tiene xito then ejecutar comando o comandos else (de lo contrario) ejecutar comando o comandos fi El Formato del Comando if-then-else:
if el comando tiene xito then ejecutar comando o comandos else ejecutar comando o comandos fi El comando condicional incorporado al shell test se utiliza a menudo para probar una o ms condiciones a continuacin del comando if. El Formato del Comando if-test: if test expresin o if [ expresin ] then ejecutar comando o comandos fi El comando del shell incorporado case se utiliza cuando hay muchas condiciones que probar. Formato del comando: case value in value1) Comando Comando ;; *) Comando ;; esac
El valor de una variable de caso se compara con valor1, valor2, etc., hasta que coincida.
7 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc. a. Modifique el s cript whoison2.sh del dir ectorio ~/bin para que acepte un nombre de usuario como argumento y si el us uario est loggeado, muestre <specified user> is currently logged on (<el usuario especificado> est loggeado actualmente). b. Cree un script test1.sh en ~/bin que contenga las siguientes lneas: #!/bin/ksh # test1.sh script to demonstrate the test command echo Do you want a long listing of the files in the current directory? echo enter y for Yes or n for No:\c c. Modifique el script test1.sh para que: Lea la respuesta dada por el us uario que ej ecuta el s cript en una var iable llamada answer. Pruebe la r espuesta introducida por el us uario que ejecuta el script. Si la respuesta es y, despeje la pantalla y ejecute un listado largo. De otro modo, si la respuesta es n, ejecute ls sin ninguna opcin. Qu lneas que restan se agregaron al archivo script para satisfacer los requisitos a y b?
Paso 9. Scripts complejos que utilizan control de flujo (bucles). El alumno puede utilizar bucles para controlar el flujo de ejecucin de un script. Un bucle repite una secuencia de instrucciones reiteradamente hasta satisfacer una condicin predeterminada.
A menudo un script tiene que ver con llevar a cabo la misma operacin o conjunto de operaciones en cada archivo de un dir ectorio o lista, cada lnea de un archivo, o cada palabra de una lnea. El shell proporciona tres construcciones de buc les para lograr este tipo de accin: el bucle for, el bucle while, y el bucle until.
El bucle for El bucle for ejecuta una lista de comandos una vez por cada valor de una variable de bucle. Formato del Comando: for variable in list do Comandos done El bucle while El bucle while ejecuta reiteradamente un grupo de comandos dentro del cuerpo del bucle hasta que la condicin de prueba en la expresin se vuelve falsa. En otras palabras, mientras la expresin es verdadera, ejecute estos comandos. Formato del Comando: while comando do Comandos done El bucle until El bucle until es muy similar al bucle while pero ejecuta una serie de comandos mientras un comando contina fallando, estado de salida no igual a cero. Cuando el comando finalmente se ejecuta exitosamente, el bucle se termina y la ejecucin pasa al primer enunciado que sigue a la construccin done. La condicin until se verifica en la parte superior del bucle, no en la inferior. Formato del Comando: until comando do Comandos done
8 8 Conceptos Fundamentales sobre UNIX 2.0-Laboratorio 15.2.8 Copyright 2002, Cisco Systems, Inc. a. Qu hace el siguiente script de bucle for cuando se lo ejecuta? #!/bin/bash for FILE in file* do ls -l $FILE done echo all done! b. Cree y luego ejecute el script de shell que figura arriba y nmbrelo loop1.sh. Colquelo en ~/bin. c. Modifique el s cript loop1.sh para que muestre un lis tado largo de todos los archivos introducidos en la lnea de c omandos. Por ejemplo $ loop1.sh file1 file2 o $ loop1.sh file*, en lugar de aqullos especificados en el script, como arriba. d. Cree un script llamado loop2.sh y colquelo en ~/bin. El s cript utilizar el bucle until. Al ejecutarse, el script verificar para ver si un usuario, especificado como argumento del script, est loggeado. Si el us uario especificado no est actualmente loggeado, el script mostrar el m ensaje <specified user> is not logged on (<el usuario especificado> no est loggeado) y dormir durante cinco segundos antes de intentar nuevamente. Una vez que el usuario especificado se loggea, el s cript mostrar el mensaje <specified user> is logged on. e. Pruebe el script loop2.sh en una ventana de ter minal utilizando el nombre de usuario del alumno como argumento para el s cript. Por ejemplo, $ loop2.s h user1. Qu mostr el script? ___________________________ f. Ejecute nuevamente el script utilizando un nombre de usuario diferente. El nombre de usuario debe f igurar en la lis ta del archivo /etc/password. Por ejemplo, $ loop2.sh user5. Qu mostr el script? ________________________ g. Deje el script en ej ecucin y abra otra ventana de ter minal. Utilizando la utilidad telnet, el alumno deber loggearse a s u propio sistema. Utilice $ telnet <nombre de host o direccin ip del alumno> para loggearse con el nombre de usuario especificado como argumento del script del alumno. En este ejemplo sera user5. Qu mostr el script que se ejecuta en la primera ventana de terminal? ____________________________ h. Cree un nuevo script llamado counter1.sh y colquelo en el directorio ~/bin. Introduzca las siguientes lneas de este script de bucle while: #!/bin/ksh # counts from 1 to 5 then displays I can count! # num=0 #initialize the count variable while [ $num -lt 6 ] #loop while $num is less than 6 do echonumber: $num num=`expr $num + 1` #increment count by one done echo I can count ! i. Ejecute el s cript, haga debug de s er necesario. Cont el s cript de uno a cinco? _________ Qu debe cambiarse en el script para que cuente de uno a cinco? ______________________________________________________________
Paso 10. Cerrar la ventana de terminal y hacer logout. Haga doble clic en el botn de r aya del extremo superior izquierdo de la pantalla, luego haga c lic en el cono EXIT (SALIDA) del panel frontal.