Vous êtes sur la page 1sur 15

Apuntes de Unix Shell Script.

Jos Navero
Esta Documento trata de la programacin en Shell Script desde un nivel bsico.

http://www.namocode.com http://devthisblog.namocode.es/

http://www.namocode.com http://devthisblog.namocode.es/ .com/

ndice
1. 2. 3. 4. 5. Una pequea introduccin. .................................................................................... 3 Que necesitamos para escribir un Shell script. ...................................................... 3 Ejecutando un Shell Script. ................................................................................... 3 Nuestro primer Shell Script. .................................................................................. 3 Algunos conceptos bsicos. ................................................................................... 3 Sobre comandos: ........................................................................................................... 3 Comentarios: ................................................................................................................. 4 Salida por pantalla: ........................................................................................................ 4 6. Variables. ............................................................................................................... 4 El comando Export ........................................................................................................ 4 El comando set .............................................................................................................. 4 Variables posicionales y automticas ............................................................................ 4 Arrays ............................................................................................................................ 5 7. Salida por pantalla y entrecomillado. .................................................................... 5 Caracteres no imprimibles............................................................................................. 5 Entrecomillar ................................................................................................................. 6 Ejecucin de rdenes..................................................................................................... 6 Redireccionamiento....................................................................................................... 6 Segundo plano ............................................................................................................... 7 8. Shell Script, El lenguaje. ....................................................................................... 7 Estructuras de control .................................................................................................... 7 La instruccin IF. ....................................................................................................... 8 La instruccin CASE. ................................................................................................ 9 Bucles ............................................................................................................................ 9 Bucle WHILE ............................................................................................................ 9 Bucle UNTIL ........................................................................................................... 10 Bucle FOR ............................................................................................................... 10 Pequea reflexin. ....................................................................................................... 10 Varios comandos ..................................................................................................... 11 Comando test ........................................................................................................... 11 Comando break ........................................................................................................ 11 Comando continue ................................................................................................... 12 Comando sleep ......................................................................................................... 12 Comando expr .......................................................................................................... 12 Anexo I. Ejemplos .......................................................................................................... 13

http://www.namocode.com http://devthisblog.namocode.es/ .com/ 1. Una pequea introduccin. Este escrito da por supuesto el conocimiento de los comandos de Unix / Linux. Los Script de Shell es una forma de realizar tareas repetitivas, ejecucin de comandos Unix y como veremos a continuacin la programacin en Shell script es muy potente. Para este manual he utilizado sco Unix y el Shell ksh. Al igual que ksh existen diferentes shells. Una Shell es un intrprete de comandos en nuestro caso en Unix / Linux. El ms utilizado (por mi parte en Ubuntu es el bash). Como ya he indicado antes este manual lo he orientado a sco unix y ksh (Korn Shell) aunque sirve para cualquier otro shell. 2. Que necesitamos para escribir un Shell script. Bsicamente, necesitamos un Shell como los descritos anteriormente (obviamente), tener un Linux instalado, un unix, live cd etc. Y para escribir el script necesitamos un editor, como el nano, el vim, el vi o lo que ms nos guste, el caso es que edite. 3. Ejecutando un Shell Script. Una vez que tenemos nuestro script escrito, podemos ejecutarlo de diferentes formas. Mediante un redireccionamiento de entrada. ejemplo: ksh < fichero Pasando el fichero como argumento. ejemplo: ksh fichero argumento 1 arg2 ... Si ponemos ksh -x fichero, hace una traza comprobando que funcione bien Convertir el fichero en un ejecutable con la orden chmod.

4. Nuestro primer Shell Script. Para hacer nuestro primer script de Shell, debemos crear un archivo con un editor de texto (ejemplo vi). #!/bin/ksh echo Hola que tal estas Qu hace este script? La primera lnea indica el Shell que se va a utilizar en nuestro caso el ksh, la segunda lnea muestra por pantalla la frase Hola que tal estas 5. Algunos conceptos bsicos. Sobre comandos: Es importante destacar que Unix es case sensitive, es decir diferencia maysculas y minsculas, es decir no es lo mismo echo que Echo

http://www.namocode.com http://devthisblog.namocode.es/ .com/ Comentarios: Si deseamos poner comentarios en nuestro script debemos usar la almohadilla #Esto es un comentario en un script de Shell. Salida por pantalla: Como hemos visto en nuestro primer script, es posible mostrar por pantalla textos o variables con la orden echo. 6. Variables. Para utilizar una variable basta con hacer una asignacin como vemos a continuacin. variable = valor Esta orden establece un valor en una variable. Si deseamos mostrar el contenido de una variable utilizaremos la orden echo $variable Si deseamos introducir un dato a una variable desde el teclado, utilizamos la orden read seguido de la variable. read variable Si adems deseamos introducir un texto antes de leer la variable usamos read de la siguiente forma: read variable? texto

