Bash Les fonctions et les variables

Fermé
xunil2003 - 26 juil. 2012 à 18:07
 xunil2003 - 28 juil. 2012 à 14:40
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
26 juil. 2012 à 18:58
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
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
26 juil. 2012 à 19:24
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
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
26 juil. 2012 à 19:36
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 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 260
Modifié par Flachy Joe le 26/07/2012 à 20:06
@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
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
26 juil. 2012 à 20:20
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
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
26 juil. 2012 à 20:33
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
26 juil. 2012 à 20:35
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
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
27 juil. 2012 à 08:14
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
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