shell linux

15
 José Navero Esta Documento trata de la programación en Shell Script desde un nivel básico. Apuntes de Unix Shell Script. http://www.namocode.com http://devthisblog.wordpress.com/

Upload: ivan-de-la-rosa

Post on 06-Jul-2015

27 views

Category:

Documents


0 download

TRANSCRIPT

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 1/15

 

 

José NaveroEsta Documento trata de la programación enShell Script desde un nivel básico.

Apuntes de Unix

Shell Script.

 

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

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 2/15

 

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

 

2

Índice

1.  Una pequeña introducción. ................................................................................. 3 2.  Que necesitamos para escribir un Shell script. .................................................... 3 3.  Ejecutando un Shell Script. ................................................................................. 3 4.  Nuestro primer Shell Script. ............................................................................... 3 5.  Algunos conceptos básicos. ................................................................................ 3 

Sobre comandos: ....................................................................................................... 3 Comentarios: ............................................................................................................. 4 Salida por pantalla: .................................................................................................... 4 

6.  Variables. ........................................................................................................... 4 El comando Export .................................................................................................... 4 El comando set .......................................................................................................... 4

 Variables posicionales y automáticas ......................................................................... 4 Arrays ........................................................................................................................ 5 

7.  Salida por pantalla y entrecomillado. .................................................................. 5 Caracteres no imprimibles ......................................................................................... 5 Entrecomillar ............................................................................................................. 6 Ejecución de órdenes ................................................................................................. 6 Redireccionamiento ................................................................................................... 6 Segundo plano ........................................................................................................... 7 

8.  Shell Script, El lenguaje. .................................................................................... 7 Estructuras de control ................................................................................................ 7 

La instrucción IF. ................................................................................................... 8 La instrucción CASE. ............................................................................................. 9 

Bucles ........................................................................................................................ 9 Bucle WHILE ......................................................................................................... 9 Bucle UNTIL ....................................................................................................... 10 Bucle FOR............................................................................................................ 10 

Pequeña reflexión. ................................................................................................... 10 Varios comandos… ................................................................................................. 11 

Comando test ........................................................................................................ 11 Comando break .................................................................................................... 11 Comando continue ................................................................................................ 12 Comando sleep ..................................................................................................... 12 Comando expr ...................................................................................................... 12 

Anexo I. Ejemplos ...................................................................................................... 13 

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 3/15

 

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

 

3

1.  Una pequeña introducción.

Este escrito da por supuesto el conocimiento de los comandos de Unix / Linux. LosScript de Shell es una forma de realizar tareas repetitivas, ejecución de comandos Unixy como veremos a continuación la programación en Shell script es muy potente. Para

este manual he utilizado sco Unix y el Shell ksh. Al igual que ksh existen diferentesshells. Una Shell es un intérprete de comandos en nuestro caso en Unix / Linux. El másutilizado (por mi parte en Ubuntu es el bash). Como ya he indicado antes este manual lohe orientado a sco unix y ksh (Korn Shell) aunque sirve para cualquier otro shell.

2.  Que necesitamos para escribir un Shell script.

Básicamente, necesitamos un Shell como los descritos anteriormente (obviamente),tener un Linux instalado, un unix, live cd etc. Y para escribir el script necesitamos uneditor, como el nano, el vim, el vi o lo que más nos guste, el caso es que edite.

3.  Ejecutando un Shell Script.

Una vez que tenemos nuestro script escrito, podemos ejecutarlo de diferentesformas.

  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 detexto (ejemplo vi).

#!/bin/kshecho “Hola que tal estas” 

¿Qué hace este script?

La primera línea indica el Shell que se va a utilizar en nuestro caso el ksh, la segundalínea muestra por pantalla la frase “Hola que tal estas” 

5.   Algunos conceptos básicos.

Sobre comandos:

