Fundamentos y Arquitectura de Computadores ITTSE - Universidad de Valencia LINUX - Los archivos de órdenes I Objetivos: Se pretende introducir al alumno en el uso de los archivos de órdenes (conocidos como scripts) utilizando el lenguaje de programación propio del intérprete de órdenes. Creación y ejecución de un script simple Como ya hemos indicado en el apartado de los objetivos, el intérprete de órdenes bash de LINUX tiene un lenguaje de programación propio que permite crear archivos de órdenes: los scripts. Los scripts son archivos que contienen órdenes que se ejecutan al utilizar el script en el bash como cualquier orden. Crear el siguiente ejemplo utilizando la orden cat o cualquier editor de texto (por ejemplo el que está en Botón de inicio de SUSE > Utilidades > Editor). Script: saludo #!/bin/bash # # Sintaxis: saludo # # Este script da la bienvenida a un usuario, indicándole la # fecha y la hora que es y cual es su directorio de trabajo echo “Bienvenido `whoami`” date echo “Ahora mismo estás en el directorio `pwd`” Para poder ejecutar el script es necesario activar sus permisos de ejecución (al menos para el propietario). RECORDATORIO: chmod u+x saludo Por defecto, al ejecutar una orden, el bash la busca en los directorios indicados por la variable PATH. Para ver cuales son esos directorios, basta escribir la orden echo $PATH. Así pues, si no aparece el directorio en el que está almacenado, un script no se puede ejecutar. Se puede comprobar ejecutando el script desde la línea de órdenes: linux@alumnos:~>saludo. Para permitir su ejecución basta añadir la línea PATH=$PATH:. (donde el . representa el directorio en el que estamos) al final del archivo .bashrc. La primera línea del script saludo indica que éste debe ser ejecutado por el intérprete de órdenes bash. Cualquier otra línea que empiece por el símbolo # es de comentario. En un script en cualquier momento se le puede pedir al usuario que introduzca un valor. Como ya vimos en el guión anterior, esto se hace con la orden read. Script: saludo2 #!/bin/bash # # Sintaxis: saludo2 1 Fundamentos y Arquitectura de Computadores ITTSE - Universidad de Valencia # # Este script da la bienvenida a un usuario, pidiéndole su # nombre y sus apellidos echo read echo read “Introduce tu nombre: ” Nombre “Introduce tus apellidos (2 max.):” Apellido1 Apellido2 echo “Bienvenido $Nombre $Apellido1 $Apellido2” Ejercicio: 1.- Realizar un script (utilizar el nombre calcula) que pida un número menor que 100 y muestre en pantalla todos los cuadrados desde 1 hasta dicho número. Ejemplo de ejecución: alumnos@linux:~> calcula Introduzca un número menor que 100: 3 Cuadrado de 1: 1 Cuadrado de 2: 4 Cuadrado de 3: 9 Los argumentos de un script Como ya hemos mencionado anteriormente, un script actúa como una orden; y como con cualquier orden utilizada hasta ahora se le puede pasar argumentos desde el intérprete de órdenes. Para ello podemos utilizar 10 argumentos posicionales ($0,$1,…,$9). $0 corresponde al nombre de la orden o del script que se está ejecutando (ya que es lo primero que se pone) y a continuación los argumentos posicionales corresponden a cada uno de los argumentos que siguen al nombre del script. Existen otras variables predefinidas por el intérprete de órdenes que son: $* $# $? $$ representa a todos los argumentos que hay después de la orden número de argumentos que se le pasa a la orden estado de salida (si es 0 no ha habido error) número de identificación del proceso que se está ejecutando (por cada orden o script que lanzamos desde el intérprete de órdenes se pone en marcha un proceso) Esto no significa que solo se pueden pasar 9 argumentos. Se puede acceder a más utilizando la orden shift. Cada vez que se utiliza esta orden, el 2º argumento pasa ser $1, el 3º pasa a ser $2, etc. y el 1º desaparece ($0 no cambia). Script: desplazar #!/bin/bash # # Sintaxis: desplazar [argumentos ...] # # Este script presenta en pantalla los argumentos que le # hemos pasado después de hacer los desplazamientos con la 2 Fundamentos y Arquitectura de Computadores ITTSE - Universidad de Valencia # orden shift if [ $# -ge 2 ] then echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 else echo “Sintaxis: desplazar [argumentos ...]” echo “Los argumentos deben ser al menos 2” fi Ejecución: desplazar 1 2 3 4 5 6 7 8 9 10 11 Se comprueba como desaparecen de la lista de argumentos primero 1, y después 2. Ejercicio: 2.- Repetir el ejercicio nº1 (utilizar el nombre calcula2 en este caso) pero esta vez pasándole dos argumentos: el primero es la potencia que se va a utilizar en los cálculos; y el segundo es el número menor que 100. Sintaxis para el script: calcula2 num1 num2 Ejemplo de ejecución: alumnos@linux:~> calcula2 3 3 1: 1 2: 8 3: 27 Estructuras de control de flujo Se pueden utilizar en un script las estructuras de control vistas en la práctica anterior: - Estructura condicional if-then-else - Estructura repetitiva while - Estructura repetitiva for Script: detectar #!/bin/bash # # Sintaxis: detectar [usuarios ...] # # Este script sirve para detectar si algunos usuarios (que # se pasan como argumentos) están conectados al ordenador for i in $* do if who | grep –s “$i” > /dev/null then echo “$i está conectado” else echo “$i no está conectado” fi 3 Fundamentos y Arquitectura de Computadores ITTSE - Universidad de Valencia done Ejecución: detectar aurelio alumnos paco Comprueba si los usuarios aurelio, alumnos o paco están conectados al sistema. En los lenguajes de programación C y C++, existen dos instrucciones que permiten controlar el flujo de las estructuras repetitivas while y for. Estas instrucciones se llaman break y continue. En el lenguaje de programación del intérprete de órdenes bash también se puede hacer uso de dos órdenes que controlan esas estructuras de la misma forma. Tienen el mismo nombre: son las órdenes break y continue. Pero como ocurre con la mayoría de las órdenes, a cada una de ellas se les puede pasar argumentos (para más información mirar los man correspondientes). Script: eco #!/bin/bash # # Sintaxis: eco n # # Este script actúa de eco repitiendo las n palabras que se # introducen, al menos que la palabra sea “ya”. if [ $# -eq 0 ] then echo “Sintaxis: eco n” exit 1 fi i=0; while [ $i –lt $1 ] do read pal if [ $pal = “ya” ] then break fi echo “eco contesta $pal” i=`expr $i + 1` done Ejecución: eco 3 Repetirá las 3 palabras que introduzcamos, al menos que alguna de ellas sea ya, caso en el que finalizará la ejecución del script. Estructura de selección case Sintaxis: case argumento in [ patrón [ | patrón] ) lista ;; ] … esac La orden case mira a ver si argumento coincide con alguno de los patrones (se pueden poner en una misma línea varios patrones separados por el símbolo | ) y ejecuta la lista de órdenes correspondiente. La comparación con los patrones se hace por orden de apariencia de los patrones deteniéndose la comparación en cuanto se detecte una coincidencia. En ese caso el estado de salida corresponde al de la lista de órdenes ejecutada. Si no hay ninguna coincidencia el estado de salida de la orden case será nulo. 4 Fundamentos y Arquitectura de Computadores ITTSE - Universidad de Valencia En los patrones se pueden utilizar los comodines * (que sustituye un conjunto de caracteres) y ? (que sustituye un solo carácter). Se suele poner al final de la lista case el patrón * para representar aquellos casos que no han sido contemplados en la lista de patrones. Script: sumres #!/bin/bash # # Sintaxis: sumres num1 op num2 # # Este script sirve para hacer sumas o restas entre 2 # números if [ $# -eq 0 ] then echo “Sintaxis: sumres num1 op num2” echo “num1, num2: números enteros” echo “op: + (para la suma) o – (para la resta)” exit 1 fi echo “Sumador – case $2 in “+” ) echo ;; “-“ ) echo ;; *) echo ;; esac Restador” “$1 + $3 = `expr $1 + $3`” “$1 - $3 = `expr $1 - $3`” “Operación no válida” Ejecución: sumres 1 + 2 Suma los números 1 y 2 dando como resultado 3. Ejercicio: 3.- En LINUX al borrar un archivo es imposible recuperarlo. Se quiere realizar dos scripts que nos permitan borrar y recuperar archivos (utilizar los nombres borra y recupera, respectivamente). La forma de operar del script borra será la siguiente: al eliminar un archivo, en vez de invocar a la orden rm, el archivo será enviado (movido) a un directorio oculto que denominaremos .papelera (hay que crearlo antes de ejecutar los scripts). En este directorio se van a almacenar todos y cada uno de los archivos que hayan sido eliminados. De forma optativa, borra admite dos opciones: con la opción –v, el script debe mostrar el contenido completo de la papelera; y con la opción -b todos los archivos de la papelera serán eliminados definitivamente. Sintaxis para el script borra: borra [-v] [-b] archivo [archivo ...] –v: muestra el contenido de la papelera -b: los archivos de la papelera son eliminados definitivamente El script para recuperar archivos sólo admite de forma optativa la opción -t, con la que se recupera todo el contenido de la papelera en el directorio de trabajo. 5 Fundamentos y Arquitectura de Computadores ITTSE - Universidad de Valencia Sintaxis para el script recupera: recupera [-t] archivo [archivo ...] -t: se recupera el contenido de la papelera 6