#1 Le 09/12/2022, à 11:35
- azer2010
[résolu] Problème bash: factorise fonctions erreur!
Bonjour à tous,
Voici une erreur que j'ai rencontré avec un script bash en voulant factorisée mes bloc de code,
afin de les rendrent plus lisible et plus organiser.
1) avant d'avoir stocké mes lignes de code dans ma fonction_1 et ma fonction_2, le script fonctionne très bien.
explication: -fonction_1: l'interaction avec l'utilisateur si aucun arguments est appeler.
-fonction_2: en ligne de commande avec des arguments.
**voici le script non factorisé avec les deux fonctions.**
*****************************************************************
#!/bin/bash
# @FILE: testMENU.sh
printf "%s\n\n""choisir un chiffre du menu entre 0-2 ou [Q] pour quitter"
if [ $@ -eq 0 ];then
while true;do # Exécution tant que l'utilisateur selectionne pas [Q].
read -n 1 -s CHOIX; echo;
case ${CHOIX} in # (fonction_1) sans arguments.
0) printf "toutes les commandes exécutées\n"
;;
1) printf " commandes 1 exécutée\n"
;;
2) printf " commandes 2 exécutée\n"
;;
q|Q) printf " Quitte le programme\n"
;;
*) printf " erreur : saisir un chiffre entre 0 et 2"
;;
esac #fin fonction_1
done # fin de la boucle while
else
case $@ in # (fonction_2) avec arguments.
--0) printf "toutes les commandes exécutées\n"
;;
--1) printf " commandes 1 exécutée\n"
;;
--2) printf " commandes 2 exécutée\n"
;;
q|Q) printf " Quitte le programme\n"
;;
*) print "erreur : saisir un argument\n"
;;
esac # fin fonction_2
fi ## fin boucle test.
donc voici le script qui fonctionne correctement si dessus.
2) je factorisé mes boucles case en function: «fonction_1» & «fonction_2» puis quand je lance le script, la fonction_1 fonctionne
alors que la fonction_2 ne reconnait pas mes arguments indiquer en ligne de commande et me retourne "erreur : saisir un argument".
J'ai essayé avec de simple '' et double " " sur $@ mais le problème est le même donc ou serait mon erreur Mon Charlinux ou Ma Charlinux .
**Voici le script factorisé qui pose problème:**
*******************************************************
#!/bin/bash
# @FILE: testMENU.sh
printf "%s\n\n""choisir un chiffre du menu entre 0-2 ou [Q] pour quitter"
_Fonction_1 ()
{
while true;do # Exécution tant que l'utilisateur selectionne pas [Q].
read -n 1 -s CHOIX; echo;
case ${CHOIX} in # (fonction_1) sans arguments.
0) printf "toutes les commandes exécutées\n"
;;
1) printf " commandes 1 exécutée\n"
;;
2) printf " commandes 2 exécutée\n"
;;
q|Q) printf " Quitte le programme\n"
;;
*) printf " erreur : saisir un chiffre entre 0 et 2"
;;
esac #fin fonction_1
done # fin de la boucle while
}
_Fonction_2 ()
{
case $@ in # (fonction_2) avec arguments.
--0) printf "toutes les commandes exécutées\n"
;;
--1) printf " commandes 1 exécutée\n"
;;
--2) printf " commandes 2 exécutée\n"
;;
q|Q) printf " Quitte le programme\n"
;;
*) print "erreur : saisir un argument\n"
;;
esac # fin fonction_2
}
if [ $@ -eq 0 ];then
else
fi ## fin boucle test.
Merci d'avance de vos retour journée bonne à tous et à toute....
Dernière modification par azer2010 (Le 22/12/2022, à 18:02)
Hors ligne
#2 Le 09/12/2022, à 14:10
- Tawal
Re : [résolu] Problème bash: factorise fonctions erreur!
Hello,
Le principe d'une fonction est d'éviter de recopier plusieurs fois le même code dans un script.
Ensuite, une fonction s'appelle (se lance) comme une commande.
Pas d'appel de la fonction, pas d'exécution du code de la fonction.
Dans ton cas, il manque les appels aux fonctions.
De plus, je ne vois pas l'intérêt ici de ces fonctions. Elle ne seront appelées qu'à un seul endroit du script, autant y laisser le code.
Sinon, pour faire fonctionner ton 2ième script comme le 1er, ajoute à la fin du script la structure de test des arguments passés au script et appelle tes fonctions dans cette structure.
Du genre :
if [ $@ -eq 0 ]
then
fonction_1
else
fonction_2 "$@"
fi
Dernière modification par Tawal (Le 09/12/2022, à 14:10)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#3 Le 09/12/2022, à 14:50
- pingouinux
Re : [résolu] Problème bash: factorise fonctions erreur!
Bonjour,
Pour tester la présence d'arguments, c'est :
if [ $# -eq 0 ]
then
............
$# est le nombre d'arguments du script ou de la fonction.
Hors ligne
#4 Le 09/12/2022, à 18:08
- Tawal
Re : [résolu] Problème bash: factorise fonctions erreur!
Oui bien vu j'ai bêtement recopié
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 10/12/2022, à 11:35
- azer2010
Re : [résolu] Problème bash: factorise fonctions erreur!
bonjour Tawal et pingouinux,
tawal très explicite ton retour qui à enrichi mon script de son erreur et ma culture de bashiste je n'ai plus qu'ajouté un [RESOLU] et pingouinux merci de ton partage avec ta condition de test, (autres paramètres positionnel : $?, $0, $*, et si tu a plus de 9 ARGS à ajoutés: ${10}, ${11} etc...) info si le post peut aider d'autres personnes.
bonne journée.
Hors ligne