<Précédent | Table des matières | Suivant>
Une application plus complète
Après une longue pause, nous allons reprendre le travail sur notre sys_info_page programme. Notre prochain ajout ajoutera plusieurs options de ligne de commande au programme comme suit :
● Fichier de sortie. Nous ajouterons une option pour spécifier un nom pour un fichier devant contenir la sortie du programme. Il sera spécifié soit -f filet or --déposer filet.
● Mode interactif. Cette option demandera à l'utilisateur un nom de fichier de sortie et déterminera si le fichier spécifié existe déjà. Si tel est le cas, l'utilisateur sera invité avant que le fichier existant ne soit écrasé. Cette option sera spécifiée soit par -i or --interactif.
● Aide. Non plus -h or --Aidez-moi peut être spécifié pour que le programme génère un message d'utilisation informatif.
Voici le code nécessaire pour implémenter le traitement en ligne de commande :
utilisation () {
echo "$NOMPROG : utilisation : $NOMPROG [-f fichier | -i]" return
}
# traiter les options de la ligne de commande interactive=
utilisation () {
echo "$NOMPROG : utilisation : $NOMPROG [-f fichier | -i]" return
}
# traiter les options de la ligne de commande interactive=
nom de fichier=
tandis que [[ -n $1 ]]; ne cas 1 $ dans
-f | --déposer)
décalage
nom de fichier=$1
;;
nom de fichier=
tandis que [[ -n $1 ]]; ne cas 1 $ dans
-f | --déposer)
-je | --interactive) interactive=1
;;
-h | --help) sortie d'utilisation
;;
*) utilisation >&2
sortie 1
;;
-je | --interactive) interactive=1
;;
-h | --help) sortie d'utilisation
;;
*) utilisation >&2
sortie 1
;;
Esac
décalage fait
Esac
décalage fait
Tout d'abord, nous ajoutons une fonction shell appelée usage pour afficher un message lorsque l'option d'aide est invoquée ou qu'une option inconnue est tentée.
Ensuite, nous commençons la boucle de traitement. Cette boucle continue tandis que le paramètre positionnel
$1 n'est pas vide. À la fin de la boucle, nous avons une commande shift pour faire avancer les paramètres de position pour s'assurer que la boucle finira par se terminer.
Dans la boucle, nous avons un maisons instruction qui examine le paramètre positionnel actuel pour voir s'il correspond à l'un des choix pris en charge. Si un paramètre pris en charge est trouvé, il est traité. Si un choix inconnu est trouvé, le message d'utilisation s'affiche et le script se termine par une erreur.
La -f paramètre est traité de manière intéressante. Lorsqu'il est détecté, il provoque un décalage se produire, ce qui fait avancer le paramètre de position $1 à l'argument de nom de fichier fourni au -f option.
Nous ajoutons ensuite le code pour implémenter le mode interactif :
# mode interactif
if [[ -n $interactif ]] ; alors tandis que vrai ; faire
read -p "Entrez le nom du fichier de sortie : " filename if [[ -e $filename ]] ; alors
read -p "'$filename' existe. Écraser? [y/n/q] > " case $REPLY in
Y|y) pause
# mode interactif
if [[ -n $interactif ]] ; alors tandis que vrai ; faire
read -p "Entrez le nom du fichier de sortie : " filename if [[ -e $filename ]] ; alors
read -p "'$filename' existe. Écraser? [y/n/q] > " case $REPLY in
Y|y) pause
;;
Q|q) echo "Programme terminé." sortir
;;
*) Continuez
;;
Esac
elif [[ -z $filename ]] ; puis continue
d'autre
pause
fi
fait
fi
;;
Q|q) echo "Programme terminé." sortir
;;
*) Continuez
;;
Esac
elif [[ -z $filename ]] ; puis continue
d'autre
pause
fi
fait
fi
Si la Interactif variable n'est pas vide, une boucle sans fin est démarrée, qui contient l'invite de nom de fichier et le code de gestion de fichier existant suivant. Si le fichier de sortie souhaité existe déjà, l'utilisateur est invité à l'écraser, à choisir un autre nom de fichier ou à quitter le programme. Si l'utilisateur choisit d'écraser un fichier existant, un pause est exécuté pour terminer la boucle. Remarquez comment le maisons L'instruction détecte uniquement si l'utilisateur choisit d'écraser ou de quitter. Tout autre choix entraîne la poursuite de la boucle et invite à nouveau l'utilisateur.
Afin d'implémenter la fonctionnalité de nom de fichier de sortie, nous devons d'abord convertir le code d'écriture de page existant en une fonction shell, pour des raisons qui deviendront claires dans un instant :
write_html_page () { chat <<- _EOF_
$ TITRE
$ TITRE
$TIMESTAMP
$(report_uptime)
$(espace_disque_rapport)
$(report_home_space)
_EOF_ retour
}
# page html de sortie
if [[ -n $filename ]] ; alors
write_html_page () { chat <<- _EOF_
$ TITRE
$ TITRE
$TIMESTAMP
$(report_uptime)
$(espace_disque_rapport)
$(report_home_space)
_EOF_ retour
}
# page html de sortie
if [[ -n $filename ]] ; alors
si vous touchez $filename && [[ -f $filename ]]; puis write_html_page > $filename
d'autre
echo "$PROGNAME : Impossible d'écrire le fichier '$filename'" >&2 exit 1
fi d'autre
écrire_html_page
fi
si vous touchez $filename && [[ -f $filename ]]; puis write_html_page > $filename
d'autre
echo "$PROGNAME : Impossible d'écrire le fichier '$filename'" >&2 exit 1
fi d'autre
écrire_html_page
fi
Le code qui gère la logique du -f apparaît à la fin de la liste ci-dessus. Dans celui-ci, nous testons l'existence d'un nom de fichier et, s'il en trouve un, un test est effectué pour voir si le fichier est bien accessible en écriture. Pour ce faire, un -nous est effectué, suivi d'un test pour déterminer si le fichier résultant est un fichier normal. Ces deux tests prennent en charge les situations où un nom de chemin invalide est entré (-nous échouera) et, si le fichier existe déjà, qu'il s'agit d'un fichier normal.
Comme nous pouvons le voir, le écrire_html_page La fonction est appelée pour effectuer la génération réelle de la page. Sa sortie est soit dirigée vers la sortie standard (si la variable nom de fichier est vide) ou redirigé vers le fichier spécifié.