Mettre une case dans une case

Fermé
xunil2003 Messages postés 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 - Modifié par mamiemando le 11/06/2013 à 10:20
xunil2003 Messages postés 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 - 11 juin 2013 à 14:54
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 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
11 juin 2013 à 10:27
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
11 juin 2013 à 12:50
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
11 juin 2013 à 13:03
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 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 14
Modifié par xunil2003 le 11/06/2013 à 15:01
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