El comando Export export imprime en pantalla una lista de variables exportadas. Si deseamos exportar una variable, utilizamos export variable (sin comillas).

El comando set Este comando set Sirve para leer o escribir variables.

Variables posicionales y automticas Existen variables que son activadas por el Shell de forma automtica, estas variables tienen gran importancia por su utilidad a la hora de crear nuestros scripts. En la siguiente tabla veremos dichas variables.

http://www.namocode.com http://devthisblog.namocode.es/ .com/ Variable Descripcin $? Variable que indica el cdigo de retorno del script. Retorna 0 si se ha ejecutado con xito y distinto de 0 si ha habido un error. $$ Variable que almacena el pid del procedo de ejecucin del script. $! Variable que contiene el nmero de identificacin del ltimo proceso en background. $1, $2 Variables posicionales. Son las variables que le pasamos por lnea de $9, ${10} comandos a nuestro script de Shell. Nota, desde la posicin 10 en adelante deben llevar llaves {} $# Variable que contiene el nmero total de parmetros que se le pasan al script. $* Variable que crea una cadena de texto con todas las variables pasadas.

Arrays Adems de las variables normales, posicionales y automticas, podemos crear arrays. Dichos arrays se definen de la siguiente forma: set -A nombre valor1 valor2 ...... valorn Para mostrar la tercera posicin de un array, utilizamos el comando: echo ${nombre[3]} Por ltimo si deseamos ver el array completo basta con teclear echo ${nombre[*]} 7. Salida por pantalla y entrecomillado. Como ya sabemos, la orden echo muestra por pantalla los textos o variables que deseemos. Podemos darle formato a esta salida, todo depende del entrecomillado y de los caracteres no imprimibles como vemos a continuacin.

Caracteres no imprimibles Estos caracteres son: \n Introduce un salto de lnea en la frase \c Contina en la misma lnea. \e Carcter Escape. \t Escribe un tabulador. Ejemplo: echo Hola\n Me llamo Juan La salida de este comando es la siguiente: Hola Me llamo Juan

http://www.namocode.com http://devthisblog.namocode.es/ .com/ Entrecomillar Es muy importante entrecomillar correctamente los textos y las variables ya que depende del entrecomillado la forma en que vamos a mostrar o utilizar nuestras variables. Existen diferentes formas de entrecomillar. Al teclear comillas simples , todo lo que va entre estas comillas pierde su significado, pasando a ser todo texto. Sin Embargo, las comillas dobles podemos mostrar los valores que contienen las variables. Otra forma de entrecomillar es utilizar la barra inversa \ con esta barra podemos cubrir caracteres no imprimibles. De esta forma podremos mostrar comillas, por ejemplo. Adems de poder entrecomillar podemos utilizar los parntesis para poder agrupar diferentes ordenes. Ejemplos:
Orden echo * echo \* variable = 1 echo Prueba variable variable = 1 echo variable Resultado Muestra los archivos (funciona igual que cuando ponemos ls) Muestra el carcter * por pantalla Muestra por pantalla prueba variable Muestra por pantalla 1

Ejecucin de rdenes Existen varias formas de ejecutar las diferentes rdenes en Shell Script. Punto y coma: Se utiliza para ejecutar una orden despus de otra. orden1;orden2 Or(||): Ejecuta las dos rdenes al mismo tiempo. orden1||orden2 And (&&): Se ejecuta la segunda orden si la primera se ha ejecutado con xito. Redireccionamiento Una vez que ejecutemos una orden, tenemos la posibilidad de enviar el resultado a un dispositivo diferente de la pantalla. Por ejemplo, podemos enviar el resultado a un archivo. Ejemplos: pwd;date > resul En este caso, primero ejecuta el comando pwd y posteriormente crea el archivo resul donde insertar el resultado de ejecutar date. (pwd;date) > resul Est orden similar a la anterior la diferencia (los parntesis) en vez de introducir el resultado de date insertar el resultado de ejecutar ambas ordenes. Como podemos ver con el smbolo mayor que realizamos los redireccionamientos. Si ponemos un nico smbolo borra el fichero si existe y lo crea nuevo. Sin embargo al poner dos mayor que seguidos (>>) El resultado que tenemos es que si el fichero no

http://www.namocode.com http://devthisblog.namocode.es/ .com/ existe se crea y si existe, anexa el resultado en el fichero. Por otro lado adems de recoger los resultados, tambin podemos redireccionar los errores de la siguiente forma: Pwd > resul 2 > error En este ejemplo almacenamos en el fichero resul el resultado de ejecutar el comando y si se produce un error, dicho error se almacena en el fichero error.

