Depuis le temps que je l’avais initié :
[code]#!/bin/bash
nomScript="${0##*/}"
function gestHelp
{
e=$1
shift
cat >&2 <<HELP
$@
Usage : ${nomScript} -f fichier [-c|-s email [-a alias[,…]]| -m email -a old -n new]
-f : fichier à traiter
-c, -s : Création ou suppression d’une adresse mail.
Si l’option -a est utilisée avec l’instruction -c, les alias sont ajoutés. L’adresse mail est créée si inexistante.
Si l’option -a est utilisée avec l’instruction -s, seuls les alias spécifiés sont supprimés.
-m : l’alias est remplacé par pour l’adresse email donnée.
HELP
exit $e
}
function erreur
{
e=$1
shift
echo >&2 "Erreur : $@"
exit $e
}
function action_c
{
trouve=false
while read
do
set – ${REPLY}
email=$1
shift
if [[ ${email} == ${_email} ]]
then
trouve=true
for unAlias in "${_alias[@]}"
do
[[ $@ == ${unAlias} ]] || set – $@ ${unAlias}
done
echo "${_email} " "$@"
else
echo "${REPLY}"
fi
done
${trouve} || echo "${_email} " ${_alias[@]}
:
}
function action_m
{
while read
do
set – ${REPLY}
email=$1
shift
if [[ ${email} == ${_email} ]] && [[ $@ != ${_nalias} ]]
then
infos=( $@ )
for idx in ${!infos[@]}
do
[[ ${infos[idx]} == ${_alias} ]] && infos[idx]=${_nalias}
done
echo "${_email} " ${infos[@]}
else
echo "${REPLY}"
fi
done
:
}
function action_s
{
while read
do
set – ${REPLY}
email=$1
shift
if [[ ${email} == ${_email} ]]
then
sesAlias=
[[ ${_alias[@]} ]] && for ele
do
[[ ${_alias[@]} == ${ele} ]] || sesAlias+=( ${ele} )
done
[[ ${sesAlias[@]} ]] && echo "${email} " ${sesAlias[@]}
else
echo "${REPLY}"
fi
done
:
}
tmpFile="${TMPDIR:-/tmp}/$$${nomScript}"
_email=
_alias=
_nalias=
_fichier=
_action=
while getopts :f:c:m:s:a:n: option
do
case $option in
"?") gestHelp 1 “Option non valide : -${OPTARG}”;;
":") gestHelp 1 “Argument manquant pour l’option -${OPTARG}”;;
f) _fichier="${OPTARG}";;
c|s|m) _action+=${option}
_email=${OPTARG};;
a) _alias=( ${OPTARG//,/ } );;
n) _nalias="${OPTARG}";;
esac
done
[[ ${_fichier} ]] || gestHelp 2 “Je ne sais pas dans quel fichier écrire !”
[[ -f “${_fichier}” ]] || gestHelp 2 "Fichier non trouvé : " “${_fichier}”
[[ ${_action} ]] || gestHelp 2 “Je ne sais pas quelle action réaliser !”
[[ ${#_action} == 1 ]] || gestHelp 2 “Je ne sais pas traiter plusieurs actions en même temps !”
[[ ${_action} = m ]] && {
(( ${#_alias[@]} == 0 )) && gestHelp 2 “Quel alias dois-je modifier ?”
(( ${#_alias[@]} > 1 )) && gestHelp 2 “Je ne sais modifier qu’un seul alias à la fois !”
[[ ${_nalias} ]] || gestHelp 2 “Dois-je deviner la nouvelle valeur de l’alias ?”
}
touch “${_tmpFile}” &>/dev/null || erreur 3 “Impossible de créer le fichier temporaire.”
(
shopt -s nocasematch
rm "${_tmpFile}"
exec > “${_tmpFile}” < "${fichier}"
eval action${_action}
) && [ -f “${_tmpFile}” ] && mv “${_tmpFile}” “${_fichier}”[/code]
note : je n’ai volontairement pas mis de commentaire ni utilisé sed/awk …