Mettre une case dans une case

xunil2003 Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   -  
xunil2003 Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Pourriez- vous me dire pourquoi la je n'arrive pas a faire marché une case dans une case ?

La 1ère case ""${date2_us}"\ 5D\ 5A\ 02\ 00\ 16* )" est lue, mais la casse ""${date2_us}"\ 5D\ 5A\ 02\ 01\ 13* )" suivante n'est pas lue.

Pourquoi ? Quelle erreur ai-je fait ?

Merci.

Script
#!/bin/bash
        
exec 6<>/dev/tcp/192.168.0.1/1099
 
while read <&6
do

date_us=$(date +%m/%d )
heure_us=$(date +%H:%M:%S)
date2_us="$date_us $heure_us"
#echo "date = ${date2_us}"

    # Show the line on standard output just for debugging.
    echo $REPLY >&1
    case $REPLY in
    

#*5D\ 5A\ 02\ 00\ 16* )
#*Rx\ PL\ House:\ E\ Func:\ "Bright(5)" )
"${date2_us}"\ 5D\ 5A\ 02\ 00\ 16* )
        echo "E1 -----> Radio reveil"

      case $REPLY in       
      
     *5D\ 5A\ 02\ 01\ 12* )
     echo "E1 On -----> Radio reveil"
     
     #----------------- FONCTION REQUETE  TABLE 1 CONFIG ----------------
     #Requete chemin du fichier ordre domotique
     sql1(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT chemin_script_bash_x10 FROM config WHERE id LIKE '0%'" 
     }
     #Requete nom du fichier de l'ordre domotique
     sql2(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT fichier_on FROM bash WHERE cmu LIKE 'e1'" 
     }
     $(sql1)$(sql2)
     ;;
     
     "${date2_us}"\ 5D\ 5A\ 02\ 01\ 13* )
     echo "E1 Off -----> Radio reveil"
     
     
     #----------------- FONCTION REQUETE  TABLE 1 CONFIG ----------------
     #Requete chemin du fichier ordre domotique
     sql1(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT chemin_script_bash_x10 FROM config WHERE id LIKE '0%'" 
     }
     #Requete nom du fichier de l'ordre domotique
     sql2(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT fichier_off FROM bash WHERE cmu LIKE 'e1'" 
     }
     $(sql1)$(sql2)
     ;;

esac
;;

*5D\ 5A\ 02\ 00\ 1E* )
        echo "E2 -----> Radio reveil"
        
      
      case $REPLY in       
      
     *5D\ 5A\ 02\ 01\ 12* )
     echo "E2 On -----> Radio reveil"
     
     #----------------- FONCTION REQUETE  TABLE 1 CONFIG ----------------
     #Requete chemin du fichier ordre domotique
     sql1(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT chemin_script_bash_x10 FROM config WHERE id LIKE '0%'" 
     }
     #Requete nom du fichier de l'ordre domotique
     sql2(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT fichier_on FROM bash WHERE cmu LIKE 'e2'" 
     }
     $(sql1)$(sql2)
     ;;
     
     *5D\ 5A\ 02\ 01\ 13* )
     echo "E2 Off -----> Radio reveil"
     
     #----------------- FONCTION REQUETE  TABLE 1 CONFIG ----------------
     #Requete chemin du fichier ordre domotique
     sql1(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT chemin_script_bash_x10 FROM config WHERE id LIKE '0%'" 
     }
     #Requete nom du fichier de l'ordre domotique
     sql2(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT fichier_off FROM bash WHERE cmu LIKE 'e2'" 
     }
     $(sql1)$(sql2)
     ;;

esac
;;




esac
done        
        
        
exit 0


Résultat du script
06/10 17:37:34 Not supported 5A
06/10 17:37:34 5D 5A 02 00 16
E1 -----> Radio reveil
06/10 17:37:35 Not supported 5A
06/10 17:37:35 5D 5A 02 01 13


La case "06/10 17:37:35 5D 5A 02 01 13" n'a pas été lue car il n'est pas affiché "E1 Off -----> Radio reveil".

Merci.

3 réponses

mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Le programme est assez dur à lire en l'état car pas très bien écrit.

- Tu pourrais éviter d'écrire à chaque fois "mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" --default-character-set=utf8 -B -N -e" en définissant une variable par exemple nommée mysql.

- Le code n'est pas très bien indenté

- Des fonctions sont définies à l'intérieur du while

- Certaines variables qui ne semblent pas modifiées dans la boucle (date_us...) devraient être initialisée en dehors de la boucle.

- Tu pourrais définir des constantes pour les séquences héxadécimales en début de programme.

Ensuite pour qu'on puisse comprendre ce qui cloche, vu qu'on ne peut pas reproduire ce qui se passe n'ayant pas la base mysql que tu utilises, il faudrait nous dire quelle instruction plante.

Par exemple supposons que ce soit une requête sql qui ne donne pas le résultat escompté, tu devrait tenter de la lancer dans mysql, vérifier qu'elle retourne ce qu'il faut, puis l'injecter dans ton script, etc. Bref il faut y aller progressivement :-)

Bonne chance
0
Utilisateur anonyme
 
salut,

Je ne suis pas du même avis. Les commandes "complexes" devraient être "stockées" dans une fonction (l'utilisation de variables peut poser des problèmes de découpage en mots).
0
Utilisateur anonyme
 
salut,

Comme l'a très justement fait remarquer mamiemando, les fonctions devraient être définies en dehors de la boucle while.

Elles sont toutes quasiment identiques, il pourrait n'y en avoir qu'une qui prendrait en argument le motif de recherche (0%, e1, e2).

De plus, certains case se servent d'exactement la même fonction.

Pourquoi les exécutes-tu dans une substitution de commandes ?
Une fois définies, les fonctions sont des commandes comme les autres.
0
xunil2003 Messages postés 765 Date d'inscription   Statut Membre Dernière intervention   14
 
Bonjour,

Merci mamiemando pour votre réponse.
C'est un problème que je n'arrive pas a expliquer
Mais j'ai une question :
Est il possible de mettre une variable dans une case ?
 
	*5D\ 5A\ 02\ 00\ 16\ )
        echo "E1 -----> Radio reveil"	
        cmu=e1
        ;;
        
        *5D\ 5A\ 02\ 01\ 12\ )
			  echo "On" # -----> Radio reveil
			  action=on
			  ;;
			  
	 *5D\ 5A\ 02\ 01\ 13\ )
			  echo "Off" # -----> Radio reveil
			  action=off
			  ;;
			 
$cmu\ $action ) 
     echo "Résultat : $cmu $action"
     echo "$cmu $action -----> Radio reveil (test)"
     action=on
     
     #------- FONCTION REQUETE  TABLE 1 CONFIG ------
     #Requete chemin du fichier ordre domotique
     sql1(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT chemin_script_bash_x10 FROM config WHERE id LIKE '0%'" 
     }
     #Requete nom du fichier de l'ordre domotique
     sql2(){
     mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
     --default-character-set=utf8 -B -N -e "SELECT fichier_$action FROM bash WHERE cmu LIKE '$cmu'" 
     }
     $(sql1)$(sql2)
     ;;


Résultat
E1 -----> Radio reveil
Off


Merci.
0