Segundo plano Unix / Linux nos ofrece la posibilidad de ejecutar rdenes y enviarlas a segundo plano, es decir, mientras se ejecuta una orden podemos seguir ejecutando otras rdenes. Esto combinado con los parntesis o creando un Script de Shell nos permite realizar operaciones muy potentes. Para poder enviar una orden a segundo plano usamos el &. Ejemplos: orden1;orden2& En este ejemplo, se ejecuta la primera orden y despus la siguiente orden la ejecuta en segundo plano. (orden1;orden2)& En el segundo ejemplo, las dos rdenes se ejecutarn en segundo plano Bsicamente, para poder trabajar con los comandos en primer y segundo plano se usan 3 comandos. Jobs: Muestra los comandos que estn en ejecucin Fg: pasa a primer plano un comando Bg: pasa a segundo plano un comando Si pulsamos control+z durante la ejecucin de una orden, dicha orden se detiene y podemos pasarla a segundo plano con bg o primer plano con fg. Mientras que con jobs muestra las ordenes que estn en proceso. 8. Shell Script, El lenguaje. Shell Script tiene la misma funcionalidad que cualquier lenguaje de programacin, adems, de la potencia de un lenguaje de programacin, podemos utilizar cualquier comando que pueda usar Linux/Unix, lo que nos da una gran potencia.

Estructuras de control Son estructuras que permiten ejecutar entre un bloque u otro, en base a una condicin previamente indicada. Las estructuras posibles en Shell script son las siguientes if y case que veremos a continuacin.

http://www.namocode.com http://devthisblog.namocode.es/ .com/ La instruccin IF. Se encarga de elegir ente dos o ms bloques, en el diagrama podemos ver claramente el funcionamiento de la instruccin.

Se cumple Bloque 1 Variable IF condicin Bloque 2 No se cumple Resto del programa

La sintaxis de la instruccin IF es la siguiente: Para un if sencillo: if <comando> then Bloque de instrucciones fi Para un if con dos bloques if <comando> then Bloque de instrucciones 1 else Bloque de instrucciones 2 fi Y por supuesto podemos anidar varios if, es decir, meter una instruccin if dentro de otro. if<comando> then Bloque de instrucciones 1 else if<comando> then Bloque de instrucciones 2 else Bloque de instrucciones 3 fi fi

http://www.namocode.com http://devthisblog.namocode.es/ .com/ La instruccin CASE. Esta instruccin es una instruccin similar al if, es decir secuencia de control. El siguiente diagrama muestra el funcionamiento de esta instruccin. Si variable

Vale X Vale Y Vale Z

Bloque 1 Bloque 2 Bloque 3 Resto del programa

La sintaxis de esta instruccin es la siguiente:

case variable/expresin in 1) Orden1 Orden2 ;; [2-4]) Orden1 Orden2 .;; *) Orden1 Orden2 ; esac Analizando el comando anterior, podramos decir, si la variable es igual que uno, ejecuta el primer bloque. Para salir del bloque se ponen dos puntos y comas seguidos como se pueden ver. Si nos fijamos en el segundo bloque, hace referencia a un rango es decir, si la variable o expresin est dentro del rango sea puede ser el valor 2, 3 o 4. Por ltimo el asterisco, indica que si no es ninguna de las opciones anteriores entra su bloque. Como en todos los comandos, esac indica el final del comando case. Bucles Los bucles, como en cualquier lenguaje de programacin sirven para repetir bloques de comandos. Bucle WHILE Realiza un bucle mientras se cumpla una condicin determinada. La sentencia del bucle es la siguiente:

http://www.namocode.com http://devthisblog.namocode.es/ .com/ while comando do Orden1 Orden2 done Mientras se cumpla repetir. Bucle UNTIL Realiza un bucle hasta que se cumpla una condicin determinada. La sentencia del bucle es la siguiente: until comando do Orden1 Orden2 done Bucle FOR Realiza una iteracin un nmero determinado de veces, La sentencia del bucle es la siguiente: for variable in valor1 valor2 valorn do Orden1 Orden2 done A continuacin se muestra un ejemplo del uso del bucle for. for a in lunes martes mircoles jueves do echo $a done Este ejemplo muestra por pantalla la siguiente lnea: Lunes martes mircoles jueves Pequea reflexin. Hasta aqu todo perfecto, pero ahora Qu comandos uso en las evaluaciones? Cmo utilizo todo esto?.

10

http://www.namocode.com http://devthisblog.namocode.es/ .com/ A continuacin ir mostrando los comandos ms comunes, as como algunos ejemplos de Shell script. Varios comandos Comando test Este comando es el comando evaluador ms utilizado en los bucles o sentencias de control. Puede trabajar sobre valores numricos, ficheros o cadenas de texto. Uso sobre valores numricos. -eq: igual -ne: distinto -gt: mayor que -lt: menor que -ge: mayor o igual que -le: menor o igual que

Operadores

Este tipo de operadores, solamente admite nmeros enteros positivos y negativos.

Uso sobre ficheros. -s: comprueba que existe y no est vacio -e: solo comprueba si existe -f: comprueba si es un fichero convencional -d: comprueba si es un directorio -w: comprueba si tiene permiso de escritura -r: comprueba si tiene permiso de lectura -x: comprueba si tiene permiso de ejecucin.

Operadores

Uso sobre cadenas.

Operadores

-z: indica si la cadena tiene longitud cero -n: Indica si la cadena no tiene longitud cero.

Comando break Con este comando podemos interrumpir una secuencia de control como puede ser un bucle, si se produce una accin concreta podemos indicar que deje de ejecutar el bucle rompindolo para continuar con la ejecucin del script.

11

http://www.namocode.com http://devthisblog.namocode.es/ .com/ Comando continue Este comando, forzamos a un bucle a que realice otra iteracin, sin que acabe de realizar todos los comandos o evaluadores que sean posteriores. Comando sleep Este comando realiza una pausa de uno a varios segundos en funcin del tiempo indicado. La sintaxis es la siguiente: sleep 2 (realiza una pausa de 2 segundos). Comando expr Este comando realiza una operacin bsica entre dos variables o ms. Un ejemplo de su uso podra ser este: a= expr $a + 1 Para ver ms informacin sobre algunos script en el Anexo I adjunto varios ejemplos de script donde se puede ver el uso de los comandos, evaluadores, bucles etc.

12

http://www.namocode.com http://devthisblog.namocode.es/ .com/ Anexo I. Ejemplos Ejemplo 1. Script Hola mundo #!/bin/sh echo Hola Mundo

Ejemplo 2. Script con una toma de decisiones #!/bin/sh clear echo Introduzca un numero read numero res= expr $numero % 2 if test res eq 0 ; then echo El numero es par else echo El numero es impar fi echo Fin programa

Ejemplo 3. Este script que reciba un directorio como primer parmetro, y a continuacin una lista de archivos. El script valida que los parmetros recibidos sean realmente archivos y luego copiarlos al directorio recibido #!/bin/sh if test $# -le 1; then echo Argumentos no validos exit fi if test d $1; then carpeta=$1 for I in $*; do if test f $i; then cp $i $carpeta echo Archivo $i copiado en $carpeta fi done else echo Argumento no valido fi

13

http://www.namocode.com http://devthisblog.namocode.es/ .com/ Ejemplo 4. Este script muestra un men con los nombres de login de los usuarios conectados y al elegir uno se nos muestre el nombre completo del mismo as como su la ruta de su directorio personal. #!/bin/sh clear usuario='' echo "--------------- MENU USUARIOS -----------------" echo "-----------------------------------------------" who -s | cut -f1,2 -d ' ' | cut -f1,1 -d ' '|nl echo "-----------------------------------------------" echo echo "Escribe el nombre de uno de los usuarios logados en el sistema" echo "para ver su alias y la ruta de su carpeta personal." echo "Si ves algun usuario repetido es porque estas usando una" echo "terminal de comandos con ese usuario." echo echo -n "Usuario :" read usuario if [ -z $usuario ]; then echo echo "No se ha introducido ningun dato" echo else nombreu=$(grep ^$usuario /etc/passwd | cut -d ":" -f5 | cut -d "," -f1) homeu=$(grep ^$usuario /etc/passwd | cut -d ":" -f6 | cut -d "," -f1) if [ -z $nombreu ]; then echo echo "El nombre de usuario indicado no existe" echo else echo "El nombre del usuario indicado es :" $nombreu echo "El directorio personal es :" $homeu echo echo -n "Pusla una tecla para continuar..." read enterKey echo fi fi

Ejemplo 5. script que muestra un men con las siguientes opciones: a. b. c. d. Visualizar atributos del directorio actual. Visualizar directorio actual Mostrar el contenido de un fichero Salir

14

http://www.namocode.com http://devthisblog.namocode.es/ .com/ #!/bin/bash #Inicio del script. while : do clear opcion=0 echo "-------------MENU PRINCIPAL--------------------" echo "-----------------------------------------------" echo "a. Visualizar atributos del directorio actual" echo "b. Visualizar directorio actual" echo "c. Mostrar el contenido de un fichero" echo "d. Salir" echo "-----------------------------------------------" echo echo -n "Elige una opcion: " read opcion case $opcion in a) clear echo "Mostrando los atributos del directorio actual" ls -l . read enterkey ;; b) clear echo "Mostrando el contenido del directorio actual" ls read enterkey ;; c) clear echo -n "Indica el nombre de un fichero: " read fichero if test -f $fichero; then cat $fichero fi read enterkey ;; d) exit ;; *) clear echo "La opcion $opcion no esta en la lista" read enterkey ;; esac done

15

Vous aimerez peut-être aussi