Bash Les fonctions et les variables

Bonjour,

J'ai deux questions.

J'ai deux fonctions
sql5(){
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
  --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'" 
        }

sql2(){
mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
  --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'" 
        }


1/ Comment fait on pour afficher deux fonctions sur la même ligne.
 sql5 sql2
seul sql5 s'affiche ?

2/comment fait on pour mettre en variable le résultat d'une fonction.

execution2="sql5"
execution3="sql2"
echo $execution2, $execution3
cela m'affiche sql5 sql2 la c'est normal, mais je n'arrive pas a trouver la bonne formule.

Merci.

9 réponses

  1. Contributeur
    Salut,

    1/ Comment fait on pour afficher deux fonctions sur la même ligne.

     sql5; sql2

    2/comment fait on pour mettre en variable le résultat d'une fonction.
    execution2="$(sql5)"
    execution3="$(sql2)"
    0
    1. Bonjour,

      merci de votre réponse.

      Pour la question 1: quand je fait
      sql5; sql2


      il s'affiche dans le terminal
      aplay
       /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav


      Alors qu'il les faut sur la même ligne comme ceci
      aplay /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav
      sinon le programme ne s'execute pas pour la lecture du son.

      Pour la question 2 : ca marche
      execution2="$(sql5)"
      execution3="$(sql2)"
      $execution2 $execution3 

      Terminal
      Playing WAVE '/home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
      serveur@debian:~$ 


      La lecture du son est effectué comme ceci
      aplay /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav


      Merci.
      0
      1. Contributeur
        Attend.... tu veux dire que le résultat de ta fonction "sql15" c'est la commande "aplay" ?

        Dans ton exemple la fonction sql15 est la même que "sql12", non ?
        0
    2. Bonjour,

      Non,

      sql15 ---> aplay
      sql12 ---> /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav

      mais quand je fait
      sql5; sql2


      Le terminal ne comprend pas, il affiche
      aplay
       /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav


      Alors qu'il les faut sur la même ligne comme ceci
      aplay /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav


      Merci.
      0
      1. Contributeur
        A quoi ressemble ta fonction sql15 ?

        Il faut lui donner un paramètre si tu veux que ça marche :

        sql15(){
        aplay $1
        }
        
        sql5 sql2
        0
      2. @zipe31 : je pense que le nom de la commande à lancer est contenu dans la base de donnée...

        @xunil2003 : la syntaxe utilisée à l'origine devrait fonctionner, tu n'as pas un problème de guillemets ?
        exemple/test :
        t1="echo"  
        t2="blabla"  
        $t1 $t2  
        

        Ça affiche bien blabla.

        EDIT ah oui, tu le disait aussi en fait... C'est avec les fonctions que ça marche pas.
        Je pense que tu n'as pas le choix et qu'il faut passer par des variables, car là sql2 est considéré comme un argument pour sql5.
        0
    3. Bonjour,

      Les fonction ressemble à ceci :

      sql5(){
      mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
      --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'"
      }
      sql2(){
      mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
      --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'"
      }

      t1="echo" 
      t2="blabla" 
      $t1 $t2

      Oui il affiche bien "blabla"

      Merci.
      0
      1. Contributeur
        Essaies comme ça :

        sql5(){
        $(mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
        --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'")
        }
        sql2(){
        mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
        --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'"
        } 

        Puis :
        sql15 sql12
        0
    4. Bonjour,

      Avec ceci

      sql5(){ 
      $(mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \ 
      --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'") 
      } 
      sql2(){ 
      mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \ 
      --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'" 
      }  
      
      Puis :  
      sql15 sql12


      Le terminal bloc
      ^CAborted by signal Interrompre...
      
      serveur@debian:~$ 
      0
      1. Contributeur
        Oups j'ai oublié le paramètre ;-(((

        sql5(){
        $(mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
        --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'") $1
        }
        {
        0
    5. salut,

      $(sql15) $(sql12)


      mais t'as combien de commandes ?
      t'es sûr qu'utiliser une base de données sql, plutôt que quelques fichiers plats, est une bonne idée ?
      moi, ça me paraît lourd.
      0
      1. Bonjour,

        Avec
        sql5(){
        $(mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
        --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes5 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'")
        }
        sql2(){
        $(mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \
        --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2 FROM $nom_table WHERE $colonne_recherche LIKE '$recherche%'")
        } 


        c'est pareil le terminal bloc
        ^CAborted by signal Interrompre...
        
        serveur@debian:~$ 


        Merci.
        0
        1. Contributeur
          hello
          $ sql5() { aplay $* ; }
          $ sql2() { echo "/home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav" ; }
          $ 
          $ sql5 $(sql2)
          /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav: No such file or directory
          $ 
          
          0
          1. bonjour,

            Ce n'est pas bon car l'utilisateur doit pouvoir choisir le lecteur audio (En fonction des Os aplay n'est pas disponible) qui veut utiliser.
            $ sql5() { aplay $* ; }      
            $ sql2() { echo "/home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav" ; }      
            $       
            $ sql5 $(sql2)      
            /home/serveur/Domotique/x10/son-confirmation/wav/appel-urgence-on.wav: No such file or directory      
            $ 


            Par contre j'ai trouvé une solution , je fait comme ceci.
            Je ne sais pas si il est possible de faire une jointure des 3 tables afin de faire une seule fonction, afin de réduire les lignes de code ?
            Pour le fichier log je demande si c'est pas mieux d'écrire dans une table mysql que dans un fichier txt, surtout pour l'affichage du rapport (fichier log) afin d'eviter le traitement ligne par ligne mot par mot pour les colonnes (mise en tableau d'un fichier txt) ?

            Merci.


            #!/bin/bash      
            hote_db="localhost"      
            nom_bd="domotique"      
            login_db="xxxx"      
            pass_bd="xxxxxx"      
            
            #----------------- TABLE1 BASH -----------------      
            format_texte="utf8"      
            #select_noms_colonnes="id,cmu,ordre_on,fichier_on,macro_on,ordre_off,fichier_off,macro_off,ordre_dim,fichier_dim,macro_dim,ordre_bri,fichier_bri,macro_bri"     
            
            nom_table1="bash"      
            colonne_recherche1="cmu"      
            
            #select_noms_colonnes1="prog"      
            select_noms_colonnes1_1="ordre_on"      
            select_noms_colonnes1_2="fichier_on"      
            select_noms_colonnes1_3="macro_on"      
            recherche1="A4"      
            
            sql1(){      
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \      
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes1_1 FROM $nom_table1 WHERE $colonne_recherche1 LIKE '$recherche1%'"       
                    }      
            
            
            sql2(){      
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \      
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes1_2 FROM $nom_table1 WHERE $colonne_recherche1 LIKE '$recherche1%'"       
                    }      
            
            sql3(){      
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \      
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes1_3 FROM $nom_table1 WHERE $colonne_recherche1 LIKE '$recherche1%'"       
                    }      
            
            #--------------- TABLE2 CONFIG ----------------      
            
            format_texte="utf8"      
            #select_noms_colonnes="id,lecteur_audio, chemin_audio_bash, chemin_audio_web"   
            
            nom_table2="config"      
            colonne_recherche2="id"      
            recherche2="0"      
            select_noms_colonnes2_1="lecteur_audio"      
            select_noms_colonnes2_2="chemin_audio_bash"      
            
            
            sql4(){      
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \      
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2_1 FROM $nom_table2 WHERE $colonne_recherche2 LIKE '$recherche2%'"       
                    }      
            
            sql5(){      
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \      
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes2_2 FROM $nom_table2 WHERE $colonne_recherche2 LIKE '$recherche2%'"       
                    }      
            
            
            #--------------- TABLE3 SON ----------------      
            
            format_texte="utf8"      
            #select_noms_colonnes="id, cmu, son_on, son_off, son_dim, son_bri"     
            
            nom_table3="son"      
            colonne_recherche3="cmu"      
            recherche3="A4"      
            
            select_noms_colonnes3_1="son_on"      
            select_noms_colonnes3_2="son_off"      
            select_noms_colonnes3_3="son_dim"      
            select_noms_colonnes3_4="son_bri"      
            
            
            sql6(){      
            mysql -h "$hote_db" -D "$nom_bd" -u "$login_db" -p"$pass_bd" \      
              --default-character-set=$format_texte -B -N -e "SELECT $select_noms_colonnes3_1 FROM $nom_table3 WHERE $colonne_recherche3 LIKE '$recherche3%'"       
                    }      
            
            
            case "$PROGRAMME" in      
            Asterisk) programme="Asterisk" ;;      
            Crontab) programme="Crontab" ;;      
            php) programme="PHP" ;;      
            "") programme="Script bash" ;;      
            esac      
            
            utilisateur=$(whoami)      
            date1=$(date +'%Y-%m') # date fr mois annee pour création du fichier log      
            date2=$(date +'%d/%m/%Y') # date fr jour mois annee      
            heure=$(date +%H:%M:%S) # heure Fr H M S      
            #date3=$(date + '%d-%m-%Y - %H:%M:%S') # date et heure Fr jour mois annee - H M S      
            
            ordre_domotique="$(sql1)"      
            fichier="$(sql2)"      
            macro="$(sql3)"      
            lecteur="$(sql4)"      
            chemin_audio_bash="$(sql5)"      
            nom_fichier_audio="$(sql6)"      
            
            #----- Execute l'ordre domotique ------      
            $ordre_domotique      
            
            #----- Ecriture dans le fichier log ------      
            echo "$date2 - $heure - $utilisateur - $ordre_domotique - $fichier - $macro - $programme" >> /home/serveur/Domotique/rapports/ordres/$date1-rapport-ordres.log      
            
            #----- Execute le son de confirmation de l'ordre domotique ------      
            $lecteur $chemin_audio_bash$nom_fichier_audio       
            


            Table1 - bash
            id  cmu  ordre_on  fichier_on  macro_on  ordre_off  fichier_off  macro_off  ordre_dim  fichier_dim  macro_dim  ordre_bri  fichier_bri  macro_bri


            Table2 - config
            id  lecteur_audio  chemin_audio_bash  chemin_audio_web


            Table3 - son
            id  cmu  son_on  son_off  son_dim  son_bri


            Table - log
            id  date  heure  user  ordre_x10  fichier  macro  execute_par   
            0  27-07-2012  00:39:27  serveur  cm15 A4 On  a4-on  aucun macro  Asterisk   
            1  27-07-2012  00:40:51  root  cm15 A4 On  a4-on  aucun macro  script bash


            Merci.
            0