lunes, 30 de enero de 2017

Funciones de shell

Nuestro script actualmente realiza los siguientes pasos para generar el documento HTML:
  1. Abre la página
  2. Abre el encabezado de página.
  3. Establece el título de página.
  4. Cierra el encabezado de página.
  5. Abre el cuerpo de la página.
  6. Título de la página de salida.
  7. Marca de tiempo (fecha y hora) de la salida.
  8. Cierra el cuerpo de la página.
  9. Cierra la página.
Para nuestra próxima fase de desarrollo, añadiremos algunas tareas entre los pasos 7 y 8. Estos incluirán:
  • Tiempo de actividad y carga del sistema. Es la cantidad de tiempo desde el último encendido o reinicio y la cantidad promedio de tareas corriendo actualmente en el procesador en varios intervalos de tiempo.
  • Espacio en disco. El uso general del espacio en los dispositivos de almacenamiento del sistema.
  • Espacio Home. La cantidad de espacio de almacenamiento usado por cada usuario.
Si tuviéramos un comando para cada una de dichas tareas, podríamos añadirlos a nuestro script simplemente a través de sustitución de comandos:

#!/bin/bash

# Program to output a system information page

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIMESTAMP="Generated $CURRENT_TIME, by $USER"

cat << _EOF_
<HTML>
        <HEAD>
                <TITLE>$TITLE</TITLE>
        </HEAD>
        <BODY>
                <H1>$TITLE</H1>
                <P>$TIMESTAMP</P>
                $(report_uptime)
                $(report_disk_space)
                $(report_home_space)
        </BODY>
</HTML>
_EOF_

Podríamos crear estos comandos adicionales de dos formas. Podríamos escribir tres scripts separados y colocarlos en un directorio listado en nuestro PATH, o podríamos incluir los scripts dentro de nuestro programa como funciones de shell. Como hemos mencionado antes, las funciones de shell son "mini-scripts" que se colocan dentro de otros scripts y pueden actuar como programas autónomos. Las funciones de shell tienen dos formas sintácticas:

function name {
        commands
        return
}

y

name () {
        commands
        return
}

donde name es el nombre de la función y commands es una serie de comandos contenidos dentro de la función. Ambas formas son equivalentes y podrían usarse indistintamente. A continuación vemos un script que demuestra el uso de una función de shell:

1 #!/bin/bash
2
3 # Shell function demo
4
5 function funct {
6         echo "Step 2"
7         return
8 }
9
10 # Main program starts here
11
12 echo "Step 1"
13 funct
14 echo "Step 3"

A medida que el shell lee el script, va pasando por alto de la línea 1 a la 11, ya que estas líneas son comentarios y la definición de la función. La ejecución comienza en la línea 12 con un comando echo. La línea 13 llama a la función de shell funct y el shell ejecuta la función tal como haría con cualquier otro comando. El control del programa se mueve entonces a la línea 6, y se ejecuta el segundo comando echo. La línea 7 se ejecuta a continuación. Su comando return finaliza la función y devuelve el control al programa en la línea que sigue a la llamada a la función (línea 14), y el comando final echo se ejecuta. Fíjate que, para que las llamadas a funciones sean reconocidas como funciones de shell y no interpretadas como nombres de programas externos, las definiciones de funciones de shell deben aparecer en el script antes de que sean llamadas.

Añadiremos unas definiciones de funciones de shell mínimas a nuestro script:

#!/bin/bash

# Program to output a system information page

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIMESTAMP="Generated $CURRENT_TIME, by $USER"

report_uptime () {
        return
}
report_disk_space () {
        return
}
report_home_space () {
        return
}

cat << _EOF_
<HTML>
     <HEAD>
         <TITLE>$TITLE</TITLE>
     </HEAD>
     <BODY>
          <H1>$TITLE</H1>
          <P>$TIMESTAMP</P>
          $(report_uptime)
          $(report_disk_space)
          $(report_home_space)
     </BODY>
</HTML>
_EOF_

Los nombres de funciones de shell siguen las mismas reglas que las variables. Una función debe contener al menos un comando. El comando return (que es opcional) satisface este requerimiento.

No hay comentarios:

Publicar un comentario