Es importante destacar que Unix es case sensitive, es decir diferencia mayúsculas yminúsculas, es decir no es lo mismo echo que Echo

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 4/15

 

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

 

4

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 asignación como vemos acontinuación.

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 readseguido de la variable.

read variable

Si además 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 deseamosexportar una variable, utilizamos “export variable” (sin comillas). 

El comando set 

Este comando “set” Sirve para leer o escribir variables.

Variables posicionales y automáticas

Existen variables que son activadas por el Shell de forma automática, estasvariables tienen gran importancia por su utilidad a la hora de crear nuestros scripts. En lasiguiente tabla veremos dichas variables.

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 5/15

 

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

 

5

Variable Descripción$? Variable que indica el código 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 ejecución del script.$! Variable que contiene el número de identificación del último proceso en

background.$1, $2 …$9, ${10}… 

Variables posicionales. Son las variables que le pasamos por línea decomandos a nuestro script de Shell. Nota, desde la posición 10 en adelantedeben llevar llaves {}

$# Variable que contiene el número total de parámetros que se le pasan al script.$* Variable que crea una cadena de texto con todas las variables pasadas.

 Arrays

Además de las variables normales, posicionales y automáticas, podemos creararrays. Dichos arrays se definen de la siguiente forma:set -A nombre valor1 valor2 ...... valorn

Para mostrar la tercera posición 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 quedeseemos. Podemos darle formato a esta salida, todo depende del entrecomillado y delos caracteres no imprimibles como vemos a continuación.

Caracteres no imprimibles

Estos caracteres son: \n Introduce un salto de línea en la frase \c Continúa en la misma línea.

 \e Carácter Escape. \t Escribe un tabulador.

Ejemplo:echo “Hola \ n Me llamo Juan” 

La salida de este comando es la siguiente:HolaMe llamo Juan

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 6/15

 

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

 

6

Entrecomillar

Es muy importante entrecomillar correctamente los textos y las variables ya quedepende del entrecomillado la forma en que vamos a mostrar o utilizar nuestrasvariables.

Existen diferentes formas de entrecomillar. Al teclear comillas simples „‟, todo loque va entre estas comillas pierde su significado, pasando a ser todo texto.

Sin Embargo, las comillas dobles “” podemos mostrar los valores que contienen lasvariables.

Otra forma de entrecomillar es utilizar la barra inversa \ con esta barra podemoscubrir caracteres no imprimibles. De esta forma podremos mostrar comillas, porejemplo.

Además de poder entrecomillar podemos utilizar los paréntesis para poder agrupardiferentes ordenes.

Ejemplos:

Orden Resultadoecho * Muestra los archivos (funciona igual que cuando ponemos ls)echo \* Muestra el carácter * por pantallavariable = 1echo „Prueba variable‟

Muestra por pantalla prueba variable

variable = 1echo “variable” 

Muestra por pantalla 1

Ejecución de órdenes

Existen varias formas de ejecutar las diferentes órdenes en Shell Script.Punto y coma: Se utiliza para ejecutar una orden después de otra. orden1;orden2Or(||): 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 unarchivo.Ejemplos:

 pwd;date > resulEn este caso, primero ejecuta el comando pwd y posteriormente crea el archivo

resul donde insertará el resultado de ejecutar date.(pwd;date) > resulEstá orden similar a la anterior la diferencia (los paréntesis) en vez de introducir el

resultado de date insertará el resultado de ejecutar ambas ordenes.Como podemos ver con el símbolo mayor que realizamos los redireccionamientos.

Si ponemos un único símbolo 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

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 7/15

 

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

 

7

existe se crea y si existe, anexa el resultado en el fichero. Por otro lado además derecoger los resultados, también 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 segundoplano, es decir, mientras se ejecuta una orden podemos seguir ejecutando otras órdenes.

Esto combinado con los paréntesis o creando un Script de Shell nos permite realizaroperaciones muy potentes. Para poder enviar una orden a segundo plano usamos el &.

