LINUX - Los archivos de órdenes I

Anuncio
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
Descargar