<Anterior | Contenido | Siguiente>
Una aplicación más completa
Después de una larga pausa, vamos a reanudar el trabajo en nuestro página_info_del_sistema programa. Nuestra próxima adición agregará varias opciones de línea de comando al programa de la siguiente manera:
● Archivo de salida. Agregaremos una opción para especificar un nombre para un archivo que contenga la salida del programa. Se especificará como -f presentar or --expediente presentar.
● Modo interactivo. Esta opción solicitará al usuario un nombre de archivo de salida y determinará si el archivo especificado ya existe. Si es así, se le preguntará al usuario antes de que se sobrescriba el archivo existente. Esta opción será especificada por -i or --interactivo.
● Ayuda. Ambos -h or --ayuda se puede especificar para hacer que el programa genere un mensaje de uso informativo.
Aquí está el código necesario para implementar el procesamiento de la línea de comandos:
uso () {
echo "$ PROGNAME: uso: $ PROGNAME [-f file | -i]" return
}
# procesar opciones de línea de comando interactivo =
uso () {
echo "$ PROGNAME: uso: $ PROGNAME [-f file | -i]" return
}
# procesar opciones de línea de comando interactivo =
nombre de archivo =
mientras que [[-n $ 1]]; hacer caso $ 1 en
-f | --expediente)
Turno
nombre de archivo = $ 1
;;
nombre de archivo =
mientras que [[-n $ 1]]; hacer caso $ 1 en
-f | --expediente)
-i | --interactive) interactivo = 1
;;
-h | --help) salida de uso
;;
*) uso> & 2
salir de 1
;;
-i | --interactive) interactivo = 1
;;
-h | --help) salida de uso
;;
*) uso> & 2
salir de 1
;;
esac
turno hecho
esac
turno hecho
Primero, agregamos una función de shell llamada personal para mostrar un mensaje cuando se invoca la opción de ayuda o se intenta una opción desconocida.
A continuación, comenzamos el ciclo de procesamiento. Este bucle continúa mientras el parámetro posicional
$ 1 no está vacío. Al final del ciclo, tenemos un comando de cambio para avanzar los parámetros de posición para asegurar que el ciclo eventualmente terminará.
Dentro del bucle, tenemos un case declaración que examina el parámetro posicional actual para ver si coincide con alguna de las opciones admitidas. Si se encuentra un parámetro compatible, se actúa sobre él. Si se encuentra una opción desconocida, se muestra el mensaje de uso y el script termina con un error.
La -f El parámetro se maneja de una manera interesante. Cuando se detecta, provoca una Turno que ocurra, lo que avanza el parámetro posicional $1 al argumento de nombre de archivo proporcionado al -f .
A continuación, agregamos el código para implementar el modo interactivo:
# modo interactivo
si [[-n $ interactivo]]; entonces mientras sea cierto; hacer
read -p "Ingrese el nombre del archivo de salida:" nombre de archivo si [[-e $ nombre de archivo]]; luego
read -p "'$ filename' existe. ¿Sobrescribir? [y / n / q]>" case $ REPLY en
Y | y) descanso
# modo interactivo
si [[-n $ interactivo]]; entonces mientras sea cierto; hacer
read -p "Ingrese el nombre del archivo de salida:" nombre de archivo si [[-e $ nombre de archivo]]; luego
read -p "'$ filename' existe. ¿Sobrescribir? [y / n / q]>" case $ REPLY en
Y | y) descanso
;;
Q | q) echo "Programa terminado". Salida
;;
*) Seguir
;;
esac
elif [[-z $ nombre de archivo]]; entonces continua
más
break
fi
done
fi
;;
Q | q) echo "Programa terminado". Salida
;;
*) Seguir
;;
esac
elif [[-z $ nombre de archivo]]; entonces continua
más
break
fi
done
fi
Si interactivo La variable no está vacía, se inicia un bucle sin fin, que contiene la solicitud de nombre de archivo y el código de manejo de archivos existente subsiguiente. Si el archivo de salida deseado ya existe, se le pide al usuario que lo sobrescriba, elija otro nombre de archivo o salga del programa. Si el usuario opta por sobrescribir un archivo existente, break se ejecuta para terminar el bucle. Note como el case La instrucción solo detecta si el usuario elige sobrescribir o salir. Cualquier otra opción hace que el bucle continúe y vuelve a solicitar al usuario.
Para implementar la función de nombre de archivo de salida, primero debemos convertir el código de escritura de página existente en una función de shell, por razones que se aclararán en un momento:
write_html_page () {cat << - _EOF_
$ TITLE
$ TITLE
$ TIMESTAMP
$ (report_uptime)
$ (report_disk_space)
$ (report_home_space)
_EOF_ volver
}
# página html de salida
if [[-n $ nombre de archivo]]; luego
write_html_page () {cat << - _EOF_
$ TITLE
$ TITLE
$ TIMESTAMP
$ (report_uptime)
$ (report_disk_space)
$ (report_home_space)
_EOF_ volver
}
# página html de salida
if [[-n $ nombre de archivo]]; luego
si toca $ nombre de archivo && [[-f $ nombre de archivo]]; luego write_html_page> $ filename
más
echo "$ PROGNAME: No se puede escribir el archivo '$ filename'"> & 2 salir 1
fi más
escribir_html_pagina
fi
si toca $ nombre de archivo && [[-f $ nombre de archivo]]; luego write_html_page> $ filename
más
echo "$ PROGNAME: No se puede escribir el archivo '$ filename'"> & 2 salir 1
fi más
escribir_html_pagina
fi
El código que maneja la lógica del -f La opción aparece al final de la lista que se muestra arriba. En él, probamos la existencia de un nombre de archivo y, si se encuentra uno, se realiza una prueba para ver si el archivo es realmente modificable. Para hacer esto, un contacto se realiza, seguido de una prueba para determinar si el archivo resultante es un archivo normal. Estas dos pruebas se encargan de situaciones en las que se ingresa un nombre de ruta no válido (contacto fallará) y, si el archivo ya existe, es un archivo normal.
Como podemos ver, el escribir_html_pagina Se llama a la función para realizar la generación real de la página. Su salida se dirige a la salida estándar (si la variable nombre del archivo está vacío) o redirigido al archivo especificado.