Tema Shell Scripts

LENGUAJE DE PROGRAMACIÓN SHELL SCRIPT SHELL SCRIPT • El shell es un intérprete de órdenes y está considerado un lengua

Views 77 Downloads 4 File size 451KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

LENGUAJE DE PROGRAMACIÓN SHELL SCRIPT

SHELL SCRIPT • El shell es un intérprete de órdenes y está considerado un lenguaje de programación. Como tales, incorporan sentencias de control de flujo, sentencias de asignación, funciones, etc. • Los programas de shell no necesitan ser compilados como ocurre en otros lenguajes. En este caso, el propio shell los ejecuta línea a línea. A estos programas se les conoce con el nombre de shell scripts y son los equivalentes a los archivos por lotes de otros sistemas operativos. •

PASOS A SEGUIR CREACIÓN DE SCRIPT • • Crear un archivo de texto con un editor (vi, gedit, etc.). Este archivo contendrá las órdenes que el shell va a ir interpretando y ejecutando. • • Asignar permisos de ejecución al archivo creado, utilizando la orden chmod. • • Ejecutar el script generado pasándole los parámetros necesarios • ./shell_script param1 param2 … • Otra forma: sh nombre_script

USO DE COMENTARIOS • Una línea de comentarios debe comenzar con el carácter # . Estos comentarios no se verán en pantalla cuando se ejecute el script. • Para mostrar comentarios que luego veremos por pantalla, se utilizará el comando echo. • Ejemplo # Esto es un comentario Echo Hola mundo

PASO DE PARÁMETROS A UN PROGRAMA DE SHELL • A menudo queremos que nuestros programas de shell reciban parámetros desde la línea de órdenes para hacerlos más versátiles. Estos parámetros son lo que se conoce como parámetros de posición. Los parámetros de posición se pueden usar dentro de un programa de shell como cualquier otra variable de shell; es decir, para saber su valor utilizaremos el símbolo $. Los parámetros dentro del shell script son accesibles utilizando las variables: • $0 Representa al parámetro cero o nombre del programa • $1 Representa al parámetro uno • $2 Representa al parámetro dos • … • $9 Representa al parámetro nueve • ${10} Representa al parámetro diez • ${11} Representa al parámetro once

EJEMPLO SHELL SCRIPT PARÁMETROS

echo El nombre del programa es $0 echo El primer parámetro recibido es $1 echo El segundo parámetro recibido es $2 echo El tercer parámetro recibido es $3 echo El cuarto parámetro recibido es $4

ALGUNAS VARIABLES ESPECIALES DEL SHELL • • $# Número de parámetros que han pasado a la shell. • $* Un argumento que contiene todos los parámetros que se han pasado ($1, $2...) • menos el $0. • $? Número donde se almacena el código de error del último comando que se ha ejecutado. • $$ Número de proceso actual (PID) • $! Último número de proceso ejecutado.

Ejemplo: • • • • • • •

echo El nombre del programa es $0 echo El número total de parámetros es $# echo Todos los parámetros recibidos son $* echo El primer parámetro recibido es $1 echo El segundo parámetro recibido es $2 echo El tercer parámetro recibido es $3 echo El cuarto parámetro recibido es $4

USO READ: Leer información

Sintaxis: read variable (s) La orden read se usa para leer información escrita en el terminal de forma interactiva. Si hay más variables en la orden read que palabras escritas, las variables que sobran por la derecha se asignan a NULL Ejemplo:

read var echo La variable introducida es: $var

Ejemplo 2:

echo "Introduce tres valores y pulsas intro:" read var1 var2 var3 echo Las variables introducidas son: echo var1 = $var1 echo var2 = $var2 echo var3 = $var3

Operaciones aritméticas

• Las operaciones aritméticas se pueden escribir: – Resultado=`expr $x + $y` – Para indicar las operaciones aritméticas se utilizan los símbolos: • • • • •

+ Suma. - Resta. * Multiplicación. / División entera. % Resto de la división

Ejemplo1. Script que pide al usuario dos números y calcula todas las operaciones aritmético del primer numero y el segundo. echo Introduzca un número: read num1 echo Introduzca un segundo número read num2 x=`expr $num1 + $num2`; echo la suma es $x ; x=`expr $num1 - $num2` echo la resta es $x; x=`expr $num1 / $num2` echo la división es $x x=`expr $num1 % $num2` echo el resto de una división entera es $x;

COMANDO LET •

El comando let nos permite trabajar fácilmente con variables numéricas en scripts. Por ejemplo: Supongamos que queremos multiplicar por 2 el valor de una variable y almacenar el resultado en otra: $ simple=4 $ let doble=simple*2 Si después de ejecutar estas dos instrucciones en un terminal, hacemos un:

$ echo $doble Veremos que la variable doble vale 8. Un ejemplo completo: Hacer un bucle while que incremente el valor de una variable CONTADOR y vaya mostrando los valores que toma dicha variable: #!/bin/bash CONTADOR=0 MAX=20 while [ $CONTADOR -lt $MAX ]; do let CONTADOR=CONTADOR+1 echo El contador es $CONTADOR

done

Ejercicios • 1. Realizar un guión shell que solicite un número y muestre el resto de dividirlo entre 2

• 2. Realizar un shell que solicite dos números enteros (precio y cantidad) y muestre el importe total aplicando un IVA del 18% (sin tener en cuenta decimales)

Ejercicios • 3. Realiza un shell script que solicite tres números y muestre la suma acumulada, el producto y el promedio. • 4. Elabora un algoritmo similar al que se utiliza para añadir al número del DNI una de las letras del abecedario para constituir el NIF. El algoritmo solicita 6 números y muestra el resto de dividir la suma de los 6 números entre 23.

Operadores de comparación • Aritméticos – – – – – –

Menor o igual que Mayor o igual que Menor que Mayor que Igual a Distinto

- le - ge - lt - gt -eq -ne

– Cadenas

– Igual a – Distinto

== !=

Operadores condicionales • • • • • • • •

• •

Los operadores mas utilizados para comparar condiciones son:&&, || Sintaxis: (Condición 1) operador (Condición 2) Ejemplos: (Condición 1) && (Condición 2) (Condición 1) || (Condición 2) &&: si comparamos condiciones utilizando el operador &&, devolverá verdadero solo si se cumplen todas las condiciones. Devolverá falso en caso de que no se cumplan todas las condiciones. ||: si comparamos condiciones utilizando el operador ||, devolverá verdadero siempre que se cumplan alguna de las condiciones que estemos comparando. Devolverá falso cuando no se cumpla ninguna de las condiciones. !: sirve para negar el resultado de una condición. Ejemplo !(condicion)

Estructuras de control

Estructuras de control Cómo en cualquier lenguaje de programación, necesitaremos una serie de estructuras de control que permitan modificar el flujo de ejecución de las instrucciones de nuestro script.

Estructura If • • La sintaxis más sencilla será: • • • • • •

if condicion then [bloque de comandos] [else] [bloque de comandos] fi

elif Si queremos añadir más condiciones:

if [ condicion1 ] then bloque de comandos si la condición1 se cumple elif condicion2 then bloque de comandos si la condición2 se cumple else bloque de comandos comandos si no se cumplen ni la condición1 ni la condición2 fi

Ejemplo if Normalmente la condición será el resultado de evaluar una primitiva o de ejecutar un comando. Veamos un ejemplo pin=1234; echo Introduzca su codigo PIN; read clave; if [ $clave -eq $pin ] then echo " código correcto "; else echo " código incorrecto "; fi

Ejemplo IF_ELSE • • • • • • • • • •

Pide al usuario e indica cual es el mayor Echo Introduzca el primer número: Read num1; Echo Introduzca el segundo número: Read num2; If [ $num1 -eq $num2] then echo " Son iguales "; elif EJERCICIO 5: Crear un script que pida dos numeros al usuario e indique cual es el mayor.

Evaluando expresiones según código de error: && y || • Existe otra manera de evaluar condiciones mediante la utilización de los caracteres especiales && y ||, que usan los códigos de error de un comando. • Es decir, cada comando ejecutado devuelve un valor de salida , sacando el valor de '$?,' podíamos saber la salida del último proceso ejecutado. • El operador '&&' ejecuta un comando, y si es correcto ejecuta el siguiente, veamos un ejemplo:

EJEMPLO • if ls /var && ls /etc • then • echo "ok" else echo "error " • fi En este caso para que salga de mensaje ok, se tendrá que haber podido listar el directorio /var y el /etc también, y sino dará error (esto puede ser usado cuando queremos comprobar la existencia de los directorios para nuestros script):

• El operador '||' ejecuta un comando y si no es correcto ejecuta el siguiente: • if ls /var || ls /etc • then • echo "ok" else echo "error" • fi • En este caso saldrá el mensaje "ok" si se ha podido listar correctamente alguno de los directorios ( /var o /etc), o los dos.

Comparación de ficheros y variables con test. • Para evaluar expresiones condicionales dentro de los 'if' se usa el comando 'test'. Veamos un resumen en la siguiente tabla: • EXPRESIONES

DESCRIPCION

-b fichero

Cierto si fichero existe y es un dispositivo de bloques.

-c fichero

Cierto si fichero existe y es un dispositivo de caracteres.

-d fichero

Cierto si fichero existe y es un directorio.

-e fichero

Cierto si fichero existe.

-f fichero

Cierto si fichero existe y es un fichero normal.

-g fichero

Cierto si fichero existe y tiene el bit de grupo activado.

-k fichero

Cierto si fichero tiene el bit de sticky activado.

-L fichero

Cierto si fichero existe y es un enlace simbólico.

-p fichero

Cierto si fichero existe y es una tubería nombrada.

-r fichero

Cierto si fichero existe y es legible.

-s fichero

Cierto si fichero existe y su tamaño es mayor que cero.

-S fichero

Cierto si fichero existe y es un socket.

-t [df]

Cierto si df está abierto en un terminal. Si df es omitido, se toma 1 (salida estándar) por defecto.

-u fichero

Cierto si fichero existe y tiene el bit de usuario activo.

-w fichero

Cierto si fichero existe y es escribible.

-x fichero

Cierto si fichero existe y es ejecutable.

-O fichero

Cierto si fichero existe y es propiedad del identificador efectivo del usuario.

-G fichero

Cierto si fichero existe y es propiedad del identificador efectivo del grupo.

fichero1 -nt fichero2

Cierto si fichero1 es más reciente (en base a la fecha de modificación) que fichero2.

fichero1 -ot fichero2

Cierto si fichero1 es más antiguo que fichero2.

fichero1 -ef fichero2

Cierto si fichero1 y fichero2 tienen el mismo número de dispositivo y de nodo-i.

-z cadena

Cierto si la longitud de cadena es cero.

-n cadena

Cierto si la longitud de cadena no es cero.

cadena1 !=cadena2

Cierto si las cadenas no son iguales.

! expr

Cierto si expr es falsa. cadena

expr1 -a expr2 cadena1 =

Cierto si la longitud de cadena no es cero.

Cierto si expr1 y expr2 son ciertas.

Cierto si las cadenas son iguales.

cadena2

expr1 -o expr2

Cierto si expr1 o expr2 son ciertas.

Ejemplo IF 3 •

Construir un script que solicite al usuario el nombre de un directorio y compruebe si existe. En caso de que no exista construirlo.

• • • • • • • • •

echo Introduce el nombre de un directorio read dir if [ ! -d $dir ] then mkdir $dir else echo Listaremos el directorio porque existe ls $dir fi

Ejercicios • 6-. Crear un script que solicite al usuario el nombre de un directorio. Comprueba si existe. Si existe, solicitar el nombre de dos ficheros y comprobar si existe en el mismo directorio. Si no existen se crearan vacíos. • 7-. Realizar un shell script que borre un archivo indicado como argumento. Se debe comprobar que el archivo existe y que su nombre se le ha pasado al script. El programa se llamará borrar.sh. Por ejemplo: borrar.sh texto.txt.

Estructura CASE • La estructura case permite elegir una opción entre un conjunto de opciones. Sintaxis: • case valor in • opcion1) comandos; • comandos;; • opcion2) comandos; • comandos;; • ….. • opcion N) comandos; • comandos;; • *) Opción no indicada;; • esac

Ejemplo estructura CASE echo "*************MENU*******************"; echo 1-.Mostrar nombre de usuario; echo 2-.Mostrar directorio actual; echo 3-.Salir.; echo "*********************************"; echo " Seleccione una opcion: "; read opcion; case $opcion in 1)echo $USER;; 2)echo $PWD;; 3)echo Adios;; esac;

Ejercicio CASE-1 • EJERCICIO 8: Construir un shell que muestre un menú con las siguientes opciones: – ************INFORMACIÓN DEL SISTEMA************* – 1-. Mostrar particiones – 2-. Espacio ocupado por las particiones. – 3-. Memoria física libre. – 4-. Espacio ocupado por los directorios. – 5-. Versión del sistema operativo utilizado.

EJERCICIO CASE-2 • EJERCICIO 9: construir un script que presente un menú con las siguientes opciones: • 1-.Listado del directorio de trabajo de un usuario solicitado. • 2-.Listado de los ficheros que se encuentren en el directorio de trabajo de un usuario solicitado y con una extensión solicitada. • 3-.Listado de los ficheros que se encuentren en el directorio de trabajo de un usuario solicitado ordenados por tamaño. • 4-.Localizar el lugar donde se encuentra un fichero solicitado. • 5-. Salir

ESTRUCTURA FOR • El bucle FOR es una estructura de control iterativa que permite repetir unas intrucciones un número fijo de veces • programa, un número fijo de veces. • Sintaxis 1: – for variable in [lista de palabras] – do – instrucciones

– done Ejemplo: for mivariable in fichero1.txt, fichero2.txt, fichero do ls –l $mivariable done

ESTRUCTURA FOR • Sintaxis 2: • for variable in [lista de palabras]; do comandos; done

• Veamos un ejemplo, en el que nos ayudamos de la ejecución del comando seq para • cargar la variable: • for variable in `seq 1 100` • do – echo $variable

• done •

Conseguiremos como salida un listado de los 100 primeros números.

EJEMPLO FOR • Script que muestra el contenido de un directorio indicado como parámetro. • for directorio in `ls /home/$1` • do • echo $directorio • done

EJERCICIOS FOR • Ejercicio 10: Construir un shell que reciba el nombre de un directorio de trabajo de un usuario y liste su contenido. Por cada elemento que encuntre dentro del directorio deberá de aparecer un mensaje indicando si es un fichero o un directorio. Al final debe de aparecer un resumen indicando el número de ficheros y directorios encontrados.

ESTRUCTURA WHILE • • • • • • • • • • • • • • •

Bucle While Sirve para repetir un bucle mientras se cumpla la condición: While condición do comandos done Veamos en siguiente ejemplo donde creamos una sucesión de números desde un origen, en este caso el 33, hasta el final que marca la condición (el 100): #!/bin/bash num=33 while [ $num -le 100 ] do echo "numero: $num" num=`expr $num + 1` done

ESTRUCTURA UNTIL • • • • • • • • • • • • • • •

Bucle Until Igual que While pero el bucle se ejecuta mientras la condición no sea falsa: Until condición do comandos done A continuación, el mismo ejemplo que el While, pero esta vez utilizando la estructura Until: #!/bin/bash num=33 until [ $num -eq 100 ] do echo "numero: $num" num=`expr $num + 1` done