Bash Les fonctions et les variables

xunil2003 -  
 xunil2003 -
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.

A voir également:

9 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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
xunil2003
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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
xunil2003
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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
Flachy Joe Messages postés 2102 Date d'inscription   Statut Membre Dernière intervention   261
 
@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
xunil2003
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xunil2003
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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
Utilisateur anonyme
 
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
xunil2003
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
xunil2003
 
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