Ejemplos:orden1;orden2&

En este ejemplo, se ejecuta la primera orden y después la siguiente orden la ejecutaen segundo plano.(orden1;orden2)&En el segundo ejemplo, las dos órdenes se ejecutarán en segundo planoBásicamente, para poder trabajar con los comandos en primer y segundo plano se

usan 3 comandos.Jobs: Muestra los comandos que están en ejecuciónFg: pasa a primer plano un comandoBg: pasa a segundo plano un comandoSi pulsamos control+z durante la ejecución 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 están en proceso.

8.  Shell Script, El lenguaje.

Shell Script tiene la misma funcionalidad que cualquier lenguaje de programación,además, de la potencia de un lenguaje de programación, podemos utilizar cualquiercomando 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 unacondición previamente indicada.

Las estructuras posibles en Shell script son las siguientes if y case que veremos acontinuación.

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 8/15

 

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

 

8

La instrucción IF.

Se encarga de elegir ente dos o más bloques, en el diagrama podemos verclaramente el funcionamiento de la instrucción.

Se cumpleBloque 1

Variable IF condición Resto del programaBloque 2

No se cumple

La sintaxis de la instrucción IF es la siguiente:

Para un if sencillo:

if <comando> thenBloque de instrucciones

fi

Para un if con dos bloquesif <comando> then

Bloque de instrucciones 1else

Bloque de instrucciones 2fi

Y por supuesto podemos anidar varios if, es decir, meter una instrucción if dentrode otro.

if<comando> thenBloque de instrucciones 1

elseif<comando> then

Bloque de instrucciones 2else

Bloque de instrucciones 3fifi

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 9/15

 

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

 

9

La instrucción CASE.

Esta instrucción es una instrucción similar al if, es decir secuencia de control. Elsiguiente diagrama muestra el funcionamiento de esta instrucción.

Si variable

Vale X Bloque 1

Vale Y Bloque 2 Resto del programa

Vale Z Bloque 3

La sintaxis de esta instrucción es la siguiente:

case variable/expresión in1)  Orden1

Orden2…;; 

[2-4]) Orden1Orden2….;; 

*) Orden1Orden2…; 

esac

Analizando el comando anterior, podríamos decir, si la variable es igual que uno,ejecuta el primer bloque. Para salir del bloque se ponen dos puntos y comas seguidoscomo se pueden ver.

Si nos fijamos en el segundo bloque, hace referencia a un rango es decir, si lavariable o expresión 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 subloque.

Como en todos los comandos, esac indica el final del comando case.

Bucles

Los bucles, como en cualquier lenguaje de programación sirven para repetirbloques de comandos.

Bucle WHILE

Realiza un bucle mientras se cumpla una condición determinada.La sentencia del bucle es la siguiente:

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 10/15

 

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

 

10

while comandodo

Orden1Orden2… 

done

Mientras se cumpla repetir.

Bucle UNTIL

Realiza un bucle hasta que se cumpla una condición determinada.La sentencia del bucle es la siguiente:

until comando

do Orden1Orden2… 

done

Bucle FOR

Realiza una iteración un número determinado de veces,La sentencia del bucle es la siguiente:

for variable in valor1 valor2 valorn… do

Orden1Orden2… 

done

A continuación se muestra un ejemplo del uso del bucle for.

for a in lunes martes miércoles jueves

doecho $a

done

Este ejemplo muestra por pantalla la siguiente línea:Lunes martes miércoles jueves

Pequeña reflexión.

Hasta aquí todo perfecto, pero ahora ¿Qué comandos uso en las evaluaciones?

¿Cómo utilizo todo esto?.

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 11/15

 

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

 

11

A continuación iré mostrando los comandos más comunes, así como algunos ejemplosde Shell script.

Varios comandos… 

Comando test

Este comando es el comando evaluador más utilizado en los bucles o sentenciasde control. Puede trabajar sobre valores numéricos, ficheros o cadenas de texto.

Uso sobre valores numéricos.

-eq: igual-ne: distinto

-gt: mayor queOperadores -lt: menor que-ge: mayor o igual que-le: menor o igual que

Este tipo de operadores, solamente admite números 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 convencionalOperadores -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 ejecución.

Uso sobre cadenas.

-z: indica si la cadena tiene longitud cero

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

Comando break

Con este comando podemos interrumpir una secuencia de control como puedeser un bucle, si se produce una acción concreta podemos indicar que deje de ejecutar el

 bucle “rompiéndolo” para continuar con la ejecución del script. 

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 12/15

 

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

 

12

Comando continue

Este comando, forzamos a un bucle a que realice otra iteración, sin que acabe derealizar todos los comandos o evaluadores que sean posteriores.

Comando sleep

Este comando realiza una pausa de uno a varios segundos en función del tiempoindicado. La sintaxis es la siguiente: sleep 2 (realiza una pausa de 2 segundos).

Comando expr

Este comando realiza una operación básica entre dos variables o más. Unejemplo de su uso podría ser este: a= expr $a + 1

Para ver más información sobre algunos script en el Anexo I adjunto varios ejemplos descript donde se puede ver el uso de los comandos, evaluadores, bucles etc.

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 13/15

 

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

 

13

 Anexo I. Ejemplos

Ejemplo 1. Script “Hola mundo” 

#!/bin/sh

echo “Hola Mundo” 

Ejemplo 2. Script con una toma de decisiones

#!/bin/shclearecho “Introduzca un numero” read numerores= expr $numero % 2if test res – eq 0 ; then

echo “El numero es par” else

echo “El numero es impar” fiecho “Fin programa” 

Ejemplo 3. Este script que reciba un directorio como primer parámetro, y a continuaciónuna lista de archivos. El script valida que los parámetros recibidos sean realmentearchivos y luego copiarlos al directorio recibido

#!/bin/shif test $# -le 1; then

echo “Argumentos no validos” exit

fi

if test – d $1; thencarpeta=$1for I in $*;do

if test – f $i; thencp $i $carpetaecho “Archivo $i copiado en $carpeta” 

fidone

elseecho “Argumento no valido” 

fi

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 14/15

 

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

 

14

Ejemplo 4. Este script muestra un menú con los nombres de login de los usuariosconectados y al elegir uno se nos muestre el nombre completo del mismo así como su laruta de su directorio personal. 

#!/bin/shclearusuario=''echo "--------------- MENU USUARIOS -----------------"echo "-----------------------------------------------"who -s | cut -f1,2 -d ' ' | cut -f1,1 -d ' '|nlecho "-----------------------------------------------"echoecho "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."echoecho -n "Usuario :"read usuario

if [ -z $usuario ]; thenechoecho "No se ha introducido ningun dato"echo

elsenombreu=$(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

echoecho "El nombre de usuario indicado no existe"echo

elseecho "El nombre del usuario indicado es :" $nombreuecho "El directorio personal es :" $homeuechoecho -n "Pusla una tecla para continuar..."read enterKeyecho

fifi

Ejemplo 5. script que muestra un menú con las siguientes opciones:

a.  Visualizar atributos del directorio actual.b.  Visualizar directorio actualc.  Mostrar el contenido de un fichero

d.  Salir

5/7/2018 Shell Linux - slidepdf.com

http://slidepdf.com/reader/full/shell-linux-559abac93fbdc 15/15

 

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

 

15

#!/bin/bash#Inicio del script.while :do

clear

opcion=0echo "-------------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 "-----------------------------------------------"echoecho -n "Elige una opcion: "read opcion

case $opcion ina)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 ficheroif test -f $fichero; then

cat $ficherofi

read enterkey;;d)

exit;;

*)clear

echo "La opcion $opcion no esta en la lista"read enterkey

;;esac

done