Sie sind auf Seite 1von 12

Programacin bsica del Shell

En esta seccin se trabaja con shell-scripts que son programas multipropsitos ejecutables creados en lenguaje del shell. Una vez creado el shell-script se le deben asignar los permisos de ejecucin correspondientes. Y asegurarse de ejecutarlo correctamente con alguna de las tres siguientes opciones: Nota: El smbolo % indica el prompt, NO es necesario teclearlo al practicar 1. 2. 3. % ./prueba % sh prueba /home/usuarios/mike/prueba

En la primera opcin se le especifica al shell que el archivo prueba se encuentra en el directorio actual (esto puede evitarse si se agrega el home directory al path dentro del archivo personal .profile), y en la segunda opcin se llama a un shell exclusivo para la ejecucin del programa prueba; justo despus de que termine de correr prueba terminar tambin el shell. En la tercera opcin se usa la ruta absoluta de ubicacin del archivo.

Variables Las variables manejadas en el shell se conocen como de entorno o de ambiente dado que al finalizar el shell, los valores de estas variables se pierden. Al declarar una variable, sta puede llevar cualquier cadena de caracteres no blancos. Ejemplos: % persona=pepito % echo persona persona % echo $persona pepito % echo \$persona $persona % echo $persona $persona % echo $persona pepito Se declara la variable persona con el valor pepito. El signo de igual no debe llevar espacios ni antes ni despus. Siguiendo el ejemplo, con el comando echo se muestra cualquier cadena como es persona en la salida estndar, pero si a la cadena se le antecede el carcter $ mostrar el valor asociado a la variable persona. Para poder mostrar el carcter $ se usa la diagonal invertida antes de la cadena o se encierra entre comillas simples la cadena. En el ltimo comando del ejemplo se denota que las comillas dobles no evitan que el shell sustituya la cadena por el valor de la variable.

Ejercicio: Declaren la variable nombre con su nombre personal.

Variables de slo lectura En el ejemplo siguiente se declara la variable amigo como de slo lectura, (desde luego despus de que se ha instanciado) y as al tratar de cambiar su valor el mensaje es elocuente: Ejemplo: % amigo=pepito % readonly amigo % amigo=lolita bash: amigo: readonly variable

El comando readonly sin argumentos despliega una lista de variables de slo lectura. La instruccin readonly no tiene sentido inverso, por lo que una vez instanciada la variable y establecida como readonly no puede quitrsele este atributo. Ejercicio: la variable nombre hganla slo lectura e intenten modificarla.

Variables Argumentos % cat > hola > echo El Nombre de este archivo es: $0 CTRL-D %chmod 750 hola % hola El Nombre de este archivo es: hola En este ejemplo se crea un archivo hola que contiene una llamada al comando echo para que muestre una cadena y al final el valor de la variable $0, la cual es el argumento cero del archivo hola, es decir su propio nombre. Se le dan los derechos necesarios y se ejecuta el comando. $0 $1, $2, , $9 $* $# Nombre del comando llamado. Argumentos del 1 al 9 que almacena el shell Guarda todos los argumentos del comando Guarda el nmero de argumentos del com.

Ejercicio: Haga un archivo ejecutable que muestre hasta 5 argumentos y ejectelo de las tres formas propuestas al principio de este captulo.

La Variable PATH Al igual que en DOS, Permite correr desde cualquier lugar comandos que se encuentren en los directorios especificados en la variable. Por seguridad nunca se establece el directorio . es decir el actual, dentro de esta variable. Sin embargo, si y slo si no se est usando la cuenta de root, para poder correr los programas que se hagan en el home del usuario, es cmodo agregarla mediante la siguiente instruccin. % PATH=$PATH:. Si esta lnea se agrega en el archivo .profile o .bash_profile se ejecutar cada que se accese la cuenta.

Ejercicio: Altere la variable PATH agregando el directorio . y vuelva a probar el programa anterior.

Lectura de la entrada del usuario En el siguiente ejemplo se genera un programa que solicita al usuario su nombre, despus se lo imprime en pantalla. La opcin -n del comando echo elimina el salto de lnea que agrega por default el echo. % cat > pidenombre > echo n Proporcione su nombre: > read nombre > echo Mucho gusto $nombre CTRL-D Ejercicio: Hacer un programa que solicite un comando y lo ejecute.

Manejo de Procesos en Shell Scripts Al solicitar la ejecucin de un comando al shell, normalmente se genera un proceso hijo para ejecutarlo. Mientras el proceso hijo est en ejecucin, el padre duerme (as no utiliza tiempo de procesador). Una vez que el proceso hijo termina de ejecutar el programa, muere y entonces el proceso padre (que es el que se encuentra ejecutando al shell) despierta y est en espera de otro mandato. Cuando se pide la ejecucin de un proceso subordinado (en background con el comando &), ste produce un proceso hijo pero sin dormirse y sin esperar a que el proceso hijo termine. El proceso padre informa el nmero de proceso del hijo (PID) y solicita otro comando. As la ejecucin del hijo es subordinada, independiente del padre.

PID Unix asigna un nmero nico a cada proceso llamado pid, este nmero es guardado por el shell en la variable $$, y en la variable $! se guarda el valor de pid del ltimo proceso que se ejecut subordinado (background). El comando ps l permite ver en formato largo la informacin de los procesos de un usuario. Ejemplo: % echo $$ 25514 % ps PID TTY STAT TIME COMMAND 25514 p0 S 0:00 -bash 25584 p0 R 0:00 ps % ps l & [1] 25618 FLAGS UID PID PPID PRI NI SIZE RSS WCHAN STA TTY TIME COMMAND 100 1000 25514 25513 16 0 1856 1228 118999 S p0 0:00 -bash 100000 1000 25597 25514 17 0 900 512 0 R p0 0:00 ps l % echo $! 25618 Ejercicio: Elabore un programa que imprima su mismo nmero de proceso.

Comandos . y exec Estos comandos se utilizan para ejecutar programas dentro un shellscript sin que generen nuevos procesos. El comando . ejecuta otro programa como parte del proceso que est corriendo, cuando el nuevo programa termina su ejecucin, el proceso actual contina ejecutando el programa original; el programa que se llama no requiere permisos de ejecucin. Mientras que exec ejecuta el nuevo programa en lugar del proceso actual sin regresar al programa original; el nuevo programa s requiere permisos de ejecucin. Ejemplos: % cat > num echo numero de PID = $$ CTRL-D % cat > prog1 echo $0 PID = $$ . num echo Se ejecuta esta linea. CTRL-D

% prog1 prog1 PID = 27537 num PID = 27537 Se ejecuta esta linea.

% cat > prog2 echo $0 PID = $$ exec num echo Esta linea nunca se ejecuta. CTRL-D

% prog2 prog2 PID = 27538 num PID = 27538 Ejercicio: Realice estos ejemplos en su shell y compare el resultado.

Exportacin de Variables Toda variable declarada dentro de un shell-script es local al proceso que lo ejecuta, cuando un proceso genera un hijo, el padre no le pasa el valor de sus variables al hijo, y si el hijo declara variables, al trmino de este proceso, las variables pierden su valor sin regresarlas al padre. Ejemplo: % cat > prueba1 queso=americano echo $0 $$ $queso despliega echo $0 $$ $queso CTRL-D % cat > despliega echo $0 $$ $queso CTRL-D % prueba1 prueba1 27589 americano despliega 27590 prueba1 27589 americano El proceso padre prueba1 llama al proceso hijo despliega y en ste se pretende mostrar el valor de la variable queso pero no despliega tal valor ya que el padre no hereda este valor al hijo.

La manera de que estos valores sean vlidos de un proceso a otro es mediante la exportacin de variables, mediante el comando export. Esta llamada por valor otorga al proceso hijo una copia de la variable para su propio uso, esto significa que si el hijo altera el valor de la variable, el valor que sta tiene en el proceso padre no se ve afectado.

Ejemplos: % cat > prueba2 export queso queso=americano echo $0 $$ $queso cambio echo $0 $$ $queso CTRL-D % cat > cambio echo $0 $$ $queso queso=suizo echo $0 $$ $queso CTRL-D % prueba2 prueba2 27633 americano cambio 27634 americano cambio 27634 suizo prueba2 27633 americano Ejercicio: reproduzca estos ejemplos en su shell y verifique el resultado.

Comandos mltiples Pueden ejecutarse ms de una instruccin por lnea de comandos. Ejemplos: % a; b; c Esto tiene el mismo resultado que ejecutarlos por separado ya que se ejecutan en el orden que se escriben y hasta terminar uno se comienza el siguiente. la salida de a se pasa a b y de b a c, el resultado final es el nico que se observa en pantalla c se ejecuta primero ya que a y b son subordinadas (background)

%a|b|c

% a& b& c

% a& b& c& las tres son subordinadas, los resultados se obtienen conforme cada tarea es terminada pues se corren simultneamente y no secuencial. % a | b | c& la salida de a pasa a b y la salida de b a c la cual es subordinada, por lo que funciona en background los tres comandos. % (a; b)& c a y b se ejecutan secuencial y subordinadamente pero despus de c que es prioritario. % (a; b)& (c; d)& a y b en secuencia subordinada al mismo tiempo que c y d en secuencia subordinada.

Estructuras de Control if-then Formato: if condicin then comandos fi Ejemplo: % cat > compara1 echo -n 'palabra1: ' read palabra1 echo -n 'palabra2: ' read palabra2 if (test ''$palabra1'' = ''$palabra2'') then echo 'Iguales' fi echo 'fin del programa.' %compara1 palabra1: hola palabra2: hola Iguales Fin del programa.

if-then-else Formato: if condicin then comandos else comandos fi Ejemplo: % cat > compara2 echo -n 'palabra1: ' read palabra1 echo -n 'palabra2: ' read palabra2 if (test ''$palabra1'' = ''$palabra2'') then echo 'Iguales' else echo 'Diferentes' fi echo 'fin del programa.' %compara2 palabra1: hola palabra2: hello Diferentes Fin del programa. if-then-elif Formato: if condicin then comandos elif condicin then comandos else comandos fi Ejemplo: % cat > compara3 echo -n 'palabra1: ' read palabra1 echo -n 'palabra2: ' read palabra2 echo -n 'palabra3: ' read palabra3

if (test ''$palabra1'' = ''$palabra2'' a ''$palabra2'' = ''$palabra3'') then echo 'Iguales palabras 1, 2 y 3' elif (test ''$palabra1'' = ''$palabra2'') then echo 'Iguales palabras 1 y 2' elif (test ''$palabra1'' = ''$palabra3'') then echo 'Iguales palabras 1 y 3' elif (test ''$palabra2'' = ''$palabra3'') then echo 'Iguales palabras 2 y 3' else echo Diferentes todas fi

for-in Formato: for ndice-de-ciclo in lista de argumentos do comandos done Ejemplo: En el siguiente ejemplo el ndice fruta es una variable que toma su valor de la lista de argumentos que se especifica despus del in. Tal lista de argumentos puede ser tomada del resultado de correr otros comandos. % cat > frutas for fruta in manzanas naranjas peras platanos do echo $fruta done % frutas manzanas naranjas peras platanos

for Formato: for ndice-del-ciclo do comandos done

Ejemplo: % cat > argumentos for args do echo $args done % argumentos uno dos tres cuatro uno dos tres cuatro

En el ejemplo anterior el programa muestra los argumentos que se pasan al programa en la lnea de comandos. Esto se debe a que, al usar la instruccin for omitiendo el in y la lista de argumentos, el ndice del ciclo toma automticamente el valor de cada uno de los parmetros de la lnea de comandos, uno a la vez. De tal forma que la lna que dice for args es captada por el shell como for args in $* donde $* se expande en una lista de argumentos de la lnea de comandos.

while Formato: while condicin do comandos done Ejemplo: % cat > contador numero=0 while (test $numero lt 10) do echo $numero numero=`expr $numero + 1` done La utilera expr convierte sus argumentos en nmeros para que se pueda realizar el incremento en uno, luego transforma el resultado a caracteres y los enva a la salida estndar. Las comillas simples hacen que el comando que encierran sea reemplazado por su salida.

until Formato: until condicin do comandos done Ejemplo: %cat > adivina nombreclave=gina nombre=ninguno echo Adivine el nombre clave: echo until (test $nombre = $nombreclave) do echo n Su respuesta es: read nombre done echo Lo lograste! El ejemplo anterior estar solicitando un nombre hasta que se teclee el nombre gina. Las estructuras while y until son similares pero difieren en el sentido de la prueba antes del inicio del ciclo. until contina los ciclos HASTA que la condicin es verdadera (devuelve un valor cierto o de no error), rn cambio while realiza los ciclos MIENTRAS la condicin siga devolviendo valor cierto o de no error.

case Formato: case cadena-de-prueba in patrn1) comando1;; patrn2) comando2;; patrn3) comando3;; .. .. esac

Ejemplo: %cat > teclear echo n Teclee A, B o C: read letra case $letra in A | a) echo Tecle la letra A;; B | b) echo Tecle la letra B;; C | c) echo Tecle la letra C;; *) echo No tecle A, B o C;; esac El patrn de case acepta uso de comodines y cadenas especiales: * ? [] | Cualquier cadena de caracteres, se usa cuando no hay correspondencia. Cualquier carcter simple. Cierta clase de caracteres como [a,b,c,d] o [1-5] Separa elecciones alternas que satisfagan una rama particular del case.