viernes, 9 de junio de 2017

Resumiendo

Con la inclusión de los parámetros posicionales, ahora podemos escribir scripts bastante funcionales. Para tareas simples y repetitivas, los parámetros posicionales hacen posible escribir funciones de shell muy útiles que pueden guardarse en el archivo .bashrc del usuario.

Nuestro programa sys_info_page ha crecido en complejidad y sofisticación. Aquí tenemos un listado completo , con los cambios más recientes resaltados:

#!/bin/bash

# sys_info_page: program to output a system information page

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

report_uptime () {
   cat <<- _EOF_
      <H2>System Uptime</H2>
      <PRE>$(uptime)</PRE>
      _EOF_
   return
}

report_disk_space () {
   cat <<- _EOF_
      <H2>Disk Space Utilization</H2>
      <PRE>$(df -h)</PRE>
      _EOF_
   return
}

report_home_space () {
   if [[ $(id -u) -eq 0 ]]; then
      cat <<- _EOF_
         <H2>Home Space Utilization (All Users)</H2>
         <PRE>$(du -sh /home/*)</PRE>
         _EOF_
   else
      cat <<- _EOF_
         <H2>Home Space Utilization ($USER)</H2>
      <PRE>$(du -sh $HOME)</PRE>
      _EOF_
   fi
   return
}

usage () {
   echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"
   return
}

write_html_page () {
   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_
   return
}

# process command line options

interactive=
filename=

while [[ -n $1 ]]; do
   case $1 in
      -f | --file)        shift
                          filename=$1
                          ;;
      -i | --interactive) interactive=1
                          ;;
      -h | --help)        usage
                          exit
                          ;;
      *)                  usage >&2
                          exit 1
                          ;;
   esac
   shift
done

# interactive mode

if [[ -n $interactive ]]; then
   while true; do
      read -p "Enter name of output file: " filename
      if [[ -e $filename ]]; then
        read -p "'$filename' exists. Overwrite? [y/n/q] > "
        case $REPLY in
            Y|y) break
                 ;;
            Q|q) echo "Program terminated."
                 exit
                 ;;
            *)   continue
                 ;;
        esac
      fi
   done
fi

# output html page

if [[ -n $filename ]]; then
   if touch $filename && [[ -f $filename ]]; then
      write_html_page > $filename
   else
      echo "$PROGNAME: Cannot write file '$filename'" >&2
      exit 1
   fi
else
   write_html_page
fi

Aún no hemos terminado. Todavía hay más cosas que podemos hacer y mejoras que podemos realizar.

No hay comentarios:

Publicar un comentario