Ce n’est pas normal qu’un tail -n5 règle le problème 
Il y a donc un problème caché non résolu. Tu peux tenter de le débusquer en remettant la version qui ne marche pas, et en remplaçant
if modem_pret_pour_pppd; then
ppp-on
exit $?
fi
par
if modem_pret_pour_pppd; then
dmesg | tail
ppp-on
exit $?
fi
Normalement si la fonction modem_pret_pour_pppd renvoie vrai, c’est qu’il y a la bonne ligne dans le dmesg 
J’ai une idée d’où peut provenir le problème : peut être que cette ligne ([ueagle-atm] modem operational) apparaît vers le début de ton dmesg. Peut-être que le modem est rendu fonctionnel au lancement de l’ordinateur. Du coup la fonction modem_pret_pour_pppd renvoie toujours vrai. Si c’est bien ça le problème, une solution correcte pour le contourner est de calculer la taille (en nombre de lignes) du dmesg au moment du lancement du script, puis d’ignorer ensuite ces premières lignes dans la fonction modem_pret_pour_pppd avec un tail. Voici le code complet que je propose (qui utilise des variables globales, normalement il faut toujours l’éviter, mais il est tard …) :
[code]#!/bin/sh
#script pour reset du modem usb CT350 ID 1110:900f
#variables globales : TAILLE_DMESG_INITIALE et NUMERO_PREMIERE_LIGNE_NOUVELLE_DU_DMESG
TAILLE_DMESG_INITIALE="$(dmesg | wc -l)"
NUMERO_PREMIERE_LIGNE_NOUVELLE_DU_DMESG="$(expr “${TAILLE_DMESG_INITIALE}” + 1)"
modem_debranche() {
! lsusb | grep -qF ‘1110:900f’
}
est_le_bon_port() {
nom_port="${1}"
[ -f “${nom_port}/idVendor” ] &&
[ -f “${nom_port}/idProduct” ] &&
[ “$(cat “${nom_port}/idVendor”)” = 1110 ] &&
[ “$(cat “${nom_port}/idProduct”)” = 900f ]
}
reset_port() {
nom_port="$1"
echo 0 > “${nom_port}/authorized”
echo 1 > “${nom_port}/authorized”
}
modem_pret_pour_pppd() {
dmesg | tail -n +"${NUMERO_PREMIERE_LIGNE_NOUVELLE_DU_DMESG}" | grep -qF ‘[ueagle-atm] modem operational’
}
if modem_debranche; then
exit 0
fi
for port in /sys/bus/usb/devices/* ; do
if est_le_bon_port “${port}”; then
reset_port “${port}”
fi
done
i=1
while [ “${i}” -le 60 ]; do
sleep 1
if modem_pret_pour_pppd; then
ppp-on
exit $?
fi
i="$(expr “${i}” + 1)"
done
echo “erreur le modem n est toujours pas operationel au bout d une minute”
exit 1
[/code]
Pour les fonctions, la syntaxe “normale” c’est celle que j’utilise. Je me réfère à la spécification du shell POSIX publiée par l’opengroup.
Le mot-clé function est spécifique au shell BASH. D’après la spécification de BASH publiée par GNU, ce mot-clé est optionnel en BASH.
Vu que tu as l’air de découvrir les fonctions en shell, je voudrais souligner deux points :
-
si tu modifies une variable dans le corps de la fonction (par exemple la variable i), alors cette variable est modifiée partout, même en dehors de la fonction (et ça peut mettre le bazar si la variable i est utilisée en dehors de la fonction, par exemple pour contrôler une boucle while)
-
lorsque tu appelles une fonction en lui passant des arguments (3 arguments par exemple), tu peux accéder à la valeur des arguments dans le corps de la fonction grâce aux variables spéciales $1, $2 